25、利用Siri开发应用:消息与支付案例解析

利用Siri开发应用:消息与支付案例解析

1. 配置Siri交互的Info.plist文件

在SiriTest项目的MessageExtension和MessageExtensionUI文件夹中,都有一个Info.plist文件,这个文件定义了Siri能识别和响应的内容。具体操作步骤如下:
1. 打开Info.plist文件,依次点击NSExtension、NSExtensionAttributes,最后点击IntentsSupported。
2. MessageExtension文件夹下的Info.plist文件默认支持三个意图:
- INSendMessageIntent:发送消息
- INSearchForMessagesIntent:搜索消息
- INSetMessageAttributeIntent:修改消息属性
3. 如果开发的应用属于其他领域,如支付或创建笔记,需要将IntentsSupported中的项目替换为相应的意图,如INSendPaymentIntent或INCreateNoteIntent。

此外,主项目文件夹中的Info.plist文件也可能需要修改,以允许应用使用某些隐私设置,常见的隐私设置包括:
- 日历使用
- 联系人访问
- 音乐库访问
- 照片库访问
- 提醒事项使用

2. 理解IntentHandler.swift文件

在修改完Info.plist文件后,下一步是修改位于Extension文件夹中的IntentHandler.swift文件。具体步骤如下:
1. 导入必要的框架 :IntentHandler.swift文件默认导入了Intents框架,但根据应用需求,可能需要导入其他框架。例如,如果应用需要访问照片库,需要导入Photos框架;如果应用进行VoIP通话,需要导入CallKit框架。
2. 采用处理协议 :确保IntentHandler类采用所选领域的处理协议。在SiriTest项目中,IntentHandler类采用了发送、搜索和修改消息的协议,代码如下:

class IntentHandler: INExtension, INSendMessageIntentHandling, 
INSearchForMessagesIntentHandling, INSetMessageAttributeIntentHandling {
}

如果应用不在消息领域工作,需要删除IntentHandler.swift文件中的代码,并让IntentHandler类采用不同的协议,如INStartAudioCallIntentHandling用于VoIP通话,或INStartWorkoutIntentHandling用于健身领域。以下是健身领域的协议采用代码:

class IntentHandler: INStartWorkoutIntentHandling, 
INPauseWorkoutIntentHandling, INResumeWorkoutIntentHandling, 
INCancelWorkoutIntentHandling, INEndWorkoutIntentHandling {
}
  1. 创建符合协议的函数 :无论IntentHandler类采用哪种SiriKit协议,都需要创建函数来符合这些协议。在SiriTest项目中,IntentHandler.swift文件包含处理消息的代码。用户与Siri交互时,可能会给出完整或部分命令。完整命令应至少包含三个项目:
    • 应用名称
    • 操作的接收者
    • 操作的内容

例如,“使用SiriTest支付给Fred十美元”,其中Fred是接收者,十美元是内容,SiriTest是应用名称。但大多数情况下,用户会给出部分命令,如“使用SiriTest支付给Fred”,此时Siri需要询问缺少的信息,这称为歧义消除。

在SiriTest项目中,IntentHandler.swift文件包含两个函数来处理可能缺少的信息:
- resolveRecipients函数 :处理接收者信息。根据匹配的联系人数量,有三种情况:

case 2 ... Int.max:
    // We need Siri's help to ask user to pick one from the matches.
    resolutionResults += [INPersonResolutionResult.disambiguation(with: matchingContacts)]
case 1:
    // We have exactly one matching contact
    resolutionResults += [INPersonResolutionResult.success(with: recipient)]
case 0:
    // We have no contacts matching the description provided
    resolutionResults += [INPersonResolutionResult.unsupported()]
  • resolveContent函数 :检查用户是否指定了要发送的消息。代码如下:
func resolveContent(for intent: INSendMessageIntent, with completion:  @escaping (INStringResolutionResult) -> Void) {
    if let text = intent.content, !text.isEmpty {
        completion(INStringResolutionResult.success(with: text))
    } else {
        completion(INStringResolutionResult.needsValue())
    }
}
  1. 确认和处理函数 :Siri获取有效接收者和消息后,会使用confirm函数询问用户是否确认,使用handle函数执行操作。代码如下:
func confirm(intent: INSendMessageIntent, completion: @escaping (INSendMessageIntentResponse) -> Void) {
    // Verify user is authenticated and your app is ready to send a message.
    let userActivity = NSUserActivity(activityType: NSStringFromClass(INSendMessageIntent.self))
    let response = INSendMessageIntentResponse(code: .ready, userActivity: userActivity)
    completion(response)
}

func handle(intent: INSendMessageIntent, completion: @escaping (INSendMessageIntentResponse) -> Void) {
    // Implement your application logic to send a message here.
    let userActivity = NSUserActivity(activityType: NSStringFromClass(INSendMessageIntent.self))
    let response = INSendMessageIntentResponse(code: .success, userActivity: userActivity)
    completion(response)
}
3. 理解ExtensionUI文件夹

