zoukankan      html  css  js  c++  java
  • 开发基于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  。欢迎大家访问!

     
  • 相关阅读:
    iOS提交后申请加急审核
    EF5.0修改实体的时候,出现“对一个或多个实体的验证失败。有关详细信息,请参见“EntityValidationErrors”属性这个错误
    验证码生成-->漂亮啊
    用js将毫秒时间转成正常时间
    Ajax异步请求-简单模版
    unity3d自己写角色移动脚本
    unity3d实现序列帧动画
    unity3d切换场景时,背景音乐保持播放
    C#给文件重命名
    NGUI如何创建自己的精灵图集
  • 原文地址:https://www.cnblogs.com/Ice-snowPride/p/5006452.html
Copyright © 2011-2022 走看看