Siri - Lang Swift 3,INPayBillIntent 不工作,Siri 说“你必须在 DemoApp 中继续,你想打开它吗?”

Posted

技术标签:

【中文标题】Siri - Lang Swift 3,INPayBillIntent 不工作,Siri 说“你必须在 DemoApp 中继续,你想打开它吗?”【英文标题】:Siri - Lang Swift 3, INPayBillIntent is not working, Siri says "You will have to continue in DemoApp, Would you like to open it?" 【发布时间】:2017-08-07 07:56:31 【问题描述】:

我正在使用意图集成 Sirikit,账单支付:

INPayBillIntentHandling(最近在 ios 10.3+ 中发布,2017 年 3 月 27 日)。

Apple 文档是 here。

注意:我使用的是 Swift 语言、XCode 8.3、设备 iPhone 6 和 iOS 10.3.3 和演示项目 iOS 部署目标是 iOS 10.3 并且在第一次询问权限时还启用了 Siri 并且还验证了在设置,启用 Siri。 当我在设备上启动应用程序并说“使用 DemoApp 支付账单”时,Siri 说“你可以在 DemoApp 上获取此信息,你想去 DemoApp 吗?”

请帮助我。提前致谢!

到目前为止,我做了以下步骤:

1) 创建一个 Demo Xcode 项目

2) 在主要应用功能中,启用 Siri。

3) 添加了 Sirikit 扩展使用

File -> New -> Add Target -> Intent Extension -> Next ->添加 ProductName 并说 Finish

注意:我已禁用 Sirikit UI 扩展。 4) 在主 AppDelegate.swift 添加以下内容:

import Intents

INPreferences.requestSiriAuthorization  (status) in
            if status == INSiriAuthorizationStatus.authorized
                print("Authorized")
            else
            
                print("Not authorized")
            
        
        return true

5) 在主应用 Info.plist 中,添加键 NSSiriUsageDescription 和使用说明

6) 在IntentExtension, Info.plist, NSExtension->IntentsSupported->添加key INPayBillIntent

7) 在 IntentHandler.swift 中添加:

override func handler(for intent: INIntent) -> Any 
        if intent is INPayBillIntent
            print("Response: payBill")
         return PayBillHandler()
        

8) 在 PayBillHandler.swift 中添加了 INPayBillIntentHandling 的所有委托方法:

import Intents


class PayBillHandler: NSObject, INPayBillIntentHandling 
    func handle(intent: INPayBillIntent, completion: @escaping (INPayBillIntentResponse) -> Void)

        let userActivity = NSUserActivity(activityType: NSStringFromClass(INPayBillIntent.self))
        let response = INPayBillIntentResponse(code: .ready, userActivity: userActivity)
        completion(response)
    
    func resolveBillType(for intent: INPayBillIntent, with completion: @escaping (INBillTypeResolutionResult) -> Void) 

        let finalResult = INBillTypeResolutionResult.success(with: .water)
        completion(finalResult)
    

    func resolveBillPayee(for intent: INPayBillIntent, with completion: @escaping (INBillPayeeResolutionResult) -> Void) 

        let speakableStr = INSpeakableString(identifier: "XXX", spokenPhrase: "XXX", pronunciationHint: "XXX")
        let speakableStr1 = INSpeakableString(identifier: "YYY", spokenPhrase: "YYY", pronunciationHint: "YYY")
        let billPayee = INBillPayee(nickname: speakableStr, number: "10112122112", organizationName: speakableStr1)
        let finalResult = INBillPayeeResolutionResult.success(with: billPayee!)
        completion(finalResult)
    

    func resolveTransactionNote(for intent: INPayBillIntent, with completion: @escaping (INStringResolutionResult) -> Void) 

        let finalResult = INStringResolutionResult.success(with: "Bill Payment")
        completion(finalResult)

    
    func resolveDueDate(for intent: INPayBillIntent, with completion: @escaping (INDateComponentsRangeResolutionResult) -> Void) 

        completion(INDateComponentsRangeResolutionResult.notRequired())
    
    func resolveFromAccount(for intent: INPayBillIntent, with completion: @escaping (INPaymentAccountResolutionResult) -> Void) 

        let speakableStr2 = INSpeakableString(identifier: "Someone", spokenPhrase: "Someone", pronunciationHint: "Someone")
        let speakableStr3 = INSpeakableString(identifier: "", spokenPhrase: "", pronunciationHint: "organisation")
        let fromAccount = INPaymentAccount(nickname: speakableStr2, number: "10112122112", accountType: .credit, organizationName: speakableStr3)
        let finalResult = INPaymentAccountResolutionResult.success(with: fromAccount!)
        completion(finalResult)

    
    func resolveTransactionAmount(for intent: INPayBillIntent, with completion: @escaping (INPaymentAmountResolutionResult) -> Void) 

        let currencyAmmount = INCurrencyAmount(amount: NSDecimalNumber(string: "100"), currencyCode: "USD")
        let transactionAmt = INPaymentAmount(amountType: .amountDue, amount: currencyAmmount)
        let finalResult = INPaymentAmountResolutionResult.success(with: transactionAmt)
        completion(finalResult)

    
    func resolveTransactionScheduledDate(for intent: INPayBillIntent, with completion: @escaping (INDateComponentsRangeResolutionResult) -> Void) 

        completion(INDateComponentsRangeResolutionResult.notRequired())
    

    func confirm(intent: INPayBillIntent, completion: @escaping (INPayBillIntentResponse) -> Void) 

        let response = INPayBillIntentResponse(code: .success, userActivity: nil)
        completion(response)
    


对了,和Joao Nunes's question是同一个问题,只是为了swift修改了一下,问题还在等待回答,谢谢:)

【问题讨论】:

你可以试着说“支付我的账单”或“通过 DemoApp 支付我的账单”吗? 试过了,同样的反应“你可以在DemoApp上得到这个信息,你想去DemoApp吗?” 【参考方案1】:

我不确定您是否已经找到了解决方案。对我有用的是看到 SiriExtension 的部署目标是 10.3+ 以及主项目 10.3+ 中的部署目标。还将触发短语更改为“使用演示应用支付账单”。

Apple 开发者论坛链接: https://forums.developer.apple.com/thread/71488

【讨论】:

【参考方案2】:

尝试将 iOS 11 beta 5 安装到您的测试手机中。

我正在使用 swift 在 iOS 11 beta 5 上进行测试,并且更加稳定。

【讨论】:

以上是关于Siri - Lang Swift 3,INPayBillIntent 不工作,Siri 说“你必须在 DemoApp 中继续,你想打开它吗?”的主要内容,如果未能解决你的问题,请参考以下文章

在 SwiftUI 中检测 Siri 远程滑动

UITableView 或 UICollectionView 提供类似 Siri 的简单用户体验

如何在不捐赠意图或使用快捷方式的情况下利用 Siri 创建自定义对象?

iPhone13有啥方法唤醒siri-iPhone13怎么唤醒siri

iphone手机上的嘿siri耗电吗

如何在 Swift 中删除添加的快捷方式?