Handoff 指南

原文

An Introduction to Handoff

Handoff 指南

介绍

在ios8 和 OSX Yosemite中,苹果引入了一个Handoff的新特性让开发者使用。Handoff 允许应用通过蓝牙转移数据和应用状态信息从一个设备到另外一个设备上。这样就可以让用户在一个设备的应用上开始工作然后无缝的在另外一台设备上继续工作。
例如你的可以在你的iphone上编辑短信然后在你的ipad上结束编辑并且发送相同的一条短信。在这个指南中,我将通过一个简单的笔记应用向你展示如何使用Handoff在你自己的应用中。
这个指南需要你运行Xcode 6及以后版本 和 两个支撑Handoff的设备。不是所有的运行IOS 8的设备都有蓝牙4.0,这个功能因此仅支持以下设备:

  • iPhone 5 及以后
  • iPad 4,包括iPad Air
  • iPad mini
  • iPod Touch 5

在测试中,你需要在不同的设备中登录相同的ICloud账号,并且在设备的设置中打开Handoff功能。

1.设置工程

在Xcode中使用”IOS”>”Application”选项中的”Single View Application”模板创建一个新的工程。

按照下面所示配置工程。注意将”Language”设置为”Swift”,”Devices”设置为”Universal”。

创建工程后,打开 ViewController.swift 文件,按照下面所示实现 ViewController 这个类。

class ViewController: UIViewController, UITextFieldDelegate, UITextViewDelegate {

    var noteTitleField: UITextField!
    var noteContentView: UITextView!

    override func viewDidAppear(animated: Bool) {
        self.noteTitleField = UITextField(frame: CGRect(x: 12, y: 28, width: self.view.frame.width - 22, height: 20))
        self.noteTitleField.placeholder = "Note Title"
        self.noteTitleField.delegate = self

        self.noteContentView = UITextView(frame: CGRect(x: 8, y: 56, width: self.view.frame.width - 16, height: self.view.frame.height - 64))
        self.noteContentView.text = "Note Content"
        self.noteContentView.delegate = self

        self.view.addSubview(self.noteTitleField)
        self.view.addSubview(self.noteContentView)
    }

    func textViewDidBeginEditing(textView: UITextView) {
        if textView.text == "Note Content" {
            textView.text = ""
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

}

实现很简单。在 ViewController 类中实现 UITextFieldDelegate 和 UITextViewDelegate两个协议,在控制器的view上添加一个 UITextField 和 UITextView来接收文本输。

编译、运行应用在你的测试设备上,你将看到一个具有两个输入框的非常基本的界面,一个文本框用来输入笔记标题,一个文本视图用来输入笔记内容。

2.设置Handoff

使用Handoff在设备中传递活动依赖于 NSUserActivity 这个类。你将在下面的指南中学习和使用这个类。首先,你的应用必须成功的创建这个活动。

你必须在你的应用中给每个支持活动的类型设置一个唯一标识,就像每个ios应用都有他们自己唯一的id,这个标识是你随意设置的,但是最好是使用翻转域名符号的方式,比如com.tutsplus.handoff-introduction.note。为了能够识别活动,运行在每个设备上应用也必须使用相同的IOS开发者小组。

首先,在应用中你想要支持的Target的Info.plist文件中加入活动标识。打开Taget的Info.plist文件,添加 NSUserActivityTypes 键值。把这项设置为数组并且添加 com.tutsplus.handoff-introduction.note 这一项,如下截图所示

其次,在 Project Navigator中选中工程,在编辑款的右边打开 General 列表, 在”Identity”选项的”Team”中设置正确的开发者小组。

最后,在每个设备中登录相同的iCloud账号和连接相同的Wi-Fi网络,到此你的应用已经准备好使用Handoff了。

3.发送一个用户的活动

下一步,为了让用户的活动从一个设备发送到另一个设备,你需要添加一些代码,如下所示,在ViewController类里更新viewDidLoad方法。

override func viewDidLoad() {
    super.viewDidLoad()

    let activity = NSUserActivity(activityType: "com.tutsplus.handoff-introduction.note")
    activity.title = "Note"
    activity.userInfo = ["title": "", "content": ""]
    userActivity = activity
    userActivity?.becomeCurrent()
}

这段代码使用你之前在 Target 的 Info.plist 文件中的标识创建了一个基本的 NSUserActivity 对象,并给活动对象的title赋值,给userInfo字典的title 和 content 键赋空的字符串。

在这个指南中,我们在活动的userInfo字典中放入字符串。然而,你可以放入任何特性表,比如数字、数组和字典,以及任何实现NScoding协议的类。

在你的ViewController实例中分配了一个新的活动给userActivity属性以便让Handoff API能够引用到它,UIViewController类从UIResponder类继承这一属性。

最后,用调用活动的 becomeCurrent 方法告诉系统当前用户的活动将通过应用发送出去。

你现在已经成功设置好了用户的活动,但是你需要填充用户输入的笔记的内容。为了做到这一点,我们在ViewController 类中重写 updateUserActivityState(_:) 方法来更新用户当前的活动。Handoff API 会定期的调用这个方法来更新当前用户的活动,添加下面代码到 ViewController 类中。

override func updateUserActivityState(activity: NSUserActivity) {
    activity.addUserInfoEntriesFromDictionary(["title": self.noteTitleField.text, "content": self.noteContentView.text])
    super.updateUserActivityState(activity)
}

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    self.updateUserActivityState(userActivity!)
    return true
}

func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {
    self.updateUserActivityState(userActivity!)
    return true
}

updateUserActivityState(_:)方法传回一个当前用户活动的引用,使用应用中最新值来更新这个活动的userInfo字典中的值,注意调用父类方法。

同时实现 UITextFieldDelegate 协议的 textField( :shouldChangeCharactersInRange:replacementString:) 方法 和 UITextViewDelegate 协议的 textView( :shouldChangeTextInRange:replacementText:) 方法。在这两个方法中,当输入内容发生改变时更新用户的活动。然而这不是必须的,只是保证你的活动总是包含最新的内容。

现在你已经准备好测试你应用的Handoff。编译和运行你的应用在两个测试设备上。按下锁屏键让一个设备休眠,让另一个设备保持打开状态。打开刚刚锁屏的那个设备,你会发现在锁屏状态下应用图标出现在底部左上角。在图标上滑动将通过Handoff恢复应用。

或者,你可以双击home键进入应用,你的具有Handoff功能的应用会显示在主屏幕的左边。此时,你的应用仅仅恢复进入相同的空白的界面,现在让我妈来修复它。

4、从用户活动恢复

恢复应用从Handoff的NSUserActivity对象是由你应用的代理方法来处理的。应用代理传递用户活动的对象到应用的的根控制器去恢复自己。如果在你的应用中需要去处理活动的控制器不是根控制器,你可以在你的应用中简单的从根控制器沿着控制器向下传递直到你想要的地方。

打开 AppDelegate.swift 并且在AppDelegate类中添加下面方法:

func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]!) -> Void) -> Bool
    self.window?.rootViewController?.restoreUserActivityStat   e(userActivity)
    return true
}

