目录:
- 前言
- 一、Apple Watch简介
- 二、Watch App在项目中的结构
- 三、 Apple Watch上的app特点和原理
- 四、 Watch App UI介绍
- 五、App Watch与iphone 之间的通信
- 六、Watch App 和watchKit Extention之间数据共享
- 七、Watch App通知
- 八、App Watch单独发送网络请求
前言:
随着现在 Apple 生态圈的发展,越来越多的 App 会把自己的简化版从 iOS 迁移至 WatchOS(支付宝、微信、手Q、头条、QQ音乐、网易云音乐等等,都有Watch版App)。
一、Apple Watch简介
Apple Watch是苹果公司主打 “健康” 概念的智能手表。
于2014年发布第一代Apple Watch 1,截至2020年,已发布Apple Watch 5。
2015年3月10日,苹果在旧金山Moscone Center召开2015年春季新品发布会,正式发布了Apple WATCH,分为运动、标准、定制三版,将于2015年4月10号预售,4月24日上市。
Apple Watch支持电话,语音回短信,连接汽车,天气、航班信息,地图导航,播放音乐,测量心跳、计步等几十 种功能,是一款全方位的健康和运动追踪设备。
Apple Watch App分为两种:
-
Watch App for iOS App:
从iOS迁移过来的Watch App,可与iOS App通信。 -
Watch App:
独立的Watch App,可独立安装在Apple Watch上。
大部分是第一种,Watch App for iOS App。
二、Watch App在项目中的结构
新建一个watchOS的target。
- 这时,会出现两个target:WatchKit App、WatchKit Extension。
注意:在 WatchOS 中,无法像 iOS 那样依赖 UIKit 写出各种复杂的界面。目前,只能依赖 storyboard 搭建出一些简单的UI界面与界面跳转逻辑。
三、 Apple Watch上的app特点和原理
我们从开发的角度说下Apple Watch上的app特点和原理。
Apple Watch运行模式
首先手表上app和iPhone上app是一种联动关系,即Apple Watch上的开发的app是离不开iPhone的。为什么呢,这个它的运行策略有关,手表的cpu、硬件、电量都是有限的,所以节约空间和电量是很重要的,所以手表界面设计要精简,操作比较少。
Watch app和iPhoneapp是无缝关联的,因为Watch上的app都是iPhone帮它运行的,手机和Watch离得近,靠无限传输,在一定程度上节省了Watch的很多工作量,Watch负责显示iPhone处理后的结果,这其实也是一种绑定销售策略。Watch上的app其实就是iPhone上app的一部分、一种扩展。
Apple Watch app界面类型
Watch app有三种和用户交互的方式,或者说Watch app有三种界面:
- 常规Watch app,这个是必须的,一些简单内容的显示和简单操作,可以看成手机上的精简版;
- glance类型的界面,是一种纯提示型的界面,是不能和用户互动的,这部分可有可无;
- notification类型的界面,这是消息通知时用到的,手机也可以接收推送通过这种界面显示,这种是可以和用户互动的。
Watch app和iPhone app的关系
Watch app和iPhone app是一种联动关系,其实也是一个绑定关系,是一个整体,Watch app并不是一个单独的project,而是在iOS project上扩展的一个Target,Watch app上并没有代码,只有界面资源,代码是在iPhone上运行的。
在WatchOS 2 之前, WatchKit App负责展示,安装在Watch上,WatchKit Extension负责业务和控制逻辑,安装在iPhone上。所有运算、逻辑以及控制都是在iPhone上完成。Watch app和iPhone app是通过Watchkit进行桥接的,所有的代码执行逻辑方面都是在iPhone上运行的,storyboard和图片资源在Watch端显示的,并且Watch app的安装运行都是由iPhone控制的。
- 此外,一个iPhone每次可关联一个Apple Watch,它们是一对一的关系。目前Apple Watch只能跟iPhone设备配对,不支持iPad。
在WatchOS 2之后,最大的改变就是将WatchKit Extension 直接从iPhone 移植到AppleWatch上。
Watch app启动过程
上图是Watch app加载的一个过程,可以看出Watch app的加载是依靠iPhone来进行的,启动app,加载Watch端的storyboard和图片等资源,然后会初始化UI,这个时候就走到iPhone端扩展里的初始化方法了,初始化完了之后就是显示UI,UI中的触发的动作都是去iPhone扩展里调用代码,将执行结果显示到Watch上。
刚才提到的init方法顾名思义了,awakeWithContext:方法就是通过iPhone传递过来的信息初始化UI的,类似我们之前的viewDidLoad,willActivate就相当于之前的viewWillAppear,这样就应该好理解了。
Watch App 生命周期
iPhone上app都有各自的生命周期,那么Watch app的生命周期呢,从上图我们就可以很直观的看到,从显示UI、用户交互到app结束,每一步都和iPhone对应app的扩展密切交流。
-
WKInterfaceController继承于NSObject WKInterfaceController 相当于UIViewController 。生命周期方法分别是:
- -initWithContext: 被初始化时调用,一般在这里配置视图元素,相当于-viewDidLoad
- -willActivate 将要呈现的时候调用,也可以在这个方法中进行视图元素的设置,相当于-viewWillAppear
- -didAppear 已经呈现的时候调用 , 相当于-viewDidAppear
- -willDisappear 将要消失时调用 相当于-viewWillDisappear
- -didDeactivate 呈现后调用,在这个方法中停用持有self的对象,如NSTimer。相当于-viewDidDisappear
-
WKInterfaceObject 及其子类
- WKInterfaceObject 相当于UIView的代理,WatchKit实际呈现的View对于开发者来说是不可见的,只能通过WKInterfaceObject对UI对象属性进行设置,可以设置的属性非常少。
- WKInterfaceButton 相当于UIButton的代理
- WKInterfaceImage 相当于UIImageView的代理
WatchKit独立于UIKit,所有的类都继承自NSObject,没有完整的Response chain
四、 Watch App UI介绍
我们做UI开发, 主要用的是WatchKit框架, 对比UIKit, 功能更少, 更简洁.
Watch App 布局
- Watch App 的视图开发不能使用代码,必须StoryBoard, 布局方式如下 。
-
Watch App 采取的布局方式和 iOS App完全不同。不能使用 autoLayout或者坐标。只能使用相对布局。
- 水平:left center right
- 垂直:top center bottom
-
View Size可以使用三种方式设置:
- Size To Fit Content : View的大小适应内容的大小
- Relative To Container : 相对容器设置自身大小
- Fixed :设置固定的宽高
UI 常见控件
WKInterfaceObject - (相当于UIView)
-
WKInterfaceGroup
- 其他的WKInterfaceObject子类对象都不能重叠,只有这个类可以同其他的WKInterfaceObject对象重叠布局。
-
不能重叠如图所示:
-
可以重叠
-
- 其他的WKInterfaceObject子类对象都不能重叠,只有这个类可以同其他的WKInterfaceObject对象重叠布局。
WKInterfaceButton - (相当于UIButton)
WKInterfaceLabel - (相当于UILabel)
WKInterfaceImage - (相当于UIImageView)
WKInterfaceTable - (相当于UITableView)
WKInterfacePicker - (相当于UIPickerView)
-
WKAlertControllerStyle - (三种弹窗方式)
- alert
- actionSheet
- sideBySideButtonsAlert
- WKInterfaceMenu - (当按压时候触发显示)
- Apple Watch的 Retina屏是支持 Force Touch功能的, 提供了一种新的交互方式.
- 这是一个 WatchOS独有的类, 当页面中配置这 Menu时, 按压屏幕将会激活页面中的Menu。并且显示出Menu下的操作, 这些操作是另一个类型, WKInterfaceMenuItem。
- Menu最多可显示四个MenuItem, 它们可以关联各自的点击事件。
- 其他...
导航开发
所有的导航方式都可以通过代码或者SB的方式实现
-
栈导航方式,类似UINavigationController。触碰左上角可返回
-
pushControllerWIthName:context: 第一个参数是Controller对应的Identifier字符串,在SB中设置。可通过context传递数据。
popController
popToRootController
-
-
modal方式
-
presentControllerWithName:context:
- dismissController
-
-
分页导航
- 类似UIPageController。左右滑动切换
- presentControllerWithNames:contexts: 传入 names 和 contexts数组,通过这种方式被呼出的 Controller 将以 page 导航方式呈现。
Apple Watch 和iOS的对比
- 只能用storyboard拖拽相应控件,搭建基本UI。
- 简单布局,默认是垂直布局。可通过嵌套Group来完成纵向布局需求。
- 界面之间的传值,需要依赖contextForSegue方法。
- 在storyboard中设置segueIdentifier。
- 同时在下一级controller的awake(withContext context: Any?)方法接收解析context。
五、App Watch与iphone 之间的通信
在 WatchOS中有个WatchConnectivity框架是专门负责 WatchOS与 iOS之间的通信的。使用Connectivity框架在 WatchKit Extension和 iOS App之间进行通信。该框架提供了两个进程之间的双向通信,并允许在前台或后台进行数据和文件的传输。
在数据传输中可以使用NSDictionary包含要发送的数据的对象,进行数据传输。
字典的键和值必须都是属性列表类型。例如NSNumbe、NSString、NSArray、NSDictionary、Bool等基础类型
如果需要包含非属性列表类型的类型,可以将他们打包到NSdata对象中,或者在发送之前将它们写入文件。
WCSession
WatchConnectivity框架中主要是通过WCSession类进行数据传输的。
在WCSession类中, 还有一些属性是只能在 iOS App中使用的。isPaired, isWatchAppInstalled, isComplicationEnabled, remainingComplicationUserInfoTransfers, watchDirectoryURL。这些都是仅仅在 iOS App中可用的。
在激活Session之前,可需要先进行一个检查当前 iOS设备是否支持Connectivity框架, 方法就是调用isSupported()方法。
- 在激活WatchKit Extension的Session前, 不必检查是否支持Connectivity框架, 因为 WatchOS一定支持Connectivity框架。
- iPhone 发送消息到apple watch
- apple watch 发送消息到 iPhone
通信方式
前台实时传输
- 前台传输, 是实时传输, 消息字典传输和消息数据传输。
消息字典传输
后台不定时传输
后台传输又分为覆盖式传输, 队列式传输.
覆盖式传输
- 后台传输中覆盖式的传输意味着, 当你进行数据传输时, 如果第一次发送的数据还没有送出去, 在此时进行第二次数据传递, 将会覆盖第一次的数据。这时数据接收方接收的数据只会有第二次的, 第一次的数据会丢失。
- 后台传输中队列式的传输意味着, 后一次的传输不会覆盖前一次所传输的数据。系统会把所有的数据按照次序进行发送。
队列式传输
- 字典传输,
- 文件传输,
- 表盘数据传输。
六、Watch App 和watchKit Extention之间数据共享
在运行时可以使用共享App Group在 Watch App和 WatchKit Extension之间共享媒体文件。
-
启用app group 功能:
-
设置数据到APP group中:
-
从app group 获取内容:
七、Watch App通知
- WatchOS 3.0(对应 iOS 10.0)开始, 通知开始使用UserNotifications框架。
- apple watch 通知分为Short-Look (短视界面)和 long-look(长视界面) 两种
Short-Look(短视界面):
Apple Watch首次收到通知时, 系统会显示短视界面。short-look只是简单的通知预览, 并且short-look的通知界面是不能自定义。用户继续查看通知,则系统会从short-look界面快速转换为long-lock界面。
Long-look(长视界面):
长视界面是一个可滚动的屏幕,显示通知的内容和任何相关的操作按钮。如果没有提供自定义通知界面,Apple Watch会显示一个默认界面,其中包括应用程序图标、通知的标题和通知内容。如果提供了自定义通知界面,Apple Watch会显示自定义界面。
Long-look 通知界面分为三个区域:sash区域、content区域、bottom区域。
- sash区域: 是覆盖式的,其中包含应用图标和应用名称。它的颜色是可以自定义的。
- content区域: 包含有关传入通知的详细信息, 这是主要的自定义区域。
- bottom区域: 包含关闭按钮以及在 iOS中注册的可操作按钮。
自定义长视(Long-Look)
自定义长视(Long-Look)通知界面由两个独立的界面组成:一个是静态的(Static),一个是动态的(Dynamic)。
静态界面(Static Interface)是必需的,是显示通知消息以及配置任何静态图像、文本的简单方法。
动态界面(Dynamic Interface)是可选的,可提供一种在运行时自定义通知内容显示的方法。
-
WatchOS会除了下面几个情况会显示静态界面(Static Interface),除此之外都会显示动态界面(Dynamic Interface):
- 当动态界面不可用时
- 没有足够的电量来保证显示动态界面时
-
明确告诉 WatchOS不显示动态界面时 如下图:
-
静态界面的目的是在 WatchKit Extension无法及时配置动态界面的情况下能提供稳定的界面。通知界面也会显示在通知中心中。
创建静态界面的规则:- 所有图片都必须位于 Watch App的包中。
- 界面不得包含control、table、map或其它交互式控件。
- 界面的notificationAlertLabel必须外连接到Lable上。Label的内容将会被设置为通知的消息
如何判断活跃设备
- 当 iPhone处于未锁屏的状态时, 通知将会推送至 iPhone上。
- 当 Apple Watch没有在用户的手腕上, 通知将会推送至 iPhone上。
- 当 Apple Watch在用户的手腕上, 且 iPhone处于锁屏状态时, 通知将会推送至 Watch上。
- 在推送远程通知时, 如果通知推送至 Watch上后, iPhone端是可以收到通知的, 但不会有任何提醒, 甚至屏幕都不会亮起。
- 如果想在没有佩戴 Apple Watch时对其推送, 也可以在常规设置中禁用手腕检测选项。但需要确保 Apple Watch没在充电器上。
八、App Watch单独发送网络请求
- APP watch 也是通过 NSUrlSession 来发送网络请求的。
- 同时也支持AFN,kingfisher .. 等ios 第三方通用库。