开发基于Handoff的App(Swift)

        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.     
  6.   return true  
  7. }  

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

(4)运行效果如下:

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

 
原文地址:https://www.cnblogs.com/Ice-snowPride/p/5006452.html