使用 Swift 在 iOS 10 中集成 Siri —— SiriKit 教程

简介: 使用 Swift 在 iOS 10 中集成 Siri —— SiriKit 教程 转载地址:http://swift.gg/2016/06/28/adding-siri-to-ios-10-apps-in-swift-tutorial/ 下载 Xcode 8,配置 iOS 10 和 Swift 3 (可选)通过命令行编译 除非你想使用命令行编译,使用 Swift 3.0 的工具链并不需要对项目做任何改变。

使用 Swift 在 iOS 10 中集成 Siri —— SiriKit 教程

转载地址:http://swift.gg/2016/06/28/adding-siri-to-ios-10-apps-in-swift-tutorial/

下载 Xcode 8,配置 iOS 10 和 Swift 3

(可选)通过命令行编译

除非你想使用命令行编译,使用 Swift 3.0 的工具链并不需要对项目做任何改变。如果你想的话,打开 Xcode-beta,然后从顶部菜单栏中选择 Xcode > Preferences,接着选择 Location,在页面的底部,你会看到「Command Line Tool」这行设置,请在这里选择 Xcode 8.0。

现在,在 Terminal 使用命令行找到工程所在的文件夹,调用 xcodebuild 命令就可以编译工程了。

(可选)移植现有的 Swift 2 应用

如果你想对一个已使用 Swift 2.0 开发的工程引入 Siri 功能,需要点击工程,选择 Build Settings,在 Swift Compiler - Version 下面,找到 Use Legacy Swift Language Version 选项,设置成 No。这会造成编译器报错,然后你可以根据这些报错信息来修改代码,推荐你使用这个设置来更新代码,以适应 Swift 不断进化的语义。

开始使用 SiriKit

首先,在你的 App(或者是新建一个单视图的 Swift 模板工程),点击顶部的工程,然后点击左侧下方的 + 按钮,在这里(译者注:我在这里添加了一张图片,能够说的更明白)点击。

弹出的窗口中,选择 iOS > Application Extension,接着选择 Intents Extension。

这样就给工程添加了一个新的 intent,用于监听 Siri 的命令。其中的 Product Name 应该和你的工程文件名字相似,比如,你的 App 名为 MusicMatcher,你可以把这个 intent 的名字命名为 MusicMatcherSiriIntent。一定要选中 Include UI Extension 选项,我们之后会用到,这也是添加额外扩展的最简单的方法。

我刚刚创建的两个新 target 可以从项目的文件层级上找到。找到 Intent 文件夹下的 IntentHandler.swift 文件,看一下这里面的样本代码。默认会提供一些示例代码,允许用户说一下诸如「用 MusicMatcher 开始锻炼」的命令,MusicMatcher 是 App 的名字。

像这样运行示例应用

这个时候最好编译一下代码,然后在 iOS 真机上试一下命令。继续,编译应用的 target,从 Scheme 下拉菜单里选择 MusicMatcher,然后选择真机,点击 Run。

你看你会看到一个空白的应用出现,你使用的扩展这时会在后台加载到设备的系统文件里,现在点击 Stop 按钮来关闭应用。

接下来,找到你的 scheme,选择 Intent target,点击 Run。

这时会出现一个弹出框,问你需要连接哪个应用,选择你刚刚运行的应用:MusicMatcher。这会让真机上再次出现这个应用(还是一个空白的应用),不过这次调试台(debugger)中会出现连接的 Intent 扩展。

现在点击 home 按钮回到首屏,或者应用可能自己就退出了,因为你正在运行的是 Intent,不是应用本身(这不是崩溃!!!)。

启用扩展

扩展都已安装就位了,但是作为一个 iOS 用户,仍然需要进行 Siri 设置才能使用扩展。点击测试设备里的 Settings,选择 Siri 菜单,你会看到 MusicMatcher 出现在清单里,激活允许使用 Siri。

测试我们第一个 Siri 命令

尝试一下 Siri 命令,长按 Home 键或者说出「Hey Siri」来激活 Siri(当然需要你已经激活「Hey Siri」功能)。

试一下命令,比如「使用 MusicMatcher 开始锻炼」。

