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。
网友评论