iPhone與iWatch連接、控制、數(shù)據(jù)傳遞(Swift)的方法
最近在做一個項目,涉及到iPhone設(shè)備和手表傳輸數(shù)據(jù)、控制彼此界面跳轉(zhuǎn),在網(wǎng)上找了很多資料,發(fā)現(xiàn)國內(nèi)的網(wǎng)站這方面介紹的不多,而國外的網(wǎng)站寫的也不是很全,所以在這寫這篇文章,給大家參考一下,望大神指點一二。
iPhone和iWatch配對這個不需要多說,百度搜索答案一大堆,這個是前提。
iPhone與iWatch交互的代碼有兩種情況,取決于iWatch的系統(tǒng)。iWatch OS1與OS2、3的方法不同,在OS1的系統(tǒng)中,iWatch發(fā)送數(shù)據(jù)的代碼如下
let userInfo:[String:String] = ["key":"value"] WKInterfaceController.openParentApplication(userInfo) { (replyInfo, error) -> Void in }
這個函數(shù)是發(fā)送消息,同時也是接收消息,接收到iPhone的回復(fù)是replyInfo。在iPhone端的AppDelegate中,接收消息的代碼:
func application(application: UIApplication, handleWatchKitExtensionRequest userInfo: [NSObject : AnyObject]?, reply: (([NSObject : AnyObject]!) -> Void)!) { }
接收到的消息是userInfo,回復(fù)給iWatch的數(shù)據(jù)是reply。
以上的代碼僅適用于watchOS1,之后的系統(tǒng)就沒有這個API了,對于OS2或OS3,使用的框架是WatchConnectivity,在這里,我將直接提供我寫的類,并給出介紹和使用方法,大家可以直接復(fù)制代碼,在我注釋的地方寫自己的功能便可。
以下是iPhone端的代碼:
import UIKit import WatchConnectivity class IwatchSessionUtil: NSObject, WCSessionDelegate { //靜態(tài)單例 static let shareManager = IwatchSessionUtil() //初始化 private override init() { super.init() } // 連接機制 private let session:WCSession? = WCSession.isSupported() ? WCSession.default() : nil // 激活機制對象 func startSession(){ session?.delegate = self session?.activate() } // 檢測到watch端app func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) { print("AppleWatch匹配完成") } // 開始向Watch傳遞數(shù)據(jù) func sessionDidBecomeInactive(_ session: WCSession) { } // 數(shù)據(jù)傳遞完了 func sessionDidDeactivate(_ session: WCSession) { } // watch側(cè)發(fā)送數(shù)據(jù)過來,iPhone接收到數(shù)據(jù)并回復(fù)數(shù)據(jù)過去 // message: watch側(cè)發(fā)送過來的信息 // replyHandler: iPhone回復(fù)過去的信息 func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Void) { // 在這里,我們接收到watch發(fā)送過來的數(shù)據(jù),可以用代理、代碼塊或者通知中心傳值到ViewController,做出一系列操作。 // 注!?。簑atch側(cè)發(fā)送過來信息,iPhone回復(fù)直接在這個函數(shù)里回復(fù)replyHandler([String : Any])(replyHandler(數(shù)據(jù))),這樣watch側(cè)發(fā)送數(shù)據(jù)的函數(shù)對應(yīng)的reply才能接收到數(shù)據(jù),別跟sendMessage這個函數(shù)混淆了。如果用sendMessage回復(fù),那watch側(cè)接收到信息就是didReceiveMessage的函數(shù)。 } // iPhone向watch發(fā)送數(shù)據(jù) // key: 數(shù)據(jù)的key值 // value: 數(shù)據(jù)內(nèi)容 func sendMessageToWatch(key:String,value:Any) { session?.sendMessage([key : value], replyHandler: { (dict:Dictionary) in // 這里是發(fā)送數(shù)據(jù)后的操作,比如寫個alert提示發(fā)送成功 // replyHandler是watch側(cè)didReceiveMessage函數(shù)接收到信息后reply回復(fù)過來的內(nèi)容,這里可以編輯自己需要的功能 }, errorHandler: { (Error) in // 發(fā)送失敗,一般是藍牙沒開,或手機開了飛行模式 }) } }
調(diào)用方法:
1、首先在iPhone的AppDelegate的didFinishLaunchingWithOptions函數(shù)中添加代碼
IwatchSessionUtil.shareManager.startSession(),確保WCSession能匹配到watch側(cè)的App
2、發(fā)送消息:調(diào)用方法IwatchSessionUtil.shareManager.sendMessageToWatch(key: , value: )即可,發(fā)送后接收到watch側(cè)的回復(fù)后的操作,直接在類sendMessage函數(shù)中編輯就行
3、watch側(cè)sendMessage發(fā)送信息給iPhone,iPhone側(cè)didReceiveMessage接收到信息,一系列操作上面已經(jīng)注釋寫到。
iPhone端的介紹完畢,下面寫watch端的代碼,其實跟iPhone的沒什么區(qū)別,這里只是為了把這部分內(nèi)容寫完全。
import WatchKit import WatchConnectivity class WatchSessionUtil: NSObject,WCSessionDelegate { // 靜態(tài)單例 static let sharedManager = WatchSessionUtil() // 初始化 private override init() { super.init() } // 連接機制 private let session:WCSession? = WCSession.isSupported() ? WCSession.default() : nil // 激活機制 func startSession(){ session?.delegate=self session?.activate() } // 檢測到iPhone的父應(yīng)用 func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) { } // 接收到iPhone端發(fā)送過來的信息 // message: iPhone端發(fā)送過來的信息 // replyHandler: watch端回復(fù)給iPhone的內(nèi)容 func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Void) { // 這里也可以通過通知中心發(fā)送通知給InterfaceController,進行頁面操作,至于用什么方法大家隨意。注意事項iPhone的代碼里提到了,一樣的性質(zhì),這里就不寫了。 } // 向iPhone側(cè)發(fā)送信息 func sendMessage(key:String, value:Any){ session?.sendMessage([key : value], replyHandler: { (reply: [String : Any]) in // 信息發(fā)送之后,收到iPhone端回復(fù)的操作 }, errorHandler: { (Error) in // 發(fā)送失敗 }) } }
watch的類添加在Extension的文件夾中,調(diào)用方法:
1、ExtensionDelegate文件的applicationDidFinishLaunching函數(shù)里寫上WatchSessionUtil.sharedManager.startSession()
2、發(fā)送消息:調(diào)用方法IwatchSessionUtil.shareManager.sendMessageToWatch(key: , value: )即可,發(fā)送后接收到iPhone側(cè)的回復(fù)后的操作,直接在類sendMessage函數(shù)中編輯就行
3、iPhone側(cè)sendMessage發(fā)送信息給watch,watch側(cè)didReceiveMessage接收到信息,一系列操作上面已經(jīng)注釋寫到。
以上所述是小編給大家介紹的iPhone與iWatch連接、控制、數(shù)據(jù)傳遞(Swift)的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
Swift中的條件切換語句switch...case學(xué)習(xí)教程
這篇文章主要介紹了Swift中的條件切換語句switch...case學(xué)習(xí)教程,Swift中的switch...case支持的數(shù)據(jù)類型很多,非常之強大,需要的朋友可以參考下2016-04-04用SwiftUI實現(xiàn)3D Scroll滾動效果的實現(xiàn)代碼
這篇文章主要介紹了用SwiftUI實現(xiàn)3D Scroll效果的實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)2020-04-04Swift實現(xiàn)監(jiān)聽鍵盤通知及一些處理詳解
這篇文章主要給大家介紹了關(guān)于Swift實現(xiàn)監(jiān)聽鍵盤通知及一些處理的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01Objective-c代碼如何移植為Swift代碼 Objective-c代碼轉(zhuǎn)移到Swift過程介紹
這篇文章主要介紹了Objective-c代碼如何移植為Swift代碼,Objective-c代碼轉(zhuǎn)移到Swift過程介紹,需要的朋友可以參考下2014-07-07在一個項目中同時使用Swift和Objective-C代碼混合編程的方法
這篇文章主要介紹了在一個項目中同時使用Swift和Objective-C代碼的方法,在一個工程中同時使用Swift和Objective-C混合語言編程的方法,需要的朋友可以參考下2014-07-07Swift使用CollectionView實現(xiàn)廣告欄滑動效果
這篇文章主要為大家詳細介紹了Swift使用CollectionView實現(xiàn)廣告欄滑動效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-06-06Swift利用CoreData實現(xiàn)一個上班簽到的小工具
這篇文章主要給大家介紹了關(guān)于Swift利用CoreData實現(xiàn)一個上班簽到小工具的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12Swift利用AFN實現(xiàn)封裝網(wǎng)絡(luò)請求詳解
網(wǎng)絡(luò)請求工具是我們經(jīng)常用到的工具類,所以下面這篇文章主要給大家介紹了關(guān)于Swift利用AFN如何實現(xiàn)封裝網(wǎng)絡(luò)請求的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10