在上一期AppleWatch开发初探里,我们知道虽然AppleWatch是一个很优秀的产品,但是它的软件远没有成熟,在AppleWatch刚刚发布的这6个月里,它的表现有点波澜不惊,笔者割肾买的AppleWatch,一度只拿来当闹钟,这让人很心痛。
随着WatchOS 2的正式发布,关注Apple Watch的广大开发者们终于可以松了一口气,WatchOS做出了足够多的调整,让它可以孕育更强大的应用。
下面我将从老架构的新变化和新增的特性两方面介绍WatchOS 2。
WatchOS 2开放了更丰富的功能,在WatchOS 2上,应用架构已经有了极大的不同,App Extension不在运行在iPhone上,而是直接运行在手表里。如图:
(目前实测,AppleWatch并没有直接连接Wifi。)
把App Extension迁移到了Apple Watch上,这使应用的开发方式发生了很大改变。
WatchOS 2随着iOS 9 一起推出,它使用NSURLSession管理网络请求,跟iOS 9 一样,开发者需要配置App Transport Security(下文简称ATS)。
以前的App Extension 是运行在iPhone上的,他可以使用所有iOS SDK的Framework,现在需要改用到Watch OS SDK的Framework,大部分的Framwork还可以继续用,但是有少数Framework不能使用了。
如果你的应用用了CloudKit,或者与iOS App共享了数据,那就必须要迁移了。
可用的Framework可查看此文档。
在WatchOS 1上,App Extension使用第一个InterfaceController管理应用的生命周期和处理通知task。而在WatchOS 2上,WatchKit引入了WKExtensionDelegate
协议来处理这些,它相当于iOS App的AppDelegate。
如果已有的应用没有在info.plist上指定WKExtensionDelegate
,则App Extension依然会运行在iPhone上,不能享受WatchOS 2的种种便利。
openParentApplication()
进行通信,现在使用Watch Connectivity framework进行替代。 ( That framework provides bidirectional communications between the two processes and lets you transfer data and files in the foreground or background. )
在IOS和App Extension分别在应用启动时为WCSession设置WCSessionDelegate,可以判断连接状态,进行更灵活的数据传输,传输可以在应用前台或者是在后台进行,传输的数据可以支持String、NSData、File等类型。
现在不能在iOS App与 App Extension上共享数据,也不能使用CloudKit来管理了,应用管理数据的方式需要保存在Watch上,如果要用到iCloud管理数据,使用Watch Connectivity与手机进行数据交互,在iOS App上使用CloudKit。另外,在新的Extension里不能使用像GPS定位的API,想要利用它,通过iOS App定位,Watch Connectivity交互的方式变通实现。
WatchOS 2上,WatchKit开放了更多的功能,对音视频媒体的支持,让Watch App的娱乐性能有了极大的提升,能适应更多的应用场景。下面是新增的特性:
视频播放通过presentMediaPlayerControllerWithURL()
API进行播放,或者通过WKInterfaceMovie控件进行播放,不过它们的播放方式最终都是present一个新的InterfaceController进行的。
值得注意的一点是:传入的URL既可以是本地资源也可以是线上资源,如果是线上资源,那么不管你的App Extension 的info.plist是否关闭了ATS,你的资源都应该使用符合ATS的https协议。笔者猜测可能是因为present了一个系统的WatchApp,不沿用开发者的设置。
Apple并没有格式进行限制,但建议的格式如下:
音频应该以 32 kbps 速率进行编码。
视频码率为 140-160 kbps 的范围。
视频分辨率应该是 272 x 340。
媒体文件应相对较短。例如,避免超过 30 秒。
现在新的WatchOS 支持音频录制,通过presentAudioRecorderControllerWithOutputURL()
API实现,它只支持.wav, .mp4,.m4a三种格式。
借助蓝牙设备,Watch App可以控制播放音乐,这需要为Watch App指定UIBackgroundModes,并且设置shared group container使音乐文件可以同时被Watch App 和 App Extension。
请参考这篇文档的Playing Extended Audio Content 以及Making Media Files Accessible to Your Watch App两章节。
Complication即表盘小部件,可以显示像电量啦、天气啦等等,以前是不允许定制的,现在可以自定义了。
自定义的数据通过CLKComplicationDataSource
协议定义,开发者可以对各式表盘的部件进行适配,为TimeTravel(时间旅行)进行支持。Complication的入口同样要在info.plist指定。
对于Complication的开发,这里有一篇文章可以参考:
WWDC15 Session笔记 - 30 分钟开发一个简单的 watchOS 2 app
通过WKExtension.openSystemURL()
可以实现发短信打电话的功能,也可以用它来打开PassBook的url,它没有iOS里那么灵活,只有有限的功能。
通过kSecAttrAccessibleWhenUnlocked存储进钥匙链的信息,可以保证Apple Watch不戴在用户手上时,应用无法读取数据,这方便了灵活的布置页面。
let secret = "SomeSecretInformation"
if let secretData = secret.dataUsingEncoding(NSUnicodeStringEncoding) {
let attributes: [NSString: NSObject] = [
kSecClass: kSecClassGenericPassword,
kSecAttrAccessible: kSecAttrAccessibleWhenUnlocked,
kSecAttrService: "myservice",
kSecAttrAccount: "account name",
kSecValueData: secretData ]
SecItemAdd(attributes, nil)
}
增加了picker控件,效果类似于iOS上的PickerView。增加了Alert和ActionSheet的API。
WatchOS 2对于WatchOS 1的改进的两部分:第一部分应用架构的变化——把Watch App Extension挪移到AppleWatch上,这引发了一些数据使用和共享的问题,Watch Connectivity框架被引入解决这个问题;第二部分新特性,WatchOS 1少的可怜的API为人诟病,现在开放了更多的特性,特别是音频视频的支持,使Watch App能做的事更多。可以预见,随着它的发布,AppleWatch上的应用会迎来一波质的飞越。