I am trying to integrate Siri WorkOut intent to my app.I am struck with strange error.
class StartWorkOutRequestHandling : NSObject, INStartWorkoutIntentHandling {
func handle(startWorkout intent: INStartWorkoutIntent, completion: @escaping (INStartWorkoutIntentResponse) -> Void) {
if let _ = intent.workoutName {
if #available(iOSApplicationExtension 11.0, *) {
let userActivity = NSUserActivity(activityType: "test")
let response = INStartWorkoutIntentResponse(code: .handleInApp, userActivity: userActivity)
completion(response);
}
else {
// Fallback on earlier versions
let userActivity = NSUserActivity(activityType: "test")
let response = INStartWorkoutIntentResponse(code: .continueInApp, userActivity: userActivity)
completion(response)
}
}
else {
let response = INStartWorkoutIntentResponse(code: .failureNoMatchingWorkout, userActivity: .none)
completion(response);
}
}
}
As you can see in handle(startWorkout
am checking whether the iOS version is 11 or greater if yes I use handleInApp
response code if not I use continueInApp
. This is because
Definition of public enum INStartWorkoutIntentResponseCode : Int {
says
@available(iOS, introduced: 10.0, deprecated: 11.0, message: "INStartWorkoutIntentResponseCodeContinueInApp is deprecated on iOS. Please use INStartWorkoutIntentResponseCodeHandleInApp instead") case continueInApp
I understand .handleInApp
opens the app in background where as continueInApp
opens the app.
But when I use handleInApp
and say "Start workout with My AppName" to Siri, Siri Says
"Sorry,You'll need to continue in the app"
and provides a Open MyApp button. On the other hand if I use simply
func handle(startWorkout intent: INStartWorkoutIntent, completion: @escaping (INStartWorkoutIntentResponse) -> Void) {
if let _ = intent.workoutName {
let userActivity = NSUserActivity(activityType: "test")
let response = INStartWorkoutIntentResponse(code: .continueInApp, userActivity: userActivity)
completion(response);
}
else {
let response = INStartWorkoutIntentResponse(code: .failureNoMatchingWorkout, userActivity: .none)
completion(response);
}
}
Ignoring the warnings Siri opens the App as expected. Whats worth noting though is in both the case
- (BOOL)application:(UIApplication *)application
continueUserActivity:(NSUserActivity *)userActivity
restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler {
//this is a legacy app hence part of code is still in Objective-C
}
app delegates method gets called properly.
Though I found a similar question here
Siri always responds 'Continue in the app' when starting workout with SiriKit
but it uses deprecated continueInApp. So cant use it in iOS 11.
What am I making a mistake here? Why using handleInApp
won't open the app and why Siri complains that I need to continue in App! How to open the app using handleInApp
.
If I am not supposed to open App from Siri while using Workout intent, I believe there is no way to trigger IntentUI
also for Workout intent.
Refer: SiriKit, How to display response for start Workout Intent?
Please help.