开发基于Handoff的App(Swift)
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中实现一个方法如下:
- func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool {
- print("AppDelegate -- continueUserActivity")
- let topViewController = self.window?.rootViewController as! AnyObject
- restorationHandler([topViewController])
- return true
- }
(3)在ViewController.swift中实现如下:
- import UIKit
- class ViewController: UIViewController,NSUserActivityDelegate {
- @IBOutlet weak var textField: UITextField!
- @IBOutlet weak var switchButton: UISwitch!
- var str:String!
- var isOn:String!
- override func viewDidLoad() {
- super.viewDidLoad()
- let myActivity:NSUserActivity! = NSUserActivity(activityType: "com.chenyufengweb.HandoffDemo.sync")
- str = textField.text
- isOn = switchButton.on ? "on" : "off"
- //定义一个字典;
- let items = ["text":str,"switch":isOn]
- //配置活动参数;
- myActivity.userInfo = items
- myActivity.title = "sync"
- myActivity.becomeCurrent()
- myActivity.delegate = self
- myActivity.needsSave = true
- self.userActivity = myActivity
- //以代码的方式进行消息响应;
- // self.textField.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.ValueChanged)
- // self.switchButton.addTarget(self, action: "onChanged", forControlEvents: UIControlEvents.ValueChanged)
- }
- func textFieldDidChange() -> Void{
- print("Text changed")
- self.userActivity?.becomeCurrent()
- self.userActivity?.needsSave = true
- }
- func onChanged() -> Void{
- print("Switch changed")
- self.userActivity?.becomeCurrent()
- self.userActivity?.needsSave = true
- }
- //以segue的方式进行控件响应,个人比较喜欢;
- @IBAction func textFieldDidChange(sender: AnyObject) {
- print("Text changed")
- self.userActivity?.becomeCurrent()
- self.userActivity?.needsSave = true
- }
- @IBAction func onChanged(sender: AnyObject) {
- print("Switch changed")
- self.userActivity?.becomeCurrent()
- self.userActivity?.needsSave = true
- }
- //MARK: - Handoff
- /*
- 注意:userActivityWillSave()方法和userActivityWasContinued()这两个方法在当前进行操作的设备A上执行;
- restoreUserActivityState()方法在打开另一个设备B上执行;
- */
- //把当前的数据存储到字典中;
- func userActivityWillSave(userActivity: NSUserActivity) {
- print("ViewController userActivityWillSave")
- str = textField.text
- isOn = switchButton.on ? "on" : "off"
- let items = ["text" : str,"switch" : isOn]
- userActivity.addUserInfoEntriesFromDictionary(items)
- print("userActivityWillSave:\(str), \(isOn)")
- }
- func userActivityWasContinued(userActivity: NSUserActivity) {
- print("ViewController userActivityWasContinued")
- //
- // let dictionary:NSDictionary = (userActivity.userInfo)!
- // let textForKey = dictionary.objectForKey("text") as! String
- // let switchForKey = dictionary.objectForKey("switch") as! String
- // print("text = \(textForKey),switch = \(switchForKey)")
- //
- }
- //从字典中读出数据;
- override func restoreUserActivityState(activity: NSUserActivity) {
- print("ViewCOntroller restoreUserActivityState")
- let dictionary:NSDictionary = (activity.userInfo)!
- let textForKey = dictionary.objectForKey("text") as! String
- let switchForKey = dictionary.objectForKey("switch") as! String
- print("text = \(textForKey),switch = \(switchForKey)")
- self.textField.text = textForKey
- if (switchForKey == "on"){
- self.switchButton.on = true
- print("ononononon")
- }else{
- self.switchButton.on = false
- print("offoffoffoffoff")
- }
- }
- }
(4)运行效果如下:
。
。
。
github主页:https://github.com/chenyufeng1991 。欢迎大家访问!
开发基于Handoff的App(Swift)的更多相关文章
- IOS开发-基于WebDriverAgent代理服务,实现iOS手机app自动化测试的框架搭建
导引 iOS自动化测试一直使用的appium,iOS系统升级至10.0 Xcode8.0之后,改用WebDriverAgent代理服务作为server,编写了一套基于WebDriverAgent服务 ...
- 【iOS-Android开发对照】 之 APP入口
[iOS-Android开发对照]之 APP入口 [图片 Android vs iOS] 提纲 对照分析iOS,Android的入口, iOS,Android的界面单元 为什么要有那样的生命周期 继承 ...
- 利用C#开发移动跨平台Hybrid App(一):从Native端聊Hybrid的实现
0x00 前言 前一段时间分别读了两篇博客,分别是叶小钗兄的<浅谈Hybrid技术的设计与实现>以及徐磊哥的<从技术经理的角度算一算,如何可以多快好省的做个app>.受到了很多 ...
- 成都app开发:架构一个App需要学会哪些技术呢?
成都亿合科技小编为您分享: 随着APP应用的流行,越来越多的人想自己学习怎么开发APP应用,那架构一个APP需要学些什么技术呢?首先要了解App都有哪些类型,不同的类型适用于哪些需求,用户可以根据自己 ...
- 【转】基于laravel制作APP接口(API)
这篇文章主要介绍了基于laravel制作APP接口(API)的相关资料,需要的朋友可以参考下 前期准备 前言,为什么做以及要做个啥本人姓小名白,不折不扣编程届小白一名,但是自从大一那会儿接触到编程这件 ...
- 《Swift开发指南》国内第一本Swift图书上市了
<Swift开发指南>国内第一本Swift图书上市了 既<courseId=799262">苹果Swift编程语言开发指南>视频教程地址:courseId=79 ...
- 移动跨平台开发框架Ionic开发一个新闻阅读APP
移动跨平台开发框架Ionic开发一个新闻阅读APP 前言 这是一个系列文章,从环境搭建开始讲解,包括网络数据请求,将持续更新到项目完结.实战开发中遇到的各种问题的解决方案,也都将毫无保留的分享给大家. ...
- delphi不同版本字符串类型的演化(要支持基于firemonkey的app调用,字符串最好使用olevariant类型)
string,DELPHI2009以前的版本string=ansistring,一个字符占一个字节,DELPHI2009及以上版本string=unicodestring,一个字符占二个字节. cha ...
- 《Flask Web开发——基于Python的Web应用开发实践》一字一句上机实践(上)
目录 前言 第1章 安装 第2章 程序的基本结构 第3章 模板 第4章 Web表单 第5章 数据库 第6章 电子邮件 第7章 大型程序的结构 前言 学习Python也有一个半月时间了,学到现在感觉 ...
随机推荐
- SDL2.0的几何图行绘画
SDL2.0的几何图形绘画 通过SDL_Window.SDL_Renderer.SDL_Texture三者实现了简单的几何图形绘画. 包括了SDL_RenderDrawPoint.SDL_Render ...
- linux套件安装过程中configure,make,make install的作用
./configure,make,make install都是典型的使用GNU的AUTOCONF和AUTOMAKE产生的程序的安装步骤.其中: ./configure是检测程序文件,用来检测你的安装平 ...
- 自我总结(六)---(学习j2ee+j2ee第一阶段项目)
自我完善的过程就是在不断的自我总结不断的改进. 学习了Struts2 Spring Hibernate. 十天前结束了这个课程.也考试了.这次考试老师说机试考的还不错.其实就是一个简单的用户登录,进行 ...
- Laravel 分页详解
Laravel分页很简单,但功能又很强大噢! 首先在控制器的方法中使用paginate(页面显示条数)方法,传入页面显示的条数 然后在模板页面使用方法render()来生成html元素 appends ...
- JavaScript Table行定位效果
作者:cloudgamer 时间: 2009-09-17 文档类型:原创 来自:蓝色理想 第 1 页 JavaScript Table行定位效果 [1] 第 2 页 JavaScript Table行 ...
- css3属性 transition transform
1.transition 译:过渡,转变 可以设置过渡属性 transition: property duration timing-function delay; transition-proper ...
- 从zepto中学习方法
前言,今天开始学习Zepto源码,这里仅仅几下里面能用到的方法..陆续补充ing... 一,判断类型函数 function type(obj) { return obj == null ? Strin ...
- jmeter 构建一个LDAP测试计划
添加用户 第一步你想做的每一个JMeter测试计划是添加一个线程组元素. 线程组告诉JMeter的用户数量你想模拟,用户应该发送的次数 请求,他们应该发送的请求的数量. 继续添加ThreadGroup ...
- Qt之QPauseAnimation
简述 QPauseAnimation类为QSequentialAnimationGroup提供了一个暂停. 如果你想为QSequentialAnimationGroup动画之间添加延迟,可以插入一个Q ...
- WCF学习笔记
1,关于WCF/web service/WSE Web Service:是行业标准,也就是Web Service 规范,也称作WS-*规范,既不是框架,也不是技术.它有一套完成的规范体系标准,而且在持 ...