「对不起,你需要在应用里继续。」

如果你像我一样遇到了这样的错误信息:「Sorry, you’ll need to continue in the app.」(不知道什么原因,偶尔会出现这么一个问题,什么鬼?)

在控制台中你可能会看到类似的信息:

 

[objc]  view plain  copy
 在CODE上查看代码片派生到我的代码片
  1. dyld: Library not loaded: @rpath/libswiftCoreLocation.dylib  
  2.   Referenced from: /private/var/containers/Bundle/Application/CC815FA3-EB04-4322-B2BB-8E3F960681A0/LockScreenWidgets.app/PlugIns/JQIntentWithUI.appex/JQIntentWithUI  
  3.   Reason: image not found  
  4. Program ended with exit code: 1  

 

再次选择工程根目录,选择 MusicMatcher target。在 General 底下找到 Linked Frameworks and Libraries。点击 + 按钮,添加 CoreLocation.framework。现在可以再次编译在真机上运行,接着照着上面相同的步骤再次编译运行 intent target。我们还需要在工程里添加 CoreLocation 库,确保能添加到我们编译过的 Swift 工程中。

最后,从手机桌面激活 Siri。

「Hey Siri!」
「Start my workout using MusicMatcher(使用 MusicMatcher 开始锻炼)」

Siri 这时候应该会回应:「OK. exercise started on MusicMatcher(OK,开始用 MusicMatcher 锻炼身体)」,然后会出现一个 UI 界面写着「Workout Started(锻炼开始)」。

它是如何工作的呢?

模板中的 IntentHandler 类使用了一长串的协议:

首先最主要的就是 INExtension,允许我们一开始就把类当作一个 intent extension 来用。剩下的协议都是 intent handler 类型,在类里能够回调:

 

[objc]  view plain  copy
 在CODE上查看代码片派生到我的代码片
  1. INStartWorkoutIntentHandling  
  2. INPauseWorkoutIntentHandling  
  3. INResumeWorkoutIntentHandling  
  4. INCancelWorkoutIntentHandling  
  5. INEndWorkoutIntentHandling  

按住 Command 键点击这些协议的名字,会看到苹果提供的文档:第一个就是我们刚刚测试过的,INStartWorkoutIntentHandling

[objc]  view plain  copy
 在CODE上查看代码片派生到我的代码片
  1. /*! 
  2.  @brief Protocol to declare support for handling an INStartWorkoutIntent  
  3.  @abstract By implementing this protocol, a class can provide logic for resolving, confirming and handling the intent. 
  4.  @discussion The minimum requirement for an implementing class is that it should be able to handle the intent. The resolution and confirmation methods are optional. The handling method is always called last, after resolving and confirming the intent. 
  5.  */  

 

这会根据用户使用语言的不同而不同,不过最终的目的都是开始一次锻炼。INStartWorkoutIntentHandling 协议调用的几个方法都在示例代码里实现了。如果你想创建一个锻炼应用,你可以自行了解其他的内容。不过在这篇教程的剩余部分,我会添加一个新的 intent handler,来处理发送消息。换句话说,这协议告诉 SiriKit 我们准备处理英文句子「Start my workout with AppName Here.」

添加一个新的消息 Intent

确认应用可以完美运行后,让我们继续,添加一个新的 intent 类型,用于发送消息,这里的文档说明了下列信息:

 

[objc]  view plain  copy
 在CODE上查看代码片派生到我的代码片
  1. Send a message  
  2. Handler:INSendMessageIntentHandling protocol  
  3. Intent:INSendMessageIntent  
  4. Response:INSendMessageIntentResponse  

 

在类里添加 INSendMessageIntentHandling 协议。首先要明确,我们把它添加到类协议清单里,也就是在 IntentHandler.swift 文件里。由于实际上我不想使用这些 intent,所以我会删除它们,只留下这一个:

 

