喜欢该系列文章的可以移步原作者处:
Continuty,描述了在多个ios,osX设备之间的无缝切换的能力 ,持续未完成的工作。HandOff是实现Continuty的一种技术
HandOff基于user activities,user activities封装了用户当前的状态。一个activity 与一个用户类型相关联,操作系统用这个类型去决定是否应该用activity来恢复用户的状态
HandOff工作原理:首先用bluetooth LE去发现在身边的具有相同的iColud account 的设备。 如果当前的app使能 HandOff,他就能发现一个设备去重新恢复当前的activity, 这个inactivity将显示一个通知去告诉用户可以从当前设备到inactivity设备之间进行切换
当用户选择持续the activity时,the sending activity将传递activity object到这个continuing the device,从而可以持续的进行活动
这里尝试用HandOff来掌控地图数据在不同设备的同一个应用之间传递数据的过程,当用一台设备打开地图定位到某个区域后,用另外的设备用hand Off技术打开相同的app定位到相同的区域
为一个App准备HandOff
为了一个app去handOff,需要保持一个或多个NSUserActivity Objects .这些Objects封装了用户当前的状态,用它可以恢复当前设备的状态在另外一个设备上。IOS8 介绍了UIResponder的一些新的属性,userActivity.因为UIViewController是UIResponder的子类,所以在view controller里可以方便的使用user activity来保存用户的当前的状态
在这个教程,user activity被配置在view did load 方法里面
在这里设定了needs save 属性为真。每次用户和app交互时,系统将周期性的调用updateUserActivityState()在view controller里的子类,在这个方法里面保存用户的状态,就是那些需要在另外一个app恢复的数据
在当前例子中,保存了地图的可见range,地图当前的位置信息,保存进到userinfo 这个词典中
userinfo这个词典可以保存的类型有NSString,NSNumber,NSData,NSURL等,不能保存MKCoordinateRegion结构体,因此把这个结构体转化为NSData 对象。
MKCoordinateRegion是一个纯swift的结构体,并没有实现NSCoding协议,所以这里不能用archiver
MKCoordinateRegion结构体时值类型的,没有非值的对象,因此能够用NSData 去复制bytes
如果有很多的数据去存储,去传递,userinfo并不是一个好的地方去保存这些数据。苹果建议user activity object所保存的数据不要超过3kb.
在每次UI update 的时候,needsSave属性都应被设置为true.在这个例子中,当用户每次用pans或zooms时, the region changes。
到此为止,一个app去支持HandOff的所有设置都完毕,但还需要一个app去恢复activity
恢复Activity
当系统在本地的区域内发现一个支持handOff的设备时,系统就必须做出一个决定是否他有一个app去掌控它。在info.plist中key: NSUserActivityTypes所指向的是一个数组,这个数组中应包含所有的activity type
仅仅能够HandOff被相同的开发者签名的程序
当用户选择continue the activity时,你的app将开始工作,在app delegate中两个新的方法将会被调用
第一个方法通知activity将会被continue,在这个方法里面,只有activity的类型是可用的,并不是activity本身。因为activity需要在两个设备之间的传递需要花费一定的时间。在这个方法里面,可以为指定的activity来准备一些数据。比如load指定的view controller,导航到app指定的区域
一旦activity到达指定的设备上了,第二个协议的方法将会被调用,在这个方法里用activity里的信息来恢复更新UI界面
第二个方法带了一个restorationHandler closure,他带了UIResponder对象的一个数组并且会调用方法:restoreActivityState(-)方法为这个数组中的每一个对象
这里检查是否能够对正确的activity type做出响应
HandOff的功能十分强大,他可以在不同设备的同一个app之间,也可以发生在不同app和网页之间,换句话说,当你用mac来浏览网页时,你能够用iosapp去handOff