Siri Shortcut INPlayMediaIntent перестает играть через 2 минуты - PullRequest
0 голосов
/ 02 октября 2018

Я интегрирую наше приложение музыкальных сервисов с новой функцией ярлыков и застрял со странным поведением расширения SiriKit.Моя реализация INPlayMediaIntentHandling загружает музыкальные треки и начинает воспроизводить их с помощью AVPlayer, но расширение завершается с кодом 0 через 120 секунд при каждом запуске (консоль Xcode сообщает: «Программа завершилась с кодом выхода: 0»).Я попытался выполнить поиск, но документация Apple по этой теме пуста, и у сессии WWDC 2018 года есть только краткая информация для этого намерения.

На GitHub есть пример - https://github.com/beryu/SiriShortcutsSample, но он использует образцы Apple Music 30 секунд,Я пытался использовать его с длинным потоком mp3, но он работает как мое приложение и останавливается через 2 минуты.

Кто-нибудь успешно реализовал INPPlayMediaIntent?

Код IntentHandler

class IntentHandler: INExtension, INPlayMediaIntentHandling {

private var intentCompletion: Any?

@available(iOSApplicationExtension 12.0, *)
func handle(intent: INPlayMediaIntent, completion: @escaping (INPlayMediaIntentResponse) -> Void) {

    intentCompletion = completion
    switch intent.mediaContainer?.identifier {
    case ShortcutsMeta.FavouritesIdentifier: startFavourites()

    default: complete(.success);
    }
}

@available(iOSApplicationExtension 12.0, *)
private func complete(_ resultCode: INPlayMediaIntentResponseCode) {
    let userActivity = NSUserActivity(activityType: NSStringFromClass(INPlayMediaIntent.self))
    let response = INPlayMediaIntentResponse(code: resultCode, userActivity: userActivity)
    (intentCompletion as? ((INPlayMediaIntentResponse) -> Void))?(response)
    intentCompletion = nil
}

override func handler(for intent: INIntent) -> Any {
    return self
}

private func startFavourites() {
    let command = IntentCommand(type: .favourites)
    // this code loads track and calls AVPlayer to play it, then calls completion
    command.run{ [weak self] (result: Bool) in
        if #available(iOSApplicationExtension 12.0, *) {
            self?.complete(result ? .success : .failure)
        }
    }
}

}

1 Ответ

0 голосов
/ 07 ноября 2018

Я разговаривал с инженером Apple, и он сказал, что INPlayMediaIntentHandling можно использовать только с кодом результата ответа намерения .handleInApp.Итак, я переместил логику обработчика намерений в основную цель приложения и вызвал ее через -application AppDelegate: handleIntent: завершениеHandler:

Все работает хорошо, кроме прерываний AudioSession от Siri - она ​​останавливает мою логику воспроизведения медиа сразу после запуска.Инженер из Apple сказал, что это ошибка iOS, и Apple работает над исправлением ошибки (возможно, в 12.1 они ее исправили, я еще не проверял)

...