Skip to content

Commit fa1416b

Browse files
committed
Improve the behavior of service app launching by host app
1 parent 6265da8 commit fa1416b

File tree

4 files changed

+24
-10
lines changed

4 files changed

+24
-10
lines changed

CommunicationBridge/ServiceDelegate.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,8 @@ actor EventHandler {
6969
reply(endpoint)
7070
} else {
7171
endpoint = nil
72-
reply(nil)
7372
await launcher.launch()
73+
reply(nil)
7474
}
7575
#endif
7676
}

Core/Sources/HostApp/General.swift

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -65,13 +65,20 @@ struct General: ReducerProtocol {
6565
return .run { send in
6666
let service = try getService()
6767
do {
68-
let xpcServiceVersion = try await service.getXPCServiceVersion().version
69-
let isAccessibilityPermissionGranted = try await service
70-
.getXPCServiceAccessibilityPermission()
71-
await send(.finishReloading(
72-
xpcServiceVersion: xpcServiceVersion,
73-
permissionGranted: isAccessibilityPermissionGranted
74-
))
68+
let isCommunicationReady = try await service.launchIfNeeded()
69+
if isCommunicationReady {
70+
let xpcServiceVersion = try await service.getXPCServiceVersion().version
71+
let isAccessibilityPermissionGranted = try await service
72+
.getXPCServiceAccessibilityPermission()
73+
await send(.finishReloading(
74+
xpcServiceVersion: xpcServiceVersion,
75+
permissionGranted: isAccessibilityPermissionGranted
76+
))
77+
} else {
78+
toast("Launching service app.", .info)
79+
try await Task.sleep(nanoseconds: 3_000_000_000)
80+
await send(.reloadStatus)
81+
}
7582
} catch {
7683
toast(error.localizedDescription, .error)
7784
await send(.failedReloading)

Tool/Sources/XPCShared/XPCCommunicationBridge.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ public class XPCCommunicationBridge {
3939
service.delegate = delegate
4040
}
4141

42+
@discardableResult
4243
public func launchExtensionServiceIfNeeded() async throws -> NSXPCListenerEndpoint? {
4344
try await withXPCServiceConnected { service, continuation in
4445
service.launchExtensionServiceIfNeeded { endpoint in

Tool/Sources/XPCShared/XPCExtensionService.swift

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,18 @@ public class XPCExtensionService {
2525
let logger: Logger
2626
let bridge: XPCCommunicationBridge
2727

28-
nonisolated
29-
public init(logger: Logger) {
28+
public nonisolated
29+
init(logger: Logger) {
3030
self.logger = logger
3131
bridge = XPCCommunicationBridge(logger: logger)
3232
}
3333

34+
/// Launches the extension service if it's not running, returns true if the service has finished
35+
/// launching and the communication becomes available.
36+
public func launchIfNeeded() async throws -> Bool {
37+
try await bridge.launchExtensionServiceIfNeeded() != nil
38+
}
39+
3440
public func getXPCServiceVersion() async throws -> (version: String, build: String) {
3541
try await withXPCServiceConnected {
3642
service, continuation in

0 commit comments

Comments
 (0)