Handoff使用指南 - 理论篇

转载 2016年08月29日 09:23:54

Handoff简介


Handoff是iOS 8 和 OS X v10.10中引入的功能,可以让同一个用户在多台设备间传递项目。In iOS 9 and OS X v10.11 支持了Spotlight中搜索并打开应用。


Handoff交互:


1.在你的app中为每一个活动创建一个user activity 对象
2.定期使用用户的信息更新user activity对象
3.当用户请求时在不同的设备上继续用户活动


在iOS中这个user activity object是UIKit中的 NSUserActivity类。


Handoff需要的硬性条件:


  • 互通的所有设备必须支持 Buletooth LE 4.0,Handoff使用BLE信号来传递用户活动数据。

  • 所有设备必须连到同一个iCloud账户。

  • 当然你还得保证当前设备的Handoff功能打开了(iOS:设置->通用->Handoff 与建议的应用程序。 Mac:系统偏好设置->通用,倒数第二栏有个选项,"允许这台Mac和iCloud设备之间使用Handoff")


BLE并不像传统的蓝牙,并不需要人工手动进行配对,只要打开就行了,所有的配对数据传输都是自动完成的;设备并不一定需要连在同一个WIFI网络中,Handoff的活动基础数据通过BLE进行传递,较大的数据通过iCloud同步(通过网络streams,比如邮件中有个图片)。



工作流程


Handoff编程的核心类便是NSUserActivity了,代表着一个用户的活动,每一个Activity都有一个activityType,用来标识Activity的类型。当App间进行Handoff的话,需要满足下面几个条件:


  • 在iCloud 中使用相同的 Apple ID登录

  • 和发布Activity的App拥有相同的TeamID

  • 在应用中你想要支持的Target的Info.plist文件中加入活动标识NSUserActivityTypes


第三方开发的app必须通过App Store发布或者使用注册开发者签名。启动了Handoff功能的app,在使用期间Handoff消息会通过BLE进行分发,iOS设备接收到消息后会检查与起始app是否具有相同TeamID以及相同NSUserActivityTypes,如果找到了则在“另一部”设备中显示推荐app。


User Activity 对象


NSUserActivity对象存储用户的活动信息,实现在不同设备上的继续工作。起始app必须显式调用becomeCurrent或者基于文件的app(Document-based apps)进入前台时,给在视图层级中的UIViewController对象设置文件的NSUserActivity对象来启用Handoff功能。将其设置resignCurrent或者Document-based app的NSUserActivity对象设置为nil停用。


NSUserActivity对象的唯一标示是 activityType and title 属性(document name or web page title)。通过eligibleForSearch、 keywords and contentAttributeSet 属性的支持,可以使其app支持Spotlight搜索结果中显示。通过 expirationDate设置失效时间。


NSUserActivity对象通过userInfo dictionary 属性来存储并共享数据信息。


User Activity 同步机制


User Activity的同步机制分两种:延时更新(lazy updating )和系统管理。


  • Lazy updating 


  1. 需要同步的用户数据有更新时,将User Activity对象的 needsSave属性设置为YES


  2. NSUserActivity将要共享数据之前,会调用起始app的userActivityWillSave: 方法(NSUserActivityDelegate),在此方法中通过NSUserActivity method addUserInfoEntriesFromDictionary: 方法merge相关状态信息到userInfo 对象中。调用完此方法,系统会将needsSave属性重置为NO。


  • 系统管理


  1. 当响应者知道activity的状态已修改,它必须设置needsSave设置为YES(When the responder knows that the activity state is dirty, it must set the object’s needsSave property to YES. )。系统会在合适的时间自动同步NSUserActivity 对象,首先会通过updateUserActivityState:回调给响应者更新activity’s state的机会。你的响应者子类必须重写updateUserActivityState:方法来给user activity对象添加状态数据(在此方法中通过NSUserActivity method addUserInfoEntriesFromDictionary: 方法merge相关状态信息到userInfo 对象中)。如果多个响应者共用一个NSUserActivity对象,当系统更新user activity对象时,它们都会收到updateUserActivityState:回调。在更新回调发送之前,activity对象的userInfo字典会被清空。


使用App Delegate来继续activity的使用


在非document app中,通过Handoff启动响应者app的时候,会在app的delegate中收到application:willContinueUserActivityWithType:和application:continueUserActivity:restorationHandler:消息,分四种情况处理:


1.普通模式,正常处理


func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]!) -> Void) -> Bool {
self.window?.rootViewController?.restoreUserActivityState(userActivity)
return true
}
override func restoreUserActivityState(activity: NSUserActivity) {
self.noteTitleField.text = activity.userInfo?["title"] as! String
self.noteContentView.text = activity.userInfo?["content"] as! String
}



2. 如果需要其他响应者或者文件对象来恢复user activity,则需要调用block,数组包括UIResponder集合,然后会让每个对象收到restoreUserActivityState: 消息。


3. 如果你继续的activity是通过搜索列表而来,那可以在这里重新设置keyword。