在这个方法中,你传递了用户的活动对象到应用的跟控制器,通过返回true,你告诉应用你已经成功的接收并处理了Handoff用户的活动。

下一步,打开ViewController.swift 并且在ViewController类中添加下面方法:

override func restoreUserActivityState(activity: NSUserActivity) {
    self.noteTitleField.text = activity.userInfo?["title"] as! String
    self.noteContentView.text = activity.userInfo?["content"] as! String
}

就像之前指导中的 updateUserActivityState(_:) 方法,你重写 restoreUserActivityState(_:) 方法从NSUserActivity对象中获取消息。在实现了这个方法后,你更新输入框后数据将会储存在用户活动的类中。

在你的两个设备中编译运行你的应用,并且在一个设备中开始写一个笔记。从另一个锁屏的设备或者是在应用交换的设备,通过Handoff打开应用,你应该能看到你在第一个设备中编写的文本。

5、错误处理和代理方法

不像苹果为iOS提供的大多数APIs,如果你不知道在哪里处理错误,当你使用Handoff时错误处理会变得不是很容易。首先,你的应用会通知Handoff错误通过代理类中的application(_:didFailToContinueUserActivityWithType:error:)方法,在这个方法中你可以确定什么造成错误的原因和错误的类型。注意 NSUserActivity 对象的类型是你唯一指派的。

当你的应用从Handoff活动中继续运行,首先需要的是通过蓝牙去下载关联的数据从原始的设备中,在这个下载完成之前,另一个代理方法将被调用:application(_:willContinueUserActivityWithType:)。在这个可选的方法中,你能返回一个布尔值去告诉Handoff API 是否你想要继续接收用户的活动。在某些情况,使得在满足某一条件的时候取消详细类型的 NSUserActivity 可能会有用。

结论

在这个指南中,我向你展示了如何在iOS8应用中容易的使用NSUserActivity类去适用Handoff功能。你创建了一个简单的应用,能够通过蓝牙无线的传递数据从一个设备到另一个设备。

虽然在这个指南中的示例应用很简单,你能在自己的应用中添加各种功能拥有许多用户活动的类型。最后,如果你有任何的评论或问题,请在评论栏中评论。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值