苹果已经推出watch OS 2.0有一段时间了,相比watch OS 1.0还是有很大改变的,这版本最大变化就是我们可以在watch 上构建原生APP。而1.0时代只能存放一些资源与界面文件,主要业务逻辑与代码需要在iPhone上执行。在watch os2.0上能够通过apple开放的框架api在watch自身驻留与运行。这样带来的好处就是app能启动的更快,运行的更流畅,而不需要每一次操作都通过watch和iPhone的蓝牙模块往返传递数据(蓝牙的带宽是硬伤)。与watch OS 1.0时一样,watch APP上包含呈现UI相关的StoryBoard和resource文件,没错,2.0仍然要在Storyboard中搭建界面,WatchKit Extension 中存放逻辑代码。
Update To Watch OS 2.0
如果你的APP之前就支持了 Apple Watch,那么在watch OS 2.0上跑也是没问题的,但watch OS 2.0是一个独立的操作系统,和iPhone没关系,我们毕竟要与时俱进,所以,适配watch OS 2.0 吧。
如果决定将watch 1.0 app迁移到2.0上,必须得评估这两者完全不同的系统架构对1.0版本app架构设计带来的影响。以下问题需要慎重考虑:
1.app是否严重依赖iCloud?WatchOS2中,WatchKit Extension不再被允许直接访问iCloud。此类功能都必须由配对的iOS应用完成,再传输给手表。
2.watch应用是否依赖配对的iOS应用的数据?手机上创建的数据,必须传输到手表上供手表应用使用;手表应用更改后,必须传回手机,供其备份。纵然AppleWatch有提供传输的帮助,这里也必须更新相关的数据处理代码已支持数据同步。这里,可以考虑异步同步数据,手表和手机都连接到一个共享的服务器,通过服务器来同步数据。
3.是否要支持早期的Apple Watch版本?如果要支持初代WatchKit和WatchOS2,那么我们需要有不同的target并编译产生不同的可执行文件。这是因为watchos1.0与watch os2.0是两个完全不同的系统架构,共享代码远比分开编译target的代价大的多。
如果已经决定将watch 1.0 app迁移到2.0上:
首先,保存你的所有Watch OS 1.0的文件,作为备份。毕竟大量的业务逻辑代码是可以复用的,目前看来,我们需要修改的只是通信机制与网络部分,以及你想要添加的Watch OS 2.0的一些新功能。
然后,删除Watch OS 1.0的Target以及所有的文件,创建Watch OS 2.0 Target,记得要选上Notification Scene、Glance Scene、Complication。
最后,将你之前备份的Watch OS 1.0的文件拷贝到现在的2.0中,当然不要无脑拷贝!!!
与 iOS App 的通信
在 1.0 时,我们与Host App的通信通常是用App Group,在 2.0,苹果为我们提供了Watch Connectivity Framework来进行经过配对的watch和iPhone的数据交换,该框架可以后台传输和前台传输。watch 已经不再是 Host App的附属,用App Group通信显然已经过时。
WatchConnectivity Framework提供了一个WCSession对象,我们要通过WCSession可以进行数据传输。
1.建立WCSession
在watch extention端和iphone端都要先建立默认WCSession对象,指定委托,并加以激活。
OBJECTIVE-C
if([WCSessionisSupported]) {
WCSession*session= [WCSessiondefaultSession];
session.delegate=self;
[sessionactivateSession];
}
SWIFT
ifWCSession.isSupported() {
letsession=WCSession.defaultSession()
session.delegate=self
session.activateSession()
}
WCSessionDelegate
- sessionReachabilityDidChange:
- session:didReceiveApplicationContext:
- session:didReceiveMessage:replyHandler:
- session:didReceiveMessageData:
- session:didReceiveMessageData:replyHandler:
- session:didFinishUserInfoTransfer:error:
- session:didFinishFileTransfer:error:
2.连接状态
2.1判断连接状态
在传输数据时需要判断watch 和 iPhone的连接状态,WCSession属性里提供了如下状态:已经配对(paired)、watch应用已经安装(watchAppInstalled)、两者连接相通(reachable)。当watch已经配对且watch端应用安装好时,可以进行后台传输数据;当两者连接相通时,可以直接进行前台传输。
2.2连接状态改变回调
指定委托后,就可以在连接状态改变时做出相对反应。当配对或应用安装发生变化时 (paired or watchAppInstalled),会调用sessionWatchStateDidChange:method。当即时连接变化时(reachable),会调用sessionReachabilityDidChange:method。我们要根据需要自己在指定的委托中添加上述需要处理的函数。
网络请求
关于watch 上的网络请求,可以分为两种方式:
1.watch 自主发起网络请求
2.watch 向 iOS App 发送请求信号,由 iOS App来请求网络,然后通WCSession将数据传输给watch。
显然第二种方式不符合苹果在watch OS 2.0上做的改变。
目前苹果允许我们在watch上使用NSURLSession进行网络请求,我们可以规规矩矩的使用NSURLSession,完全没问题。但是,你一定会想,我们可以在watch 上使用AFNetworking吗?试一下~
会提示找不到<SystemConfiguration/SystemConfiguration.h>,因为在watch os 2 中,<SystemConfiguration/SystemConfiguration.h>是不可用的 system framework,文档中是这样说明的:
Networking
Support for network-based operations includes the following technologies:
WatchKit extensions can access the network directly using an NSURLSession object. WatchKit extensions have full access to the NSURLSession capabilities, including the ability to download files in the background. For information on how to use this class, see URL Loading System Programming Guide. The Watch Connectivity framework supports bidirectional communication between your Watch app and iOS app. Use this framework to coordinate activities between the two apps. For more information, see Communicating with Your Companion iOS App.
但是,如果你使用的是最新的AFNetworking的话,也是没问题的,在AFNetworking 2.6 已经做了对apple watch的适配,在3.0已经废弃了基于NSURLConnection的API的内部实现,由NSURLSession代替,所以,在watch上使用AFNetworking也是没问题的.参考链接:
http://www.jianshu.com/p/047463a7ce9b
图片的处理
WatchKit 提供的装载图片的容器叫WKInterfaceGroup ,他有自己的一套设置图片的方法
- (void)setBackgroundColor:(nullableUIColor*)color;
- (void)setBackgroundImage:(nullableUIImage*)image;
- (void)setBackgroundImageData:(nullableNSData*)imageData;
- (void)setBackgroundImageNamed:(nullableNSString*)imageName;
目前为止,SDWebImage还没有对watch os 适配,不可用。所以我们需要自己下载图片自己渲染自己做缓存。
关于WKInterfaceDevice中的imageCache在watch OS 2.0 已经不能使用了。
最后再说下Menu icon 这个坑,watch 的自定义表盘可以让我们的App展示在上面,于是需要我们配一张图在plist里面,这个图的要求:
1. 设置线条粗心至少为4像素来保证他们能够清晰的显示根据不同设备的大小和icon的复杂度使用对应合适的线宽度.
2. 必须使用PNG格式
3. 背景必须透明
欢迎订阅我的个人主页~