iOS8推出一个新特性,叫做Handoff。Handoff中文含义为换手(把接力棒传给下一个人),可以在一台Mac和iOS设备上开始工作,中途将工作交换到另一个Mac或iOS设备中进行。这个在iOS8和Yosemite得到支持,当然在iOS9和EI Captain中也有这个功能。

     Handoff中使用了一个“活动”的概念,它可以在多台设备间传递用户的“活动”。当用户从一台设备切换到另一台设备后,用户完全可以不中断原有的“活动”,也不需要重新配置应用程序。在这个过程中,Handoff将自动在iOS设备和Mac间保持应用程序的同步。

本应用实现了在两台iOS设备之间的协同工作。当在一台iOS设备上运行该应用时,打开另一台安装该应用的iPhone,可以快速看到同样的显示内容。可以快速实现多台设备的同步,提高了工作效率。这里我将通过Swift来实现。项目我已经上传 https://github.com/chenyufeng1991/Handoff  。

(1)创建一个iOS项目,首先在Info.plist文件中加入一个字段,NSUserActivityTypes,值可以任意,但是要唯一,我这里是:com.chenyufengweb.HandoffDemo.sync。到时候我会在代码中用到。

(2)在AppDelegate.swift中实现一个方法如下:

  1. func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool {
  2. print("AppDelegate -- continueUserActivity")
  3. let topViewController = self.window?.rootViewController as! AnyObject
  4. restorationHandler([topViewController])
  5. return true
  6. }

(3)在ViewController.swift中实现如下:

  1. import UIKit
  2. class ViewController: UIViewController,NSUserActivityDelegate {
  3. @IBOutlet weak var textField: UITextField!
  4. @IBOutlet weak var switchButton: UISwitch!
  5. var str:String!
  6. var isOn:String!
  7. override func viewDidLoad() {
  8. super.viewDidLoad()
  9. let myActivity:NSUserActivity! = NSUserActivity(activityType: "com.chenyufengweb.HandoffDemo.sync")
  10. str = textField.text
  11. isOn = switchButton.on ? "on" : "off"
  12. //定义一个字典;
  13. let items = ["text":str,"switch":isOn]
  14. //配置活动参数;
  15. myActivity.userInfo = items
  16. myActivity.title = "sync"
  17. myActivity.becomeCurrent()
  18. myActivity.delegate = self
  19. myActivity.needsSave = true
  20. self.userActivity = myActivity
  21. //以代码的方式进行消息响应;
  22. //    self.textField.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.ValueChanged)
  23. //    self.switchButton.addTarget(self, action: "onChanged", forControlEvents: UIControlEvents.ValueChanged)
  24. }
  25. func textFieldDidChange() -> Void{
  26. print("Text changed")
  27. self.userActivity?.becomeCurrent()
  28. self.userActivity?.needsSave = true
  29. }
  30. func onChanged() -> Void{
  31. print("Switch changed")
  32. self.userActivity?.becomeCurrent()
  33. self.userActivity?.needsSave = true
  34. }
  35. //以segue的方式进行控件响应,个人比较喜欢;
  36. @IBAction func textFieldDidChange(sender: AnyObject) {
  37. print("Text changed")
  38. self.userActivity?.becomeCurrent()
  39. self.userActivity?.needsSave = true
  40. }
  41. @IBAction func onChanged(sender: AnyObject) {
  42. print("Switch changed")
  43. self.userActivity?.becomeCurrent()
  44. self.userActivity?.needsSave = true
  45. }
  46. //MARK: - Handoff
  47. /*
  48. 注意:userActivityWillSave()方法和userActivityWasContinued()这两个方法在当前进行操作的设备A上执行;
  49. restoreUserActivityState()方法在打开另一个设备B上执行;
  50. */
  51. //把当前的数据存储到字典中;
  52. func userActivityWillSave(userActivity: NSUserActivity) {
  53. print("ViewController userActivityWillSave")
  54. str = textField.text
  55. isOn = switchButton.on ? "on" : "off"
  56. let items = ["text" : str,"switch" : isOn]
  57. userActivity.addUserInfoEntriesFromDictionary(items)
  58. print("userActivityWillSave:\(str),  \(isOn)")
  59. }
  60. func userActivityWasContinued(userActivity: NSUserActivity) {
  61. print("ViewController userActivityWasContinued")
  62. //
  63. //    let dictionary:NSDictionary = (userActivity.userInfo)!
  64. //    let textForKey = dictionary.objectForKey("text") as! String
  65. //    let switchForKey = dictionary.objectForKey("switch") as! String
  66. //    print("text = \(textForKey),switch = \(switchForKey)")
  67. //
  68. }
  69. //从字典中读出数据;
  70. override func restoreUserActivityState(activity: NSUserActivity) {
  71. print("ViewCOntroller restoreUserActivityState")
  72. let dictionary:NSDictionary = (activity.userInfo)!
  73. let textForKey = dictionary.objectForKey("text") as! String
  74. let switchForKey = dictionary.objectForKey("switch") as! String
  75. print("text = \(textForKey),switch = \(switchForKey)")
  76. self.textField.text = textForKey
  77. if (switchForKey == "on"){
  78. self.switchButton.on = true
  79. print("ononononon")
  80. }else{
  81. self.switchButton.on = false
  82. print("offoffoffoffoff")
  83. }
  84. }
  85. }

(4)运行效果如下:

github主页:https://github.com/chenyufeng1991  。欢迎大家访问!

 

