Handoff使用指南 - 理论篇

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

  • 系统管理
    • 当响应者知道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. 普通模式,正常处理

    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

时间: 2024-10-10 16:14:54

Handoff使用指南 - 理论篇的相关文章

深入解析病毒(一)理论篇

猪年送安康,祝大家新一年健康.快乐.愿大家都做一个勤奋努力.真诚奉献的人,幸运会永远的眷顾你们.?引子:?某一天饶有兴趣在卡饭上浏览着帖子,故事的相遇就那么简单.当时一条评论勾起我的好奇心,那么好逆向开始.?根据我的习惯,拿到样本我会线上恶意代码分析,直接拉到virustotal之类的网站上,看看是否已经被大多数杀毒软件所能识别,看一些有价值的数据,如下图所示:??????????????????图片一:基本信息?当看到这个页面时候,看到最后的分析日期是18年11月,又看了一下导出表的函数信息,

如何编写高质量的 JS 函数(3) --函数式编程[理论篇]

本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/EWSqZuujHIRyx8Eb2SSidQ作者:杨昆 [编写高质量函数系列]中, <如何编写高质量的 JS 函数(1) -- 敲山震虎篇>介绍了函数的执行机制,此篇将会从函数的命名.注释和鲁棒性方面,阐述如何通过 JavaScript 编写高质量的函数. <如何编写高质量的 JS 函数(2)-- 命名/注释/鲁棒篇>从函数的命名.注释和鲁棒性方面,阐述如何通过 JavaScri

Spark性能优化指南——高级篇

Spark性能优化指南--高级篇 [TOC] 前言 继基础篇讲解了每个Spark开发人员都必须熟知的开发调优与资源调优之后,本文作为<Spark性能优化指南>的高级篇,将深入分析数据倾斜调优与shuffle调优,以解决更加棘手的性能问题. 数据倾斜调优 调优概述 有的时候,我们可能会遇到大数据计算中一个最棘手的问题--数据倾斜,此时Spark作业的性能会比期望差很多.数据倾斜调优,就是使用各种技术方案解决不同类型的数据倾斜问题,以保证Spark作业的性能. 数据倾斜发生时的现象 绝大多数tas

Spark性能优化指南——基础篇

前言 在大数据计算领域,Spark已经成为了越来越流行.越来越受欢迎的计算平台之一.Spark的功能涵盖了大数据领域的离线批处理.SQL类处理.流式/实时计算.机器学习.图计算等各种不同类型的计算操作,应用范围与前景非常广泛.在美团•大众点评,已经有很多同学在各种项目中尝试使用Spark.大多数同学(包括笔者在内),最初开始尝试使用Spark的原因很简单,主要就是为了让大数据计算作业的执行速度更快.性能更高. 然而,通过Spark开发出高性能的大数据计算作业,并不是那么简单的.如果没有对Spar

IHERB上待产包准备指南-妈妈篇

准妈妈怀孕期间会出现很多皮肤问题,比如皮肤长斑,黑色素沉积,脸色暗黄,颈纹加深,皮肤干燥或者皮肤出油等,因此这个特殊时期的皮肤护理是非常关键的.这时准妈妈们要放弃自己平时用的护肤品了,安全性很重要.准妈妈选择护肤品一定要选择天然不刺激的.因为在怀孕期间,皮肤会变得敏感,使用平时用的护肤品,可能会对宝宝造成影响,而且也容易造成孕妇皮肤不适应.孕妇使用的护肤品,应该是不含任何化学添加剂的,对人体和宝宝都没有任何伤害.今天我们来看看Iherb上有哪些适合宝宝妈妈使用的热卖产品.(点击对应产品链接可定位

【SSH2(理论篇)】--Struts2配置详解

上篇博客讨论了SSH2框架模型,在开发过程中发现SSH2的开发模型其实类似于经典的三层模式,在每一层中分别添加了不同的框架,显示层使用的是Struts2进行配置的,业务逻辑层使用的是Spring配置,数据持久层则采用的是Hibernate,开发模式简单易懂,接下来将会分别从三层着手讨论每一层的运行内容. 一.Struts体系简介 struts,是Apache软件基金会(ASF)赞助的一个开源项目,它通过采用Java Servlet/JSP技术,实现了基于Java EE Web应用的Model-V

【机器学习】Logistic Regression 的前世今生(理论篇)

Logistic Regression 的前世今生(理论篇) 本博客仅为作者记录笔记之用,不免有非常多细节不正确之处. 还望各位看官能够见谅,欢迎批评指正. 博客虽水,然亦博主之苦劳也. 如需转载,请附上本文链接,不甚感激! http://blog.csdn.net/cyh_24/article/details/50359055 写这篇博客的动力是源于看到了以下这篇微博: 我在看到这篇微博的时候大为触动,由于,如果是rickjin来面试我.我想我会死的非常慘,由于他问的问题我基本都回答不上来.

美团Spark性能优化指南——基础篇

http://tech.meituan.com/spark-tuning-basic.html 前言 在大数据计算领域,Spark已经成为了越来越流行.越来越受欢迎的计算平台之一.Spark的功能涵盖了大数据领域的离线批处理.SQL类处理.流式/实时计算.机器学习.图计算等各种不同类型的计算操作,应用范围与前景非常广泛.在美团?大众点评,已经有很多同学在各种项目中尝试使用Spark.大多数同学(包括笔者在内),最初开始尝试使用Spark的原因很简单,主要就是为了让大数据计算作业的执行速度更快.性

Logistic Regression 的前世今生(理论篇)

[机器学习]Logistic Regression 的前世今生(理论篇) 本博客仅为作者记录笔记之用,不免有很多细节不对之处. 还望各位看官能够见谅,欢迎批评指正. 博客虽水,然亦博主之苦劳也. 如需转载,请附上本文链接,不甚感激! http://blog.csdn.net/cyh_24/article/details/50359055 写这篇博客的动力是源于看到了下面这篇微博: 我在看到这篇微博的时候大为触动,因为,如果是rickjin来面试我,我想我会死的很惨,因为他问的问题我基本都回答不上