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。