为了自定义应用在Siri中的外观,可以修改ExtensionUI文件夹中的两个文件:
1. IntentViewController.swift文件 :包含用于自定义应用在Siri中用户界面的Swift代码。
2. MainInterface.storyboard文件 :定义实际的用户界面。

具体操作步骤如下:
1. 在MainInterface.storyboard文件中添加用户界面元素,如UILabel或UITextView。
2. 创建IBOutlets,将.storyboard文件和IntentViewController.swift文件连接起来。
3. 让IntentViewController类采用INUIHostedViewsSiriProviding协议,代码如下:

class IntentViewController: UIViewController, INUIHostedViewControlling, 
INUIHostedViewSiriProviding {
}
  1. 设置以下三个变量之一为true:
    • displaysMap:如果应用依赖地图应用,如打车应用,用于替换默认的地图界面。
    • displaysMessage:如果应用处理消息,用于显示自定义界面。
    • displaysPaymentTransaction:如果应用处理支付,用于显示自定义界面。

在SiriTest项目中,由于处理消息,需要将displaysMessage设置为true:

var displaysMessage: Bool {
    return true
}
  1. 修改configure函数,以在Siri中显示.storyboard文件。代码如下:
func configureView(for parameters: Set<INParameter>, of interaction: 
INInteraction, interactiveBehavior: INUIInteractiveBehavior, context: 
INUIHostedViewContext, completion: @escaping (Bool, Set<INParameter>, 
CGSize) -> Void) {
    // Do configuration here, including preparing views and calculating 
    // a desired size for presentation.
    if let messageIntent = interaction.intent as? INSendMessageIntent {
        guard messageIntent.content != nil else {
            return completion(true, parameters, CGSize.zero)
        }
        messageLabel.text = "Your message = \(messageIntent.content ?? "")"
    }
    completion(true, parameters, self.desiredSize)
}
4. 运行SiriTest项目

将iOS设备通过USB电缆连接到Mac,运行SiriTest项目。具体步骤如下:
1. 运行项目后,会出现一个窗口,询问使用哪个应用,选择Siri并点击运行按钮,Siri将出现。
2. 说“使用SiriTest发送消息”,Siri会询问要发送给谁。
3. 说出一个名字,如Frank,Siri会显示该名字,并询问要发送的内容。
4. 说出消息内容,如“生日快乐”,Siri将显示MainInterface.storyboard文件。

5. 创建支持Siri的支付应用

接下来,我们将创建一个简单的支付应用CatPay,以展示与消息领域应用的不同之处。具体步骤如下:
1. 创建项目 :创建一个新的Single View App iOS项目,命名为CatPay。选择File -> New -> Target,点击Intents Extension图标,点击Next,给扩展命名为PayExtension,并确保选中“Include UI Extension”复选框,最后点击Finish。
2. 修改Info.plist文件 :在PayExtension和PayExtensionUI文件夹中,修改Info.plist文件。展开NSExtension、NSExtensionAttributes和IntentsSupported,删除除一个项目外的所有项目,并将剩余项目替换为INSendPaymentIntent。
3. 修改IntentHandler.swift文件
- 让IntentHandler类采用INSendPaymentIntentHandling协议,代码如下:

class IntentHandler: INExtension, INSendPaymentIntentHandling {
}
- 修改handle和confirm函数以处理支付意图,代码如下:
func handle(intent: INSendPaymentIntent, completion: @escaping (INSendPaymentIntentResponse) -> Void) {
    let userActivity = NSUserActivity(activityType: NSStringFromClass(INSendMessageIntent.self))
    completion(INSendPaymentIntentResponse(code: .success, userActivity: userActivity))
}

func confirm(intent: INSendPaymentIntent, completion: @escaping (INSendPaymentIntentResponse) -> Void) {
    let userActivity = NSUserActivity(activityType: NSStringFromClass(INSendPaymentIntent.self))
    let response = INSendPaymentIntentResponse(code: .ready, userActivity: userActivity)
    completion(response)
}
  1. 创建自定义用户界面
    • 在MainInterface.storyboard的视图中间放置一个UILabel,通过Assistant Editor将UILabel控制拖动到IntentViewController.swift文件,创建一个名为contentLabel的IBOutlet。
    • 修改IntentViewController.swift文件:
      • 让其采用INUIHostedViewSiriProviding协议,代码如下:
class IntentViewController: UIViewController, INUIHostedViewControlling, 
INUIHostedViewSiriProviding {
}
    - 将displaysPaymentTransaction变量设置为true,代码如下:
var displaysPaymentTransaction: Bool {
    return true
}
    - 修改configure函数以在Siri中显示MainInterface.storyboard文件,代码如下:
func configure(with interaction: INInteraction, context: 
INUIHostedViewContext, completion: @escaping ((CGSize) -> Void)) {
    if let paymentIntent = interaction.intent as? INSendPaymentIntent {
        guard let amount = paymentIntent.currencyAmount?.amount else {
            return completion(CGSize.zero)
        }
        let paymentDescription = "Sending \(amount) \(paymentIntent.
        currencyAmount?.currencyCode ?? "dollars") worth of cats"
        contentLabel.text = paymentDescription
    }
    completion(self.desiredSize)
}

