【问题标题】:SiriKit Error: Donating intent is not supported by this applicationSiriKit 错误:此应用程序不支持捐赠意图
【发布时间】:2018-11-21 20:19:12
【问题描述】:

我在 Xcode 10(iOS 12 Beta)中捐赠自定义 Intent 时遇到问题。

我创建了一个自定义框架,在我的主应用目标和我的“OrderIntent”目标之间共享。

我创建了一个 .intentdefinition 文件,其中目标成员资格设置为我的自定义框架(下面的屏幕截图)。

我在主应用程序中嵌入了“意图扩展”和“意图 UI 扩展”。

我还在添加意图扩展时创建的两个 info.plist 文件中将“OrderIntent”添加到 NSExtension->NSExtensionAttributes->IntentsSupported(截图如下)。

我正在尝试像这样捐赠意图:

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)
    }
}

在设备上测试时,我收到以下错误:

Error Domain=IntentsErrorDomain Code=1901 “此应用程序不支持捐赠意图 'OrderIntent'。请确保您有支持此意图的扩展程序。” UserInfo={NSLocalizedDescription=此应用程序不支持捐赠意图“OrderIntent”。请确保您有支持此意图的扩展程序。}

我不明白为什么应用程序不支持“OrderIntent”。

我已经在功能选项卡中启用了 Siri,并请求了用户等的许可。

是否需要采取任何其他步骤才能让我捐赠意图?

【问题讨论】:

    标签: ios sirikit ios12


    【解决方案1】:

    尝试从NSExtension -> NSExtensionAttributes -> IntentsSupported 上的“OrderIntent”字符串中删除“Intent”一词。

    即您的路径将类似于 NSExtension -> NSExtensionAttributes -> IntentsSupported -> Item 0 -> Order

    我知道Apple Documentation 声明我们应该:

    将每个项目的值设置为意图的类名

    但对我来说,它根本不起作用。

    希望对你有帮助:)

    【讨论】:

    • 感谢您的回答。我确实尝试过,但仍然收到相同的错误消息。最后,我能够通过在我的应用程序文件夹中创建对 .intentdefinition 文件的引用来使其工作。我添加了一个答案,其中包含有关我如何使其工作的更多信息。
    【解决方案2】:

    我已经能够通过将 .intentdefinition 文件拖到我的应用程序文件夹以及我的自定义框架文件夹中来添加对应用程序文件夹中的 CustomIntents.intentdefinition 文件的引用来使其工作(见下图):

    复制文件时,我确保不要选中“如果需要,复制项目”选项,因此 .intentdefinition 文件只存在于一个位置:

    在设备上运行和测试后,交互捐赠成功,应用现在在设备设置的“Siri 和搜索”下提供“订购测试产品”选项。

    【讨论】:

      【解决方案3】:

      我相信你的问题的答案在你的描述中是正确的(强调我的):

      我创建了一个 .intentdefinition 文件,其中目标成员资格设置为我的自定义框架

      我假设执行对interaction.donate 的调用的代码在您的应用程序中,而不是在共享框架中。如果是这种情况(根据your answer 判断您是如何解决该问题的),您还需要将您的主应用程序添加为.intentdefinition 文件中的目标。您将希望没有生成的类,因为它们已经在您的应用链接到的共享框架中。您可能会遇到问题,因为您似乎在单独的 Xcode 项目中创建了共享框架,因此其他目标不可见。

      【讨论】:

      • 在我的情况下,我已经在 .intentdefinition 的目标中添加了我的主应用程序,但仍然遇到同样的问题。
      • 我在模拟器上调试它时工作正常,但在真实设备上抛出错误。
      • @Bhavesh 你找到这个问题的根本原因了吗?我有相同的设置,它可以在模拟器上调试,但在真实设备上失败。
      • 非常感谢!我只是将所有内容都移到了自定义框架中,并且想知道为什么没有显示快捷方式!
      猜你喜欢
      • 2016-12-29
      • 2013-01-02
      • 1970-01-01
      • 2011-11-20
      • 1970-01-01
      • 1970-01-01
      • 2015-01-18
      • 2011-09-29
      • 2014-06-05
      相关资源
      最近更新 更多