Siri всегда отвечает "Продолжить в приложении" при запуске тренировки с SiriKit.
Я работал над SiriKit
намерение расширения для нашего приложения. Мы используем тип расширения тренировки. Проблема в том, что я просто вставляю нужные методы и всегда передаю .ready
но Сири всегда отвечает,
Извините, вам придется продолжить в приложении.
Я пробовал и другие ответы (.failure
а также .unspecified
), но она все еще говорит, чтобы продолжить в приложении. Я следовал документации, предоставленной Apple, чтобы настроить мой .plist
файлы, но это все еще может быть что-то связанное с этим.
Вот мой код Intents:
class IntentHandler: INExtension, INStartWorkoutIntentHandling, INPauseWorkoutIntentHandling, INResumeWorkoutIntentHandling, INCancelWorkoutIntentHandling, INEndWorkoutIntentHandling {
override func handler(for intent: INIntent) -> Any {
// This is the default implementation. If you want different objects to handle different intents,
// you can override this and return the handler you want for that particular intent.
return self
}
func handle(startWorkout intent: INStartWorkoutIntent, completion: @escaping (INStartWorkoutIntentResponse) -> Void) {
print("Starting Service")
let activity = NSUserActivity(activityType: "start_service")
let result = INStartWorkoutIntentResponse(code: .ready, userActivity: activity)
completion(result)
}
func handle(endWorkout intent: INEndWorkoutIntent, completion: @escaping (INEndWorkoutIntentResponse) -> Void) {
print("Ending Service")
let result = INEndWorkoutIntentResponse(code: .ready, userActivity: nil)
completion(result)
}
func handle(pauseWorkout intent: INPauseWorkoutIntent, completion: @escaping (INPauseWorkoutIntentResponse) -> Void) {
print("Pausing Service")
let result = INPauseWorkoutIntentResponse(code: .ready, userActivity: nil)
completion(result)
}
func handle(cancelWorkout intent: INCancelWorkoutIntent, completion: @escaping (INCancelWorkoutIntentResponse) -> Void) {
print("Cancel Service")
let result = INCancelWorkoutIntentResponse(code: .ready, userActivity: nil)
completion(result)
}
func handle(resumeWorkout intent: INResumeWorkoutIntent, completion: @escaping (INResumeWorkoutIntentResponse) -> Void) {
print("Resume Service")
let result = INResumeWorkoutIntentResponse(code: .ready, userActivity: nil)
completion(result)
}
}
Я пробовал точку останова, где обрабатывается намерение начала тренировки, и оно действительно срабатывает. Я тоже пробовал проходить .ready
на INMessageIntent и Сири ответил, не говоря, открыть в приложении. Мне интересно, если это всегда так для расширений тренировки. Если это так, я бы хотел, чтобы Сири показала мой IntentsUI.
Спасибо за ответы.
1 ответ
Когда вы будете готовы начать тренировку в своем приложении, вам нужно вызвать обработчик завершения с .continueInApp
Так что это будет что-то вроде:
public func handle(startWorkout intent: INStartWorkoutIntent, completion: @escaping (INStartWorkoutIntentResponse) -> Swift.Void) {
let userActivity = NSUserActivity(activityType: NSStringFromClass(INStartWorkoutIntent.self))
let response = INStartWorkoutIntentResponse(code: .continueInApp, userActivity: userActivity)
completion(response)
}
Смотрите документацию:
Ваше расширение готово передать управление приложению, чтобы можно было начать тренировку. После возврата этого кода SiriKit запускает ваше приложение и передает ему объект NSUserActivity, который вы указали во время инициализации. (Если вы не предоставили объект пользовательской активности, SiriKit создаст его для вас.) SiriKit добавляет объект INInteraction с намерением и вашим ответом к объекту пользовательской активности перед его доставкой. Ваше приложение должно использовать информацию в объекте активности пользователя, чтобы начать тренировку.