天天看點

Apple Watch與iPhone資料通信———— Watch Connectivity

Apple Watch與iPhone資料通信———— Watch Connectivity

Watch Connectivity原理,iOS App與安裝在Watch上的Watch Extension(Watch OS 2.0之後Extension不再放到iPhone中,Watch App可以獨立進行資料處理)通過WCSession進行資料傳輸。

第一步初始化WCSession

在通信之前要確定Watch和iOS上的App都初始化了WCSession,接收方控制器要設定delegate—>WCSessionDelegate,同時要激活WCSession,代碼如下:

if ([WCSession isSupported]) {
     WCSession* session = [WCSession defaultSession];
     session.delegate = self;
     [session activateSession];
}   
           

第二步校驗Counterpart

可以傳輸的資料格式為字典(NSDictionary)、NSData、檔案(NSURL), iOS端在發送資訊之前應先檢驗1.Apple Watch是否與手機相連、2.Apple Watch是否安裝了該應用。 Watch端在發送前無需檢驗是否安裝了應用。 檢驗代碼如下:

/** Check if iOS device is paired to a watch */
BOOL        session.paired   

/** Check if the user has the Watch app installed */
BOOL        session.watchAppInstalled
           

watchapp安裝成功就會在手表上建立相應app的目錄,是以session.watchAppInstalled==false效果等同于watchDirectoryURL != nil。

watchDirectoryURL一般隻在需要額外的初始化處理的情況下,比如app重裝恢複隊列内容、設定初始設定時等情況下會用到。

第三步發送消息

發送方法分為三種:

一.ApplicationContext

- (BOOL)updateApplicationContext:(NSDictionary<NSString *,id> *)applicationContext error:(NSError * _Nullable *)error           

隻能發送NSDictionary,在對應App被喚醒時系統會将消息發送過去。

接收方App對應的代理方法:

- (void)session:(WCSession *)session didReceiveApplicationContext:(NSDictionary<NSString *,id> *)applicationContext (此處官方文檔描述有誤)           

二.Transfer

分為UserinfoTransfer和FileTransfer,能發送NSDictionary和File

- (WCSessionFileTransfer *)transferFile:(NSURL *)file
                               metadata:(NSDictionary<NSString *,
                                                 id> *)metadata

- (WCSessionFileTransfer *)transferFile:(NSURL *)file
                               metadata:(NSDictionary<NSString *,
                                                 id> *)metadata           

接收方App對應的代理方法:

- (void)session:(WCSession *)session didReceiveUserInfo:
        (NSDictionary<NSString *, id> *)userInfo;

- (void)session:(WCSession *)session didReceiveFile:(WCSessionFile *)file;           

通過背景傳輸NSDictionary或者File,發送的資料将以隊列的形式傳遞給目标App,即使目前App暫停或終止傳輸仍然繼續。

三.replyHandle

可以發送NSDictionary或NSData, 發送方可以獲得接收方響應。

- (void)sendMessage:(NSDictionary<NSString *, id> *)message replyHandler:(void (^)(NSDictionary<NSString *, id> *replyMessage))replyHandler errorHandler:(void (^)(NSError *error))errorHandler

- (void)sendMessageData:(NSData *)data replyHandler:(void (^)(NSData *replyMessageData))replyHandler
                 errorHandler:(void (^)(NSError *error))errorHandler           

實時通訊,傳輸時要求App必須處于運作時,若iOS App未啟動,Watch Extension将會在iOS背景啟動App。當iOS為發送方,Watch App未啟動時,發送失敗。

接收方對應的代理方法:

- (void)session:(WCSession *)session didReceiveMessage:(NSDictionary<NSString *,id> *)message

- (void)session:(WCSession *)session didReceiveMessage:(NSDictionary<NSString *,id> *)message replyHandler:(void (^)(NSDictionary<NSString *,id> *_Nonnull))replyHandler

- (void)session:(WCSession *)session didReceiveMessageData:(NSData *)messageData

- (void)session:(WCSession *)session didReceiveMessageData:(NSData *)messageData replyHandler:(void(^)(NSData *replyMessageData))replyHandler