Apple Watch已经上市,接受预定,市场上各种声音不断,有说它好的,有说它不好,各有各的理由,争议不断。剩下的就交给市场吧,市场会告诉你一个产品到底是好是坏。
前段时间,公司要开发watch版本的应用,本人便开始学习WatchKit。学之前还心想,这东西就这么大,能玩出什么花来?后来的经历证明,我还是天真了,虽然玩不出什么花,会有很多坑。。。
最好是把官方开发文档看一遍,会避免走些弯路。
有时间最好把watchKit的官方介绍看一遍。
设计师sir最好把官方设计文档看一遍,watch上面不是什么都可以做的。。。
前段时间,有幸得到苹果公司邀请来到苹果实验室,得以一窥watch真容,总得感觉不错,这玩意有玩头。
watch是通过蓝牙与手机通讯的,有证据表明,watch配备了wifi模块,能在离开手机并且处于已知wifi网络情况下,自行完成一些有限、但是重要的网络功能,比如向Siri发起询问、收发信息、向其他Apple Watch用户收发涂鸦和心跳消息等
watch是和手机一一匹配的,解绑和绑定都很慢,大概半个小时到左右。在与iPhone连接的期间,Apple Watch会在前者的本地存储空间当中建立一个备份,以供日后的数据恢复之用
watch版本开发类似App Extension(应用扩展) ,比如Today Extension(今天扩展),仅支持Xcode 6.2以上版本,最好用Xcode 6.3,相比6.2,6.3多了很多规范检查,比如检查版本号是否一直,icon是否全等。
watch的所有界面是放在Interface.storyboard
里面,图片自愿文件主要是放在Images.xcassets
,这两个都是在WatchKit app
目录下,而代码文件是在WatchKit Extension
下面。
界面布局已经不是传统的布局了,没有明确的frame
,无法使用autolayout
,复杂的布局只能通过嵌套多层WKInterfaceGroup
实现,为了调节间距,时常有种要抓狂的感觉。。
由于watch上面图片WKInterfaceImage
是不能直接添加文字WKInterfaceLabel
的。对于一个WKInterfaceGroup
只能是挨着排,不能重叠。当设计师sir提出这个想法的时候,我第一反应是只能通过在手机端重新绘制图片(给图片绘制上文字)来实现,设计师sir安慰到你试试看,换个别的方法。于是乎,亮光一闪找到一个方法,图片作为WKInterfaceGroup
的背景图片(在线下载),文字添加在WKInterfaceGroup
上!
UIPagecontrol
的多个点)刚开始,翻遍WatchKit
也找不到类似UIScrollView
的类,近乎绝望的时候,看到Interface.storyboard
里面的next page
属性,具体使用看这里。通过指定WKInterfaceController
的next page
界面(Interface.storyboard
里面)可以创建左右滑动的多页效果。
代码里面实现动态控制有多少页:
+ (void)reloadRootControllersWithNames:(NSArray )names contexts:(NSArray )contexts;(void)becomeCurrentPage;
WKInterfaceController
之间传值A界面push到B界面:
A : - (void)pushControllerWithName:(NSString *)name context:(id)context; //context为自定义的属性值
B : - (void)awakeWithContext:(id)context //context为上个界面传入的值
WKInterfaceController
生命周期watch app 在点击手表滑轮退出app后,watch app会处于休眠状态,并没有完全退出。下次进入watch app还会处于上次打开的界面。WKInterfaceController
的主要回调方法
- (void)awakeWithContext:(id)context //只会调用一次,适合在这里添加menu菜单(void)willActivate //类似viewWillAppear,可能会多次调用,比如在界面首次加载完成后会调用,在menu菜单消失后就会调用(void)didDeactivate //类似viewWillDisappear,可能会多次调用,比如在用户按下滑轮退出watch app后,在menu菜单出现前就会调用
对于Glance 界面,苹果有提供多套标准模板,在Interface.storyboard
点击glance
界面能看到。这个界面不能添加button
控件,下面是自定义点击事件示例:
GlanceController
里面:
(void)updateUserActivity:(NSString )type userInfo:(NSDictionary )userInfo webpageURL:(NSURL *)webpageURL;//通过此方法提前注册好点击事件,建议是放在网络连接成功后.
在设置为ls Initial Controller
的WKInterfaceController
里面:
(void)handleUserActivity:(NSDictionary *)userInfo //添加此方法,判断userInfo处理 glance界面 回调
发到手机上面的通知,会自动在与之配对的手表上面显示出来,如果你需要添加Custom Long Look Interface
,还有自定义动作按钮,那需要在原有通知字段基础上,加上category
字段,并且与alert
同级,通过不同的category
值可以添加不同的自定义事件按钮。示例如下:
UIMutableUserNotificationAction *actionOne = [UIMutableUserNotificationAction new]; actionOne.title = @"查看详情"; actionOne.identifier = @"look detail";//用来区别每个action actionOne.activationMode = UIUserNotificationActivationModeForeground; //设置为Foreground才能打开客户端,不然为后台运行 UIMutableUserNotificationCategory *inviteCategory = [UIMutableUserNotificationCategory new]; [inviteCategory setActions:@[actionOne] forContext:UIUserNotificationActionContextDefault]; inviteCategory.identifier = @"demo"; //此处对应于`category`字段 NSMutableSet *categories = [NSMutableSet new]; [categories addObject:inviteCategory]; UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:categories]; [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
Handoff功能是iOS8以后才推出的,Handoff是watch和iphone沟通的绝佳方式之一,在实验室里,苹果方面的人也推荐使用Handoff。
具体的使用方法查看这里,demo
确保你的app icon不包含alpha channel,不然将会在审核期间被拒
确保iPhone app、WatchKit extension以及Watch app有着相同的编译号和版本号
WatchKit extension需要自己的app ID和Provisioning profile
要确保app target和watch app target展示的名称应该一致,搜索Product Name
要和Bundle Display Name
一致。
在新版本应用升级提示描述里面要体现是为Apple Watch
升级的。
更多看这里
个人体会:watch开发平台,是一个全新的平台,不同于iPhone开发,不能用iPhone开发的角度是思考watch怎么实现某个功能。全新的平台会有全新的交互方式,多看官方文档才能更好的了解这个平台。
在本人博客上面的地址:http://www.wyy.so/2015/04/18/WatchKit开发的一些总结/