问题
I want to use SiriKit to start a workout. Starting the workout requires opening the main app from the app extension.
The boilerplate that Apple provides for the INStartWorkoutIntentHandling
handler is
func handle(startWorkout startWorkoutIntent: INStartWorkoutIntent, completion: (INStartWorkoutIntentResponse) -> Void) {
let userActivity = NSUserActivity(activityType: NSStringFromClass(INStartWorkoutIntent))
let response = INStartWorkoutIntentResponse(code: .success, userActivity: userActivity)
completion(response)
}
How can I open my own app from here? Something like myapp://workout?action=start&name=pushups
This answer doesn't seem relevant, as I don't have a UIViewController
with a extensionContext
property for this extension type.
Last related bit: For the other actions (pause, end) I’d prefer to not open the main app, but to simply pause the workout which is running in the main app. I could use a similar custom URL to pause it, but that would open up the app which is an extra unnecessary step. Any good way to tell the main app to take a specific action from the INExtension without opening the app?
回答1:
For posterity: turns out this was a phase-in of this functionality between Xcode 8 betas, it's been resolved in Xcode 8 beta 3. They added the .continueInApp
code to INStartWorkoutIntentResponseCode
in this version , but it wasn't there in Xcode 8 beta 2. This status code allows for the direct passing of NSUserActivity (no need to use a URL scheme).
回答2:
For me I was able to launch app like so:
let activity = NSUserActivity(activityType: NSUserActivityTypeBrowsingWeb)
activity.webpageURL = URL(string: "https://mywebsite/...")
completion(MyIntentResponse(code: .continueInApp, userActivity: activity))
Then this will get called in the AppDelegate
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
if userActivity.activityType == NSUserActivityTypeBrowsingWeb {
if let url = userActivity.webpageURL {
handleDeeplink(url)
}
}
return false
}
来源:https://stackoverflow.com/questions/38537721/launch-app-from-inextension-in-sirikit