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 с намерением и вашим ответом к объекту пользовательской активности перед его доставкой. Ваше приложение должно использовать информацию в объекте активности пользователя, чтобы начать тренировку.

Другие вопросы по тегам