美文网首页
Apple WatchOS1项目向Apple WatchOS2及

Apple WatchOS1项目向Apple WatchOS2及

作者: 要留胡子的先生 | 来源:发表于2018-04-20 13:49 被阅读0次

    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及

          本文链接:https://www.haomeiwen.com/subject/ceiakftx.html