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。

你可能感兴趣的:(Apple WatchOS1项目向Apple WatchOS2及以上SDK迁移)