介绍
Watch Connectivity是与iOS 9和watchOS 2一起发布的新通信框架。它的主要目的是在Apple Watch应用程序及其父iOS应用程序之间轻松无缝地传输信息。
该框架提供了许多不同的功能。 几周前 , Jorge Costa撰写了有关在iOS和Apple Watch应用程序之间发送消息的功能。 在本教程中,我们将放大在后台传输数据。
发送消息的功能旨在用于其他设备立即需要的数据。 相比之下,后台传输最适合对方不需要的大量数据。 复杂性信息是一个例外,我们将在本教程的后面部分对此进行讨论。
先决条件
本教程要求您在OS X 10.10或更高版本上运行Xcode 7。 您还需要从GitHub下载入门项目。
1.框架设置
为了使用Watch Connectivity框架,您的iOS和watchOS应用程序都需要具有一个符合WCSessionDelegate
协议并正确配置默认WCSession
。 WCSessionDelegate
协议的方法通过Watch Connectivity框架处理所有数据的接收,并使您能够控制应用程序中的新数据。
在Xcode中打开starter项目,然后编辑AppDelegate.swift 。 在顶部,添加以下import
语句:
import WatchConnectivity
接下来,更新AppDelegate
类的类定义,以使其符合WCSessionDelegate
协议。
class AppDelegate: UIResponder, UIApplicationDelegate, WCSessionDelegate {
我们还声明了WCSession!
类型的WCSession!
在AppDelegate
类中存储对默认WCSession
对象的引用。
var session: WCSession!
最后,如下所示更新application(_:didFinishLaunchingWithOptions:)
方法。
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
session = WCSession.defaultSession()
session.delegate = self
if WCSession.isSupported() {
session.activateSession()
}
return true
}
在application(_:didFinishLaunchingWithOptions:)
,我们获得了对默认WCSession
对象的引用, WCSession
的委托设置为应用程序的AppDelegate
实例,如果支持,则激活该会话。 isSupported
类方法将检查与您的iOS应用对应的watchOS应用是否已安装在配对的Apple Watch上并能够发送数据。
watchOS端的设置非常相似。 打开ExtensionDelegate.swift并将其内容替换为以下内容:
import WatchKit
import WatchConnectivity
class ExtensionDelegate: NSObject, WKExtensionDelegate, WCSessionDelegate {
var session: WCSession!
func applicationDidFinishLaunching() {
session = WCSession.defaultSession()
session.delegate = self
session.activateSession()
}
func applicationDidBecomeActive() {
}
func applicationWillResignActive() {
}
}
您会注意到,在激活会话之前,我们不会在WCSession
类上调用isSupported
。 这是因为此方法在watchOS一侧始终返回true
。
要检查一切是否正常,请在两个模拟器中的任何一个上运行Apple Watch应用程序,如下所示。
接下来,在您运行watch应用程序时选择的同一iPhone模拟器类型上运行iOS应用程序。
启动iOS应用后,Apple Watch模拟器应回到表盘,如下面的屏幕快照所示。
2.发送数据
正确配置了默认的WCSession
对象后,就可以在iOS和Apple Watch应用程序之间发送一些数据了。
打开TableViewController.swift并将以下代码行添加到createNewItem(_:)
方法的末尾:
WCSession.defaultSession().transferUserInfo(item)
transferUserInfo(_:)
方法接受字典作为其唯一参数。 调用此方法后,您提供的用户信息字典将添加到要传输的信息队列中。
iOS和watchOS相互配合以在适当的时候传输信息。 组合后的系统查看诸如应用程序使用情况,电池寿命,当前是否正在使用另一台设备等信息。一旦系统传输了信息,另一台设备上的应用程序将在下一次执行委托回调方法启动。
现在是时候在Apple Watch上实现接收方了。 打开ExtensionDelegate.swift并将以下方法添加到ExtensionDelegate
类:
func session(session: WCSession, didReceiveUserInfo userInfo: [String : AnyObject]) {
dispatch_async(dispatch_get_main_queue()) { () -> Void in
if let items = NSUserDefaults.standardUserDefaults().objectForKey("items") as? [NSDictionary] {
var newItems = items
newItems.append(userInfo)
NSUserDefaults.standardUserDefaults().setObject(newItems as AnyObject, forKey: "items")
} else {
NSUserDefaults.standardUserDefaults().setObject([userInfo] as AnyObject, forKey: "items")
}
}
}
一旦我们运行Apple Watch应用程序,并且成功传输了信息,就会调用此方法。
请注意,尽管本教程仅显示了将信息从iOS传输到watchOS的示例,但WCSession
和WCSessionDelegate
方法在两个平台上的后台传输行为完全相同。
实施此代码后,在模拟器中运行Apple Watch应用。 接下来,再次运行iPhone应用程序,然后按按钮创建一个新项目。
现在返回Apple Watch模拟器,并按两次Command-Shift-H返回最新的应用程序。 您将看到刚刚创建的项目出现在Apple Watch上。
请注意,虽然信息在模拟器之间立即发生传输,但是在实际情况下使用物理设备时,情况并非总是如此。
3.访问待处理的传输队列
在iOS应用仍在运行的情况下,从菜单栏或按Command-Q退出Apple Watch模拟器。 完成此操作后,请按iOS应用中的按钮创建更多项目,如下所示。
每当您尝试使用Watch Connectivity框架传输信息时,都会将其添加到队列中,并在传输信息时逐渐将其清除。 可以访问此队列,也可以访问队列中的传输。
这很有用,因为您可以查看还有多少项目待处理,甚至可以根据需要取消特定的传输。 您刚刚创建的项目当前被保留在用户信息队列中,因为Apple Watch当前已与父设备断开连接,无法进行传输。
打开AppDelegate.swift并将以下代码添加到application(_:didFinishLaunchingWithOptions:)
的末尾application(_:didFinishLaunchingWithOptions:)
:
let transfers = session.outstandingUserInfoTransfers
if transfers.count > 0 {
let transfer = transfers.first!
transfer.cancel()
}
使用此代码,我们可以访问未完成的用户信息传输,如果有至少一个,则取消第一次传输。 该WCSessionUserInfoTransfer
对象从返回outstandingUserInfoTransfers
属性也有两个只读属性,您可以访问:
-
userInfo
:此属性存储您要传输的字典。 -
transferring
:此属性存储一个布尔值,并指示当前是否正在传输用户信息。
Watch Connectivity框架中没有大量功能可用于出色的信息传输,但是根据您的应用程序,其中某些功能可能会非常有用。
4.其他转移方式
在本教程中,我们仅介绍了用户信息的后台传输,但是还有其他几种在设备之间传输数据的方法。 在iPhone和Apple Watch之间进行通讯时,每种方法都是专门为特定目的而设计的。
应用环境
在这里,您需要在仅涉及最新信息的设备之间传输信息。 您可以通过调用updateApplicationContext(_:error:)
方法来传输单个词典。 此方法中的error
参数是一个指向NSError
对象的指针,如果传输出现问题,该对象将填充信息。
在接收端就可以实现session(_:didReceiveApplicationContext:)
方法,或者访问通过默认的应用程序上下文WCSession
对象的receivedApplicationContext
属性。
并发症信息
在这里,您需要为应用程序的自定义复杂性转移一个用户信息字典。 您只能从iOS端发送信息,这是通过transferCurrentComplicationUserInfo(_:)
方法完成的。
此方法与本教程前面使用的transferUserInfo(_:)
方法之间的主要区别在于,更新并发症时,系统将始终尝试立即传输信息。
请注意,由于设备可能会断开连接或您的麻烦可能超出了其后台执行预算,因此无法保证进行传输。 如果无法完成并发症信息的传输,则将其添加到outstandingUserInfoTransfers
完成的outstandingUserInfoTransfers
队列中,在该队列中可以查看并取消该消息(如果需要)。
另请注意,如果队列中有复杂信息传输,并且再次调用transferCurrentComplicationUserInfo(_:)
方法,则队列中现有的传输将无效并取消。
档案
您甚至可以使用Watch Connectivity框架在设备之间传输文件。 这是通过transferFile(_:metaData:)
方法完成的,其中第一个参数是文件的本地NSURL
,第二个参数是可选的字典,其中包含与该文件关联的任何其他数据。
如您所料,此文件的接收由WCSessionDelegate
协议的方法处理, WCSessionDelegate
, session(_:didReceiveFile:)
方法。 在此方法中,将为您提供一个WCSessionFile
对象,该对象包含指向实际文件的新本地URL以及传输的元数据。
与用户信息传输一样,您也可以通过默认的WCSession
对象的outstandingFileTransfers
WCSession
属性查看正在进行的挂起或文件传输。
结论
总体而言,Watch Connectivity框架提供了一个非常简单易用的界面,可以在连接的iPhone和Apple Watch之间传输数据。 该框架支持传输用户信息,应用程序上下文,复杂性信息字典以及文件。
现在,您应该对使用Watch Connectivity框架发送和接收信息以及如何与任何未完成的传输进行交互感到满意。
与往常一样,请确保在下面的评论中留下您的评论和反馈。
翻译自: https://code.tutsplus.com/tutorials/watchos-2-background-transfers-and-queues--cms-24699