Handoff 指南
原文
An Introduction to Handoff
Handoff 指南
介绍
在ios8 和 OSX Yosemite中,苹果引入了一个Handoff的新特性让开发者使用。Handoff 允许应用通过蓝牙转移数据和应用状态信息从一个设备到另外一个设备上。这样就可以让用户在一个设备的应用上开始工作然后无缝的在另外一台设备上继续工作。
例如你的可以在你的iphone上编辑短信然后在你的ipad上结束编辑并且发送相同的一条短信。在这个指南中,我将通过一个简单的笔记应用向你展示如何使用Handoff在你自己的应用中。
这个指南需要你运行Xcode 6及以后版本 和 两个支撑Handoff的设备。不是所有的运行IOS 8的设备都有蓝牙4.0,这个功能因此仅支持以下设备:
- iPhone 5 及以后
- iPad 4,包括iPad Air
- iPad mini
- iPod Touch 5
在测试中,你需要在不同的设备中登录相同的ICloud账号,并且在设备的设置中打开Handoff功能。
1.设置工程
在Xcode中使用”IOS”>”Application”选项中的”Single View Application”模板创建一个新的工程。
按照下面所示配置工程。注意将”Language”设置为”Swift”,”Devices”设置为”Universal”。
创建工程后,打开 ViewController.swift 文件,按照下面所示实现 ViewController 这个类。
class ViewController: UIViewController, UITextFieldDelegate, UITextViewDelegate {var noteTitleField: UITextField!var noteContentView: UITextView!override func viewDidAppear(animated: Bool) {self.noteTitleField = UITextField(frame: CGRect(x: 12, y: 28, width: self.view.frame.width - 22, height: 20))self.noteTitleField.placeholder = "Note Title"self.noteTitleField.delegate = selfself.noteContentView = UITextView(frame: CGRect(x: 8, y: 56, width: self.view.frame.width - 16, height: self.view.frame.height - 64))self.noteContentView.text = "Note Content"self.noteContentView.delegate = selfself.view.addSubview(self.noteTitleField)self.view.addSubview(self.noteContentView)}func textViewDidBeginEditing(textView: UITextView) {if textView.text == "Note Content" {textView.text = ""}}override func viewDidLoad() {super.viewDidLoad()// Do any additional setup after loading the view, typically from a nib.}}
实现很简单。在 ViewController 类中实现 UITextFieldDelegate 和 UITextViewDelegate两个协议,在控制器的view上添加一个 UITextField 和 UITextView来接收文本输。
编译、运行应用在你的测试设备上,你将看到一个具有两个输入框的非常基本的界面,一个文本框用来输入笔记标题,一个文本视图用来输入笔记内容。
2.设置Handoff
使用Handoff在设备中传递活动依赖于 NSUserActivity 这个类。你将在下面的指南中学习和使用这个类。首先,你的应用必须成功的创建这个活动。
你必须在你的应用中给每个支持活动的类型设置一个唯一标识,就像每个ios应用都有他们自己唯一的id,这个标识是你随意设置的,但是最好是使用翻转域名符号的方式,比如com.tutsplus.handoff-introduction.note。为了能够识别活动,运行在每个设备上应用也必须使用相同的IOS开发者小组。
首先,在应用中你想要支持的Target的Info.plist文件中加入活动标识。打开Taget的Info.plist文件,添加 NSUserActivityTypes 键值。把这项设置为数组并且添加 com.tutsplus.handoff-introduction.note 这一项,如下截图所示
其次,在 Project Navigator中选中工程,在编辑款的右边打开 General 列表, 在”Identity”选项的”Team”中设置正确的开发者小组。
最后,在每个设备中登录相同的iCloud账号和连接相同的Wi-Fi网络,到此你的应用已经准备好使用Handoff了。
3.发送一个用户的活动
下一步,为了让用户的活动从一个设备发送到另一个设备,你需要添加一些代码,如下所示,在ViewController类里更新viewDidLoad方法。
override func viewDidLoad() {super.viewDidLoad()let activity = NSUserActivity(activityType: "com.tutsplus.handoff-introduction.note")activity.title = "Note"activity.userInfo = ["title": "", "content": ""]userActivity = activityuserActivity?.becomeCurrent()
}
这段代码使用你之前在 Target 的 Info.plist 文件中的标识创建了一个基本的 NSUserActivity 对象,并给活动对象的title赋值,给userInfo字典的title 和 content 键赋空的字符串。
在这个指南中,我们在活动的userInfo字典中放入字符串。然而,你可以放入任何特性表,比如数字、数组和字典,以及任何实现NScoding协议的类。
在你的ViewController实例中分配了一个新的活动给userActivity属性以便让Handoff API能够引用到它,UIViewController类从UIResponder类继承这一属性。
最后,用调用活动的 becomeCurrent 方法告诉系统当前用户的活动将通过应用发送出去。
你现在已经成功设置好了用户的活动,但是你需要填充用户输入的笔记的内容。为了做到这一点,我们在ViewController 类中重写 updateUserActivityState(_:) 方法来更新用户当前的活动。Handoff API 会定期的调用这个方法来更新当前用户的活动,添加下面代码到 ViewController 类中。
override func updateUserActivityState(activity: NSUserActivity) {activity.addUserInfoEntriesFromDictionary(["title": self.noteTitleField.text, "content": self.noteContentView.text])super.updateUserActivityState(activity)
}func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {self.updateUserActivityState(userActivity!)return true
}func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {self.updateUserActivityState(userActivity!)return true
}
updateUserActivityState(_:)方法传回一个当前用户活动的引用,使用应用中最新值来更新这个活动的userInfo字典中的值,注意调用父类方法。
同时实现 UITextFieldDelegate 协议的 textField( :shouldChangeCharactersInRange:replacementString:) 方法 和 UITextViewDelegate 协议的 textView( :shouldChangeTextInRange:replacementText:) 方法。在这两个方法中,当输入内容发生改变时更新用户的活动。然而这不是必须的,只是保证你的活动总是包含最新的内容。
现在你已经准备好测试你应用的Handoff。编译和运行你的应用在两个测试设备上。按下锁屏键让一个设备休眠,让另一个设备保持打开状态。打开刚刚锁屏的那个设备,你会发现在锁屏状态下应用图标出现在底部左上角。在图标上滑动将通过Handoff恢复应用。
或者,你可以双击home键进入应用,你的具有Handoff功能的应用会显示在主屏幕的左边。此时,你的应用仅仅恢复进入相同的空白的界面,现在让我妈来修复它。
4、从用户活动恢复
恢复应用从Handoff的NSUserActivity对象是由你应用的代理方法来处理的。应用代理传递用户活动的对象到应用的的根控制器去恢复自己。如果在你的应用中需要去处理活动的控制器不是根控制器,你可以在你的应用中简单的从根控制器沿着控制器向下传递直到你想要的地方。
打开 AppDelegate.swift 并且在AppDelegate类中添加下面方法:
func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]!) -> Void) -> Boolself.window?.rootViewController?.restoreUserActivityStat e(userActivity)return true
}
在这个方法中,你传递了用户的活动对象到应用的跟控制器,通过返回true,你告诉应用你已经成功的接收并处理了Handoff用户的活动。
下一步,打开ViewController.swift 并且在ViewController类中添加下面方法:
override func restoreUserActivityState(activity: NSUserActivity) {self.noteTitleField.text = activity.userInfo?["title"] as! Stringself.noteContentView.text = activity.userInfo?["content"] as! String
}
就像之前指导中的 updateUserActivityState(_:) 方法,你重写 restoreUserActivityState(_:) 方法从NSUserActivity对象中获取消息。在实现了这个方法后,你更新输入框后数据将会储存在用户活动的类中。
在你的两个设备中编译运行你的应用,并且在一个设备中开始写一个笔记。从另一个锁屏的设备或者是在应用交换的设备,通过Handoff打开应用,你应该能看到你在第一个设备中编写的文本。
5、错误处理和代理方法
不像苹果为iOS提供的大多数APIs,如果你不知道在哪里处理错误,当你使用Handoff时错误处理会变得不是很容易。首先,你的应用会通知Handoff错误通过代理类中的application(_:didFailToContinueUserActivityWithType:error:)方法,在这个方法中你可以确定什么造成错误的原因和错误的类型。注意 NSUserActivity 对象的类型是你唯一指派的。
当你的应用从Handoff活动中继续运行,首先需要的是通过蓝牙去下载关联的数据从原始的设备中,在这个下载完成之前,另一个代理方法将被调用:application(_:willContinueUserActivityWithType:)。在这个可选的方法中,你能返回一个布尔值去告诉Handoff API 是否你想要继续接收用户的活动。在某些情况,使得在满足某一条件的时候取消详细类型的 NSUserActivity 可能会有用。
结论
在这个指南中,我向你展示了如何在iOS8应用中容易的使用NSUserActivity类去适用Handoff功能。你创建了一个简单的应用,能够通过蓝牙无线的传递数据从一个设备到另一个设备。
虽然在这个指南中的示例应用很简单,你能在自己的应用中添加各种功能拥有许多用户活动的类型。最后,如果你有任何的评论或问题,请在评论栏中评论。
Handoff 指南相关推荐
- Handoff使用指南 - 理论篇
Handoff简介 Handoff是iOS 8 和 OS X v10.10中引入的功能,可以让同一个用户在多台设备间传递项目.In iOS 9 and OS X v10.11 支持了Spotlight ...
- iOS Handoff编程指南
http://benbeng.leanote.com/post/Handoff%E7%BC%96%E7%A8%8B%E6%8C%87%E5%8D%97-part1 关于Handoff Handoff是 ...
- iOS 8 Handoff 开发指南
(原文:Working with Handoff in iOS 8 作者:Gabriel Theodoropoulos 译者:半圆圆) 我想用下面这一个美妙的场景来开始这篇教程:假象一下你正在Mac上 ...
- MacOS基础用户指南-不断更新
Mac&macOS小白用户指南(不断更新) 一 Mac&macOS简介 App Store:苹果电脑软件商店 iTunes:在 Mac 上管理 iPhone 的利器 iTunes ...
- Transformer课程 业务对话机器人Rasa 3.x Fallback and Human Handoff
Transformer课程 业务对话机器人Rasa 3.x Fallback and Human Handoff Rasa 官网 https://rasa.com/blog/ Fallback and ...
- 黑苹果启动盘制作指南
黑苹果启动盘制作指南 技术支持: 黑苹果社区:osx.cx 镜像信息: 所属分类:MacOS High Sierra 适用平台:UEFI+GPT+APFS+Clover 软件版本:10.13.6(17 ...
- [ISUX译]iOS 9人机界面指南(三):iOS 技术
[ISUX译]iOS 9人机界面指南(三):iOS 技术 UI规范 summer 2015-11-29 3247浏览 0评论 专为0基础小白量身打造的UI设计入门课程(ps,ai软件+图标技巧),在线 ...
- 黑苹果固态硬盘_写给小白的黑苹果入门指南
1月底折腾目前这套黑苹果,到现在开始有点心得,知道个中的懵逼跟难处,特意发一文给各位新手小白解惑. 挑选合适的配置 CPU: 虽然AMD的CPU已经可以吃上黑果,但某些软件,例如Adobe全家桶会出现 ...
- WatchKit-Programming-Guide-Apple-Watch开发指南官方翻译及总结
鉴于CSDN的Markdown很多bug,大家请看这里: WatchKit-Programming-Guide-Apple-Watch开发指南官方翻译及总结 Overview ### Developi ...
最新文章
- 常用:javascript字符串函数 收藏
- Java黑皮书课后题第10章:10.4(MyPoint类)设计一个名为MyPoint的类,代表一个以x坐标和y坐标表示的点
- 数据库查询:列出各个部门中工资高于本部门平均工资的员工信息,并按部门号排序。
- c gui qt 4编程第二版_一本专门学习PyQt5 GUI编程的书
- 2.LVS的三种工作模式_NAT模式
- 网页版WebRTC多人聊天Demo
- 安装成功后python报错_python安装mysql的依赖包mysql-python操作
- 以写代学:python 元组
- 【腾讯云技术沙龙预告】云端数据库的设计之美
- android的keystore多个别名,关于android:KeyStore找不到我的别名的密钥
- 谱聚类算法入门教程(三)—— 求f^TLf的最小值
- fresco 显示缩略图,不直接使用setImageURI,防止卡顿和显示不全:纯黑色或纯白色
- 【附源码】计算机毕业设计java学生网上请假系统设计与实现
- 用Android手机远程桌面连接登陆Windows10(用微软账号登陆),Microsoft账户登陆的计算机远程桌面连接问题
- 在线视频网站加密技术详解
- Java实现根据Word模板填充表格数据(poi方式),以及doc和docx转PDF,最全最详细版本,解决外部引用jar在linux上报ClassNotFound的问题。
- Linux Kernel suspend/resume 过程
- BI分析工具软件有哪些
- 海康威视测试实习生面试经历
- 全球与中国汽车点火线圈市场深度研究分析报告