SiriKit Ошибка: пожертвование не поддерживается этим приложением - PullRequest
0 голосов
/ 12 июня 2018

У меня проблемы с передачей пользовательского намерения в Xcode 10 (бета-версия iOS 12).

Я создал пользовательский фреймворк, который используется совместно с целью моего основного приложения и целью 'OrderIntent'.

Я создал файл .intentdefinition с целевым членством, установленным для моей пользовательской структуры (снимок экрана ниже).

enter image description here

I 'я встроил в основное приложение 'Intents Extension' & 'Intents UI Extension'.

Я также добавил 'OrderIntent' в NSExtension-> NSExtensionAttributes-> IntentsSupported в обоих созданных файлах info.plistкогда я добавил расширения намерений (скриншот ниже).

enter image description here

Я пытаюсь пожертвовать намерение так:

INPreferences.requestSiriAuthorization { (status) in

        if status != INSiriAuthorizationStatus.authorized {return}

        let orderIntent = OrderIntent()
        orderIntent.product = "Test product"
        orderIntent.quantity = 2

        let interaction = INInteraction(intent: customIntent, response: nil)

        interaction.donate { (error) in
            if error != nil {2
                if let error = error as NSError? {
                    print(error)
                }
            } else {
                print("success")
            }
        }
    }

Приведенный выше код запускается, когда пользователь нажимает на кнопку в приложении.

Я также настроил обработчик намерений следующим образом:

class IntentHandler: INExtension {

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

    switch intent {
        case is OrderIntent:
            return OrderIntentHandler()

        default:
            fatalError()
    }

    return self
}

И OrderIntentHandler следующим образом:

public class OrderIntentHandler: NSObject, OrderIntentHandling {

    public func handle(intent: OrderIntent, completion: @escaping (OrderIntentResponse) -> Void) {

        let orderIntentResponse = OrderIntentResponse(code: OrderIntentResponseCode.success, userActivity: nil)

        completion(orderIntentResponse)
    }

    public func confirm(intent: OrderIntent, completion: @escaping (OrderIntentResponse) -> Void) {

        let response = OrderIntentResponse(code: OrderIntentResponseCode.ready, userActivity: nil)

        completion(response)
    }
}

При тестировании на устройстве я получаю следующееошибка:

Ошибка Домен = IntentsErrorDomain Код = 1901 "Пожертвование намерения" OrderIntent "не поддерживается этим приложением.Убедитесь, что у вас есть расширение, которое поддерживает это намерение. "UserInfo = {NSLocalizedDescription = Пожертвование намерения 'OrderIntent' не поддерживается этим приложением. Убедитесь, что у вас есть расширение, которое поддерживает это намерение.}

Я не могу понять, почему приложение 'OrderIntent' не поддерживается приложением.

Я уже включил Siri на вкладке возможностей и запросил разрешение у пользователя и т. Д.

Есть ли какие-либо другие шаги, которые необходимо предпринять, чтобы позволить мне пожертвовать намерение?

Ответы [ 3 ]

0 голосов
/ 12 июня 2018

Я смог заставить это работать, добавив ссылку на файл CustomIntents.intentdefinition в папке приложения, перетаскивая файл .intentdefinition в папку своего приложения, а также в папку пользовательского фреймворка (см. Изображение ниже):

enter image description here

При копировании файла я позаботился о том, чтобы не проверять опцию «Копировать элементы при необходимости», так что файл .intentdefinition существует только водно место:

enter image description here

После запуска и тестирования на устройстве взаимодействие успешно передается, и приложение теперь предлагает «Заказать тестовый продукт» в качестве опциив разделе «Siri & Search» в настройках устройства.

0 голосов
/ 07 июля 2018

Я полагаю, что ответ на вашу проблему будет правильным в вашем описании (выделено мной):

Я создал файл .intentdefinition с целевым членством , установленным для моей пользовательской платформы

Я предполагаю, что код, выполняющий вызов interaction.donate, находится в вашем приложении, а не в общей структуре.Если это так (судя по вашему ответу о том, как вы работали над этой проблемой), вам также необходимо добавить основное приложение в качестве цели из файла .intentdefinition.Вы захотите, чтобы не генерировали классы , поскольку они уже находятся в вашей общей инфраструктуре, на которую ссылается ваше приложение.У вас может быть проблема в том, что, похоже, вы создали общую инфраструктуру в отдельном проекте XCode, поэтому другие цели не отображаются.

0 голосов
/ 12 июня 2018

Попробуйте удалить слово "Intent" из строки "Order Intent " в вашей NSExtension -> NSExtensionAttributes -> IntentsSupported.

т.е. ваш путь будет чем-токак NSExtension -> NSExtensionAttributes -> IntentsSupported -> Item 0 -> Order.

Я знаю, что в документации Apple говорится, что мы должны:

Установите значение каждого элемента равным имени класса намерения

Но для меня это не работает вообще.

Надеюсь, что поможетты :) 1025 *

...