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. idea+git

    http://www.cnblogs.com/java-maowei/p/5950930.html

  2. 【bzoj1057】棋盘制作

    题意 给定\(n*m\)的棋盘,每个格子有0或1其中的一种颜色. 求一个最大的正方形,满足正方形内0和1相互间隔. 求一个最大的矩形,满足矩形内0和1相互间隔. \(n,m\leq 2000\) 分析 ...

  3. 【MYSQL】update/delete/select语句中的子查询

    update或delete语句里含有子查询时,子查询里的表不能在update或是delete语句中,如含有运行时会报错:但select语句里含有子查询时,子查询里的表可以在select语句中. 如:把 ...

  4. 第四周 更新Scrum站立会议

    项目名称:连连看游戏(C#) 小组名称:4Boys 小组成员:武志远.李权.张金生.张政 站立会议内容 昨天完成的: 1.张金生主要介绍了自己完成了游戏界面 2.武志远主要负责查阅关于技术方面的资料, ...

  5. hdu---(1421)搬寝室(dp)

    搬寝室 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...

  6. Visual Studio中的快捷键

    我们在使用Visual Studio的时候,如用一些快捷键,就能减少我们键盘和鼠标来回切换的次数,从而提高我们编码的速度,在此跟大家分享一些经常Visual Studio中用到的快捷键 自动缩进:选中 ...

  7. 5. Longest Palindromic Substring -- 最长回文字串

    Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...

  8. Could not load file or assembly 'System.Web.Mvc' or one of its dependencies. The located assembly's manifest definition does not

    因为用了MVC,在本地是没有问题的,但是部署在服务器就出现了这个问题. 出错界面如下图 原因分析:上面的出错提示最后一句话翻译过来.找到的程序集清单定义与程序集引用不匹配.也就是程序引用的程序集版本和 ...

  9. Hibernate缓存机制

    缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能.缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事 ...

  10. Quoted-printable 编码介绍、编码解码转换

    求教,“=B9=A4=D7=F7=BC=F2=B1=A8” 这种是什么编码方式? Quoted-printable 可译为“可打印字符引用编码”.“使用可打印字符的编码”,我们收邮件,查看信件原始信息 ...