Apple WatchOS1項目向Apple WatchOS2及以上SDK遷移

Apple WatchOS1項目向Apple WatchOS2遷移主要的實施點有三個部分。

1,由于架構的變化,AppID需要重新制作。

2,Appgroup在Apple WatchOS2上取消,原先的共享數據模式需要替換。

3,Apple WatchOS1的app端與watch端的通信方式更改。于是需要替換相應方法。


l?重新制作AppID

1.制作AppID,格式參照以下。

App AppID ?**.**

watch AppID ? **.watchkitapp

watch extension AppID ? **.watchkitapp.watchkitextension


2、準備group ID

添加group ID ?group.**

3.把以上三個App ID加入分組


4.準備provisioning profiles

開發的profiles以及ipa打包的profiles。

l?創建新架構的手表工程


l?Appgroup在Apple WatchOS2上取消,原先的共享數據模式需要替換。

由于Appgroup在Apple WatchOS2上取消,我使用的替換方式是,利用手表向app發送請求進行通信的時候,返回保存的數據給手表。

1,Apple WatchOS1的app端與watch端的通信方式更改。于是需要替換相應方法。

Apple WatchOS1的app端與watch端的通信方式更改。

Apple WatchOS1使用的代理方法

- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void(^)(NSDictionary *replyInfo))reply {

}

已經被刪除。我們需要使用蘋果提供的新的通信方法,WatchConnectivity.framework中提供的WCSession來進行手表與手機間的通信。

注:過老的項目本身沒有引入WatchConnectivity.framework,我們需要手動引入framework。

app端修改部分代碼例:

WCSession需要盡早的初始化,所以我在AppDelegate.m里進行了WCSession激活。(修改文件AppDelegate.m)

- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions

{

?if([WCSessionisSupported]) {

?WCSession* session = [WCSessiondefaultSession];

?session.delegate=?self;

?[session?activateSession];

}

}

接收手表通信請求的代理(修改文件AppDelegate.m)

- (void) session:(nonnullWCSession*)session didReceiveMessage:(nonnullNSDictionary *)message replyHandler:(nonnullvoid(^)(NSDictionary *?__nonnull))replyHandler{

}

注:代理是在線程中,所以如果涉及到UI變換一定要放在主線程中處理。

? ? ? ? 此方法當watch端發送請求時。無論app端是前臺、后臺或者未激活狀態都會使app被喚起并觸發處理。當然如果次方法內部的處理出現異常并沒有進行異常處理情況下。Watch端會出現持續發送請求狀態,app端表現會呈現沒有喚起狀態。由于蘋果提供的debug模式不能很好的查看雙端的運行情況。所以建議,開發時app端喚起代理方法加入播放聲音等功能。

播放聲音代碼例:

- (void)playNotifySound {

?NSString*path = [[NSBundlemainBundle]?pathForResource:@"30"ofType:@"mp3"];

?SystemSoundIDsoundID;

?if(path) {

?OSStatuserror =?AudioServicesCreateSystemSoundID((__bridgeCFURLRef_Nonnull)([NSURLfileURLWithPath:path]), &soundID);

?if(error !=?kAudioServicesNoError) {

?NSLog(@"%d",(int)error);

?}

?}

?AudioServicesPlayAlertSoundWithCompletion(soundID, ^{

?});

}


注:需要打開app后臺模式才可以在app未激活狀態時,app被手表喚起發出聲音。


Watch端修改部分代碼例:

雖然Apple WatchOS2相對于Apple WatchOS1項目,架構放生變化,但是相應代碼還是可以繼續使用。

WatchKit中的Interface.storyboard以及Extension中的viewcontroller可以直接復制或替換到相應目錄繼續使用。

不過被刪除的通信方式需要替換。

[WKInterfaceController openParentApplication:applicationData reply:^(NSDictionary *replyInfo, NSError *error) {

}

已經被刪除,需要替換為

[session?sendMessage:applicationData?replyHandler:^(NSDictionary *?_NonnullreplyMessage) {

?}?errorHandler:^(NSError*?_Nonnullerror) {

?NSLog(@"%@",error);

?}];


同時WCSession盡量在最早時間進行初始化,可以選擇在ExtensionDelegate.m或者相應viewcontroller中awake的時候。

WCSession初始化方式例:

?if([WCSessionisSupported]) {

?WCSession* session = [WCSessiondefaultSession];

?session.delegate=?self;

?[session?activateSession];

}

Q&A

Q:App端如何獲取手表端版本

A:利用

NSString* watchVersion = [WKInterfaceDevicenew].systemVersion;

可以獲取。

注:過老的項目不包含WatchKit.framework需要引入此framework。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。