[objc]  view plain  copy
 在CODE上查看代码片派生到我的代码片
  1. class IntentHandler: INExtension, INSendMessageIntentHandling {  
  2.     ...  

 

另外,如果你需要核对具体是哪些方法,只需要按住 Command 键然后鼠标点击 INSendMessageIntentHandling,然后看一下哪些方法前面没有 optional关键词即可。如果这时候编译,是不会通过编译的,因为我们还需要实现一些遵守 INSendMessageIntentHandling 协议所必需的方法。

在这里,我们发现只有一个必须实现的方法:

[objc]  view plain  copy
 在CODE上查看代码片派生到我的代码片
  1. /*! 
  2.  @brief handling method 
  3.   
  4.  @abstract Execute the task represented by the INSendMessageIntent that's passed in 
  5.  @discussion This method is called to actually execute the intent. The app must return a response for this intent. 
  6.   
  7.  @param  sendMessageIntent The input intent 
  8.  @param  completion The response handling block takes a INSendMessageIntentResponse containing the details of the result of having executed the intent 
  9.   
  10.  @see  INSendMessageIntentResponse 
  11.  */  
  12. public func handle(sendMessage intent: INSendMessageIntent, completion: (INSendMessageIntentResponse) -> Swift.Void)  

回到 IntentHandler.swift 文件,添加一行分隔符(借助 jump bar,在导航查找代码时这个分隔符会非常有用)遵守新消息意图协议

// MARK: - INSendMessageIntentHandling

在 MARK 底下,我们来实现方法。我发现 Xcode 8 非常有用,通过敲击方法名字的开始部分,剩下的都能交给自动补全来完成了,然后选择对应的方法。

在 handler 里,我们需要创建一个 INSendMessageIntentResponse,来回调闭包。先假设所有的信息发送都很成功,在 INSendMessageIntentResponse 里返回一个用户活动的成功值,和默认模板中的实现非常类似。还需要添加一个 print 方法,当 handler 方法被 Siri 事件触发后我们就能知晓啦:

[objc]  view plain  copy
 在CODE上查看代码片派生到我的代码片
  1. func handle(sendMessage intent: INSendMessageIntent, completion: (INSendMessageIntentResponse) -> Void) {  
  2.     print("Message intent is being handled.")  
  3.     let userActivity = NSUserActivity(activityType: NSStringFromClass(INSendMessageIntent))  
  4.     let response = INSendMessageIntentResponse(code: .success, userActivity: userActivity)  
  5.     completion(response)  
  6. }  

把这个 intent 类型添加到 Info.plist

在具备处理 INSendMessageIntent 方法之前,我们需要在 Info.plist 文件里添加一些值,就当作是应用的授权吧。

在 intent 的 Info.plist 文件里,找到并点开 NSExtension 键。接着点开 NSExtensionAttributes,然后是 IntentsSupported,我们需要给INSendMessageIntent 新添加一行,允许应用处理信息 intents。

测试新的 intent

现在我们已经设置好了新的 intent,来测试一下。记住,你必须先编译 App,在真机上运行,接着运行扩展进行调试,如果你不这样做,扩展要么不会工作,要么不会在 Xcode 的控制台中打印日志。

调用 Siri 的 intent,你现在可以看到会出现一个新的信息窗口,这个窗口目前还是空的,毕竟我们还没有给应用编写什么逻辑,我们需要实现剩下的调用,还要添加一些信息的逻辑,实现更好的用户体验。我们会在 已经发布的 Part 2 里解决这些事情。

相关文章
|
3月前
|
Java Maven
2022最新版超详细的Maven下载配置教程、IDEA中集成maven(包含图解过程)、以及导入项目时jar包下载不成功的问题解决
这篇文章是一份关于Maven的安装和配置指南,包括下载、环境变量设置、配置文件修改、IDEA集成Maven以及解决jar包下载问题的方法。
2022最新版超详细的Maven下载配置教程、IDEA中集成maven(包含图解过程)、以及导入项目时jar包下载不成功的问题解决
|
3月前
|
Swift iOS开发
iOS Swift使用Alamofire请求本地服务器报错-1002
iOS Swift使用Alamofire请求本地服务器报错-1002
95 1
|
12天前
|
安全 Java API
【三方服务集成】最新版 | 阿里云短信服务SMS使用教程(包含支持单双参数模板的工具类,拿来即用!)
阿里云短信服务提供API/SDK和控制台调用方式,支持验证码、通知、推广等短信类型。需先注册阿里云账号并实名认证,然后在短信服务控制台申请资质、签名和模板,并创建AccessKey。最后通过Maven引入依赖,使用工具类发送短信验证码。
【三方服务集成】最新版 | 阿里云短信服务SMS使用教程(包含支持单双参数模板的工具类,拿来即用!)
|
6天前
|
安全 数据处理 Swift
深入探索iOS开发中的Swift语言特性
本文旨在为开发者提供对Swift语言在iOS平台开发的深度理解,涵盖从基础语法到高级特性的全面分析。通过具体案例和代码示例,揭示Swift如何简化编程过程、提高代码效率,并促进iOS应用的创新。文章不仅适合初学者作为入门指南,也适合有经验的开发者深化对Swift语言的认识。
24 9
|
19天前
|
安全 API Swift
探索iOS开发中的Swift语言之美
【10月更文挑战第23天】在数字时代的浪潮中,iOS开发如同一艘航船,而Swift语言则是推动这艘船前进的风帆。本文将带你领略Swift的独特魅力,从语法到设计哲学,再到实际应用案例,我们将一步步深入这个现代编程语言的世界。你将发现,Swift不仅仅是一种编程语言,它是苹果生态系统中的一个创新工具,它让iOS开发变得更加高效、安全和有趣。让我们一起启航,探索Swift的奥秘,感受编程的乐趣。
|
1月前
|
存储 Java 开发工具
【三方服务集成】最新版 | 阿里云OSS对象存储服务使用教程(包含OSS工具类优化、自定义阿里云OSS服务starter)
阿里云OSS(Object Storage Service)是一种安全、可靠且成本低廉的云存储服务,支持海量数据存储。用户可通过网络轻松存储和访问各类文件,如文本、图片、音频和视频等。使用OSS后,项目中的文件上传业务无需在服务器本地磁盘存储文件,而是直接上传至OSS,由其管理和保障数据安全。此外,介绍了OSS服务的开通流程、Bucket创建、AccessKey配置及环境变量设置,并提供了Java SDK示例代码,帮助用户快速上手。最后,展示了如何通过自定义starter简化工具类集成,实现便捷的文件上传功能。
【三方服务集成】最新版 | 阿里云OSS对象存储服务使用教程(包含OSS工具类优化、自定义阿里云OSS服务starter)
|
1月前
|
安全 Swift iOS开发
探索iOS开发中的Swift语言之美
在数字时代的浪潮中,移动应用已成为日常生活的延伸。本文将深入探讨iOS平台上的Swift编程语言,揭示其背后的设计哲学、语法特性以及如何利用Swift进行高效开发。我们将通过实际代码示例,展示Swift语言的强大功能和优雅简洁的编程风格,引导读者理解并运用Swift解决实际问题。
|
2月前
|
安全 Swift iOS开发
探索iOS开发之旅:Swift语言的魅力与挑战
【9月更文挑战第21天】在这篇文章中,我们将一起潜入iOS开发的海洋,探索Swift这门现代编程语言的独特之处。从简洁的语法到强大的功能,Swift旨在让开发者能够以更高效、更安全的方式构建应用程序。通过实际代码示例,我们会深入了解Swift如何简化复杂任务,并讨论它面临的挑战和未来的发展方向。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和知识。
45 4
|
2月前
|
安全 编译器 Swift
探索iOS开发之旅:Swift编程语言的魅力与挑战
【9月更文挑战第5天】在iOS应用开发的广阔天地中,Swift作为苹果官方推荐的编程语言,以其简洁、高效和安全的特点,成为了开发者的新宠。本文将带领你领略Swift语言的独特魅力,同时探讨在实际开发过程中可能遇到的挑战,以及如何克服这些挑战,成为一名优秀的iOS开发者。
|
3月前
|
前端开发 Java Maven
【前端学java】全网最详细的maven安装与IDEA集成教程!
【8月更文挑战第12天】全网最详细的maven安装与IDEA集成教程!
98 2
【前端学java】全网最详细的maven安装与IDEA集成教程!

热门文章

最新文章