开发基于Handoff的App(Swift)的更多相关文章

  1. IOS开发-基于WebDriverAgent代理服务,实现iOS手机app自动化测试的框架搭建

    导引 iOS自动化测试一直使用的appium,iOS系统升级至10.0 Xcode8.0之后,改用WebDriverAgent代理服务作为server,编写了一套基于WebDriverAgent服务 ...

  2. 【iOS-Android开发对照】 之 APP入口

    [iOS-Android开发对照]之 APP入口 [图片 Android vs iOS] 提纲 对照分析iOS,Android的入口, iOS,Android的界面单元 为什么要有那样的生命周期 继承 ...

  3. 利用C#开发移动跨平台Hybrid App(一):从Native端聊Hybrid的实现

    0x00 前言 前一段时间分别读了两篇博客,分别是叶小钗兄的<浅谈Hybrid技术的设计与实现>以及徐磊哥的<从技术经理的角度算一算,如何可以多快好省的做个app>.受到了很多 ...

  4. 成都app开发:架构一个App需要学会哪些技术呢?

    成都亿合科技小编为您分享: 随着APP应用的流行,越来越多的人想自己学习怎么开发APP应用,那架构一个APP需要学些什么技术呢?首先要了解App都有哪些类型,不同的类型适用于哪些需求,用户可以根据自己 ...

  5. 【转】基于laravel制作APP接口(API)

    这篇文章主要介绍了基于laravel制作APP接口(API)的相关资料,需要的朋友可以参考下 前期准备 前言,为什么做以及要做个啥本人姓小名白,不折不扣编程届小白一名,但是自从大一那会儿接触到编程这件 ...

  6. 《Swift开发指南》国内第一本Swift图书上市了

    <Swift开发指南>国内第一本Swift图书上市了 既<courseId=799262">苹果Swift编程语言开发指南>视频教程地址:courseId=79 ...

  7. 移动跨平台开发框架Ionic开发一个新闻阅读APP

    移动跨平台开发框架Ionic开发一个新闻阅读APP 前言 这是一个系列文章,从环境搭建开始讲解,包括网络数据请求,将持续更新到项目完结.实战开发中遇到的各种问题的解决方案,也都将毫无保留的分享给大家. ...

  8. delphi不同版本字符串类型的演化(要支持基于firemonkey的app调用,字符串最好使用olevariant类型)

    string,DELPHI2009以前的版本string=ansistring,一个字符占一个字节,DELPHI2009及以上版本string=unicodestring,一个字符占二个字节. cha ...

  9. 《Flask Web开发——基于Python的Web应用开发实践》一字一句上机实践(上)

    目录 前言 第1章 安装 第2章 程序的基本结构 第3章 模板 第4章 Web表单 第5章 数据库 第6章 电子邮件 第7章 大型程序的结构   前言 学习Python也有一个半月时间了,学到现在感觉 ...

随机推荐

  1. Integer封装与拆箱

    Integer封装与拆箱 简介: 目录: Integer自动封装的陷阱 Integer自动拆箱机制 Integer自动封装的陷阱 public class IntegerDemo { public s ...

  2. J2EE 第二阶段项目之部署项目、分工安排

    SVN 先通过使用教程,和能够介绍了解svn. svn使用教程总结   ;   svn功能介绍. 分工安排:我的任务就是项目统计. 1 效益统计 1 教育效益统计表 (教育效益统计表,增,改,查看,查 ...

  3. 自我总结(五)---(学习j2ee)

    自我完善的过程就是在不断的自我总结不断的改进. 我们这半个月来都是学习j2ee.这个知识是很重要的,一般我们出去工作都是会用到的.我们的星期六,星期天也是不上课的.所以说我相当于上了十天的j2ee了. ...

  4. 【CITE】VS2012程序打包部署

      选择Debug模式将项目重新生成,并保证没有任何bug   选择解决方案,右击——添加——新建项目——安装和部署   下载过打包工具InstallShield2013LimitedEdition, ...

  5. node.js关于传送数据的二三事

    配置好node环境后 书写代码 目录结构: . 代码: <!DOCTYPE html> <html lang="en"> <head> < ...

  6. robotframework笔记27

    文档格式 可以使用简单的HTML格式 测试套件 , 测试用例 和 用户关键字 文档和 免费测试套件 元数据 在测试数据,以及当 记录测试 库 . 格式类似于大多数使用的风格 维基百科,它被设计成可以理 ...

  7. robotframework笔记3--如何编写好的测试用例使用机器人的框架

    命名 测试套件的名称   之后,你可能应该描述你的名字. 名称是从文件或目录名自动创建: 扩展了. 强调了转换空间. 如果名称都是小写,大写的单词是. 名称可以是比较长的,但是太长的名字不方便 文件系 ...

  8. SQL Server 一列或多列重复数据的查询,删除

    业务需求 最近给公司做一个小工具,把某个数据库(数据源)的数据导进另一个数据(目标数据库).要求导入目标数据库的数据不能出现重复.但情况是数据源本身就有重复的数据.所以要先清除数据源数据. 于是就把关 ...

  9. Android开发--环境配置

    1.下载android adt和sdk adt: 新建链接http://dl.google.com/android/ADT-xx.x.x.zip下载adt 注:xx为需要下载adt的版本号,可以在官网 ...

  10. 转 velocity 模板使用总结

    Velocity是一个基于java的模板引擎.它允许任何人仅仅简单的使用模板语言来引用由java代码定义的对象. 当Velocity应用于web开发时,界面设计人员可以和java程序开发人员同步开发一 ...