4. 如果没有实现application:continueUserActivity:restorationHandler:或者返回NO,并且app是基于文件的(document-based),AppKit可以自动恢复用默认的NSUserActivity对象。在这种情况,文件会使用NSDocumentController的方法openDocumentWithContentsOfURL:display:completionHandler: 来打开,并且会收到一条restoreUserActivityState: 消息。


基于文件的app中支持User Activity


基于文件的app如果Info.plist中添加了CFBundleDocumentTypes则默认支持Handoff功能。NSUbiquitousDocumentUserActivityType 对应的字符串作为NSUserActivity对象的activity type。基于iCloud来同步文件,并且自动生成并存储到fileURL属性中,如果app delegate方法application:continueUserActivity:restorationHandler:返回NO,或者没有实现,那么AppKit可以自动恢复用上面方式创建的NSUserActivity对象。在这种情况,文件会使用NSDocumentController的方法openDocumentWithContentsOfURL:display:completionHandler: 来打开,并且会收到一条restoreUserActivityState: 消息。


总结


Handoff可以实现iOS8之后的设备之间的“连续互动”,基于UIDocument 的文件app(Info.plist实现了CFBundleDocumentTypes)则默认支持Handoff功能。非文件的app需要实现NSUserActivityTypes在Info.plist中,然后可以分为laze和系统管理两种同步机制。看的一些blog说需要连接同一网络,其实是没有必要的。可以通过apple自己提供的默认支持app来做测试(Mac 访问Safari,手机关闭wifi也会有提示)


iphone左下角的提醒应用图标的机制有三种方式,Handoff只是其中一种,后面我会有单独介绍着三种的实现及却别。


参考资料
https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/Handoff/HandoffFundamentals/HandoffFundamentals.html#//apple_ref/doc/uid/TP40014338-CH3-SW1


iPhone最烦人的6个功能:90%的人会关闭

iPhone最烦人的6个功能:90%的人会关闭 2016-05-03 12:08:43 来源: 驱动之家MyDrivers iPhone虐我千百遍,我待iPhone如初恋!高傲的iPhon...
  • YLGWHYH
  • YLGWHYH
  • 2016年05月03日 13:50
  • 606

iPhone最烦人的6个功能:90%的人会关闭

iPhone最烦人的6个功能:90%的人会关闭 2016-05-03 12:08:43 来源: 驱动之家MyDrivers iPhone虐我千百遍,我待iPhone如初恋!高傲的iPhon...
  • YLGWHYH
  • YLGWHYH
  • 2016年05月03日 13:50
  • 606

红黑树: 理论与实现(理论篇)_Null

导读: 红黑树: 理论与实现(理论篇)[修订版]原创:司徒彦南 2002年8月19日 红黑树是一种很有意思的平衡检索树。它的统计性能要好于平衡二叉树(有些书籍根据作者姓名,Adelson-Velsk...
  • chief1985
  • chief1985
  • 2008年04月08日 10:49
  • 3378

iOS开发——Handoff详解

iOS8推出一个新特性,叫做Handoff。Handoff中文含义为换手(把接力棒传给下一个人),可以在一台Mac和iOS设备上开始工作,中途将工作交换到另一个Mac或iOS设备中进行。这个在iOS8...
  • CHENYUFENG1991
  • CHENYUFENG1991
  • 2015年10月17日 01:06
  • 1979

unix core 问题定位-基础知识

一,基础知识:C++函数调用和c一样是从右到左入栈的,例如:exa.foo(12);则首先被压进12,然后在此函数被调用的地方压进对象的exa的首地址被压进(放在si),因为它是被选中的对象的首地址所...
  • studycpp
  • studycpp
  • 2005年12月24日 15:02
  • 549

Handoff 指南

原文An Introduction to HandoffHandoff 指南介绍在ios8 和 OSX Yosemite中,苹果引入了一个Handoff的新特性让开发者使用。Handoff 允许应用通...
  • tzshlyt
  • tzshlyt
  • 2016年08月01日 11:50
  • 480

iOS开发-小白(新手)必看,基础常识

快速浏览大纲 Mac & OS X App Store、iTunes Store、iTunes、Apple Store 这些名称 常用的快捷键 Multi-Touch 触控板手势 ...
  • a910577347
  • a910577347
  • 2016年11月24日 15:11
  • 856

Cassandra HintedHandoff

Cassandra HintedHandoff
  • wh62592855
  • wh62592855
  • 2010年08月03日 18:50
  • 921

openstack swift的副本存放位置解析

我们知道在swift中的副本一般是3个,但是对于这三个副本放在哪里?或者存储位置是怎么选择的呢?这段代码是在/common/ring/ring.py文件中的,现在我们来看看这段代码 def get_m...
  • dasgk
  • dasgk
  • 2015年01月16日 10:40
  • 1032

用户画像的思考

最近看了很多的关于用户画像的文章,在此处总结下用户画像的目的、如何构建及如何使用。 什么是用户画像 用户画像是根据用户社会属性、生活习惯和消费行为等信息而抽象出的一个标签化的用户模型。 用户的画像是...
  • l504279018
  • l504279018
  • 2016年12月25日 17:47
  • 709
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Handoff使用指南 - 理论篇
举报原因:
原因补充:

(最多只允许输入30个字)