运行CatPay项目,连接iOS设备到Mac,说“使用CatPay支付二十五美元”,Siri将显示MainInterface.storyboard文件。

通过以上步骤,我们可以开发出支持Siri的消息和支付应用,并且可以自定义应用在Siri中的外观和交互方式。

利用Siri开发应用:消息与支付案例解析(续)

6. 开发流程总结与对比

为了更清晰地展示开发支持Siri的消息应用和支付应用的流程,我们将关键步骤进行总结和对比,如下表所示:
| 操作步骤 | 消息应用(SiriTest) | 支付应用(CatPay) |
| — | — | — |
| Info.plist文件配置 | 支持INSendMessageIntent、INSearchForMessagesIntent、INSetMessageAttributeIntent | 支持INSendPaymentIntent |
| IntentHandler.swift文件修改 | 采用消息相关协议,如INSendMessageIntentHandling等,包含resolveRecipients、resolveContent等函数 | 采用INSendPaymentIntentHandling协议,修改handle和confirm函数处理支付意图 |
| ExtensionUI文件夹处理 | 设置displaysMessage为true,修改configure函数显示消息界面 | 设置displaysPaymentTransaction为true,修改configure函数显示支付界面 |

从这个表格可以看出,开发不同领域的应用,主要的差异在于Info.plist文件中的意图支持、IntentHandler.swift文件采用的协议以及ExtensionUI文件夹中显示界面的设置。

7. 技术点分析

在开发过程中,有几个关键的技术点需要深入理解:

7.1 意图支持(IntentsSupported)

在Info.plist文件中设置IntentsSupported是让应用与Siri交互的基础。不同的意图支持决定了应用可以响应的Siri命令。例如,消息应用支持发送、搜索和修改消息的意图,而支付应用支持发送支付的意图。开发者需要根据应用的功能需求,准确地设置这些意图。

7.2 协议采用(Protocols Adoption)

IntentHandler类采用的协议决定了应用如何处理Siri的命令。每个协议都有对应的处理函数,开发者需要实现这些函数来完成具体的操作。例如,在消息应用中,INSendMessageIntentHandling协议要求实现处理发送消息的函数;在支付应用中,INSendPaymentIntentHandling协议要求实现处理支付的函数。

7.3 界面自定义(UI Customization)

通过修改ExtensionUI文件夹中的文件,可以自定义应用在Siri中的外观。这包括在MainInterface.storyboard文件中添加界面元素,在IntentViewController.swift文件中编写代码来控制界面的显示。例如,在消息应用中,根据消息内容显示不同的界面;在支付应用中,根据支付金额显示支付信息。

8. 开发过程中的注意事项

在开发支持Siri的应用时,还需要注意以下几点:

8.1 隐私设置

在主项目的Info.plist文件中,需要根据应用的功能需求,合理设置隐私权限,如日历使用、联系人访问、照片库访问等。否则,应用可能无法正常访问相关资源,导致功能异常。

8.2 代码完整性

虽然IntentHandler.swift文件中的模板代码提供了基本的框架,但很多功能需要开发者自己实现。例如,在消息应用中,模板代码不会实际发送消息,需要开发者编写额外的代码来完成发送操作。

8.3 错误处理

在处理用户的命令时,可能会遇到各种错误情况,如用户输入的信息不完整、联系人不存在等。开发者需要在代码中进行错误处理,给用户提供友好的提示信息。例如,在resolveRecipients函数中,当没有匹配的联系人时,返回unsupported()结果,让Siri告知用户重新输入。

9. 未来展望

随着语音交互技术的不断发展,Siri在应用开发中的作用将越来越重要。开发者可以利用Siri的功能,为用户提供更加便捷、智能的交互体验。例如,未来的应用可能会支持更多复杂的意图,如多步骤的任务处理、跨应用的操作等。同时,界面的自定义也将更加丰富,能够根据不同的场景和用户需求,动态地显示不同的界面。

总之,开发支持Siri的应用是一个充满挑战和机遇的领域,开发者需要不断学习和实践,掌握相关的技术和方法,才能开发出高质量的应用。

以下是开发支持Siri应用的mermaid流程图:

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
    classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px

    A([开始项目]):::startend --> B(创建项目结构):::process
    B --> C{选择应用领域}:::decision
    C -->|消息领域| D(配置消息相关Info.plist):::process
    C -->|支付领域| E(配置支付相关Info.plist):::process
    D --> F(修改IntentHandler.swift处理消息):::process
    E --> G(修改IntentHandler.swift处理支付):::process
    F --> H(自定义消息界面):::process
    G --> I(自定义支付界面):::process
    H --> J(运行消息应用测试):::process
    I --> K(运行支付应用测试):::process
    J --> L([完成消息应用开发]):::startend
    K --> M([完成支付应用开发]):::startend

通过以上的分析和总结,希望能帮助开发者更好地理解和掌握利用Siri开发应用的技术和方法,开发出更加优秀的应用。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值