一.Watch OS 的由来及现状


 1.AppleWatch背景






  • Apple Watch 是苹果公司于2014年9月公布的一款智能手表 。 
  • 有Apple Watch、Apple Watch Sport 和Apple Watch Edition 三种风格不同的系列。
  • Apple Watch 采用人造蓝宝石水晶屏幕与Force Touch触摸技术,有多种颜色可供选择

  2. 官方介绍

  • 苹果的营销部分介绍AppWatch的功能更加的专业。



官方开发网站 :



二.WatchOS1.0系统和WatchOS2.0系统



1.开发环境的不同



WatchOS1.0    发布时间是2014年9月



    Xcode需要6.4版本及以上    iOS系统需要iOS8.2及以上    iPhone手机需要iPhone5及以上



1.2   WatchOS2.0     发布时间是2015年10月



  •     Xcode需要7.0版本及以上
  •     iOS系统需要iOS9.0及以上
  •     iPhone手机需要iPhone5及以上



2.  Watch OS1.0与2.0一个最大的区别就是Watch OS1.0的手表App不能够独立运行,必须要连接手机。而2.0的App可以单独在手表上运行。
  •    在1.0,一旦手表没有连接手机,Watch App根本就打不开。
  •    在2.0,Watch App能够在不依赖手机App的情况下独立运行。
  •     2.0,尽管App能够独立,但是一款WatchApp始终还是作为iPhoneApp的拓展,所以手机上面还是会安装对应的iPhone App










三.WatchOS1.0和WatchOS2.0工程创建的对比






1. WatchOS1.0





  1.1   创建项目是先创建iOS App工程,让后在target中添加Watch OS 1App,创建完成后多了 Watch App和Extension两个文件。


  • 其中 Watch App 部分位于用户的Apple Watch上,它目前为止只允许包含Storyboard文件和Resources文件。在我们的项目里,这一部分不包括任何代码。
  • WatchKit Extension 部分位于用户的iPhone安装的对应App上,这里包括我们需要实现的代码逻辑和其他资源文件



                  

ios和watchos框架区别 watchos和ios版本对应_UI








2. WatchOS2.0






2.1 直接创建工程,不需要先创建iOS App,如下图






                     



2.2 在创建完成的项目中可以看到,在Watch OS 2.0的项目中比1.0多了一个文件:ExtensionDelegate

  • 该文件负责Watch App的生命周期。
  • func applicationDidFinishLaunching() :项目加载时会调用
  • func applicationDidBecomeActive() :项目显示界面时会调用
  • func applicationWillResignActive() : 项目退到后台时会调用







  • 虽然WachOS2.0能够独立运行,但是一个WatchOS2.0的App仍然有一个iOS App,这是因为苹果将Watch App作为iOS App的延伸和拓展
  • 创建WatchApp之后一定要给storyboard添加一个模块,也就是我们常说的表芯,否则程序将报错:ERROR -[SPRemoteInterface _interfaceControllerClientIDForControllerID:] clientIdentifier for interfaceControllerID:395F0002 not found(说是controller的id找不到)

四.WatchOS 1.0 与iPhone交互框架



     1.一个app的构建是由两部分组成



  • 一部分是界面(UI界面的构建),而是逻辑代码的实现在WatchOS 1.0中,代码逻辑部分在WatchKit  Extension中,也即上面所说的在iPhone 安装的App上,
  •    





     2.Watch App 和Watch Extension 之间的交流



  • Watch App 部分位于用户的Apple Watch上,它目前为止只允许包含Storyboard文件和Resources文件。在我们的项目里,这一部分不包括任何代码。
  • WatchKit Extension 部分位于用户的iPhone安装的对应App上,这里包括我们需要实现的代码逻辑和其他资源文件。
  • 这两个部分之间就是通过 WatchKit进行连接通讯。
    下图就是通讯的流程图

ios和watchos框架区别 watchos和ios版本对应_UI_02

3.控制器的生命周期方法

  • (1)当Watch OS加载App中的Storyboard时,iPhone端也会开始加载对应的WatchKit Extension。
  • (2)当Watch OS开始初始化我们Watch App的Storyboard中的UI时,iPhone端WatchKit Extension会生成对应的WKInterfaceController,并且响应awakeWithContext:方法。
  • (3)当Watch OS显示当前加载的UI时,WatchKit Extension中对应的WKInterfaceController响应willActivate方法。
  • (4)当用户切换页面或者停止使用时,WatchKit Extension中对应的WKInterfaceController响应didDeactivate方法。
<span style="font-size:14px;">// 界面加载的时候 --->>调用我们可以在这里加载数据或者更新在StoryBoard中当前Controller添加的interface objects。
    override func awakeWithContext(context: AnyObject?) {
        super.awakeWithContext(context)
        
        // Configure interface objects here.
    }
    // 将要显示界面的时候调用 --->>我们可以在这里更新interface objects或者处理其他事件
    override func willActivate() {
        // This method is called when watch view controller is about to be visible to user
        super.willActivate()
    }
    //界面消失的时候调用(进入后台或者进入到其他界面) ---->>我们应该在这里清理task或者数据。在这里更新interface objects将会被系统忽略。
    override func didDeactivate() {
        // This method is called when watch view controller is no longer visible
        super.didDeactivate()
    }
    </span>

注意:

*在iOS中,NSTimer是一个定时器,定时器的作用的是延迟执行一段代码。

*在WatchOS中,Timer是一个计时器,计时器与定时器是两个完全不同的概念。

  • Timer的使用如下面的代码,参考时间的正负代表的意义不同:
// 设置一个 10s 计时
    timer.setDate(NSDate(timeIntervalSinceNow: 10))

   //如果相对当前时间为正数则为倒计时  如果相对当前时间为负 则为正计时   如果需要从0开始正计时则直接设为 -0
    timer.setDate(NSDate(timeIntervalSinceNow: -0))

    //开始计时
    timer.start()

五.特殊控件的使用和布局

1.语音输入控件:

  • 语音输入控件是WatchOS系统独有的控件,它不仅仅只支持语音输入,还可以设定文本选择框和一些emoji表情
  • App Watch的屏幕很小,所以没有类似Textfield的文本输入框,所有的输入文字只能通过预设或者调用siri来识别语音文字
  • 语音输入控件与其他的控件不一样,它的本身并没有Api,也不能在storyboard中找到
  • 它的调用是被直接集成在WKInterfaceController中的

2.Group控件

2.1.1 WatchApp的storyboard中控件的布局规则

  • 一行只能显示一个控件,无法将一个控件拖到另一个控件的左边或者右边。

2.1.2 如果想让一行显示多个控件,应该怎么办?

  • 使用Group控件

2.1.3 Group控件的作用

  • Group控件是WatchApp中独有的控件,它是一个可以放置子控件的容器。
  • 在IOS中有一个控件跟Group有一些类似,就是UIScrollerView控件。

2.1.4 Group控件的特性

  • WatchOS系统中唯一一个可以放置控件的容器
  • 子控件也只能选择水平和竖直放置。 Group控件的Layout属性Vertical和Horizontal

3.控件的布局


  • 在WatchOS1.0中我们无法通过代码对控件进行布局,只能在storyboard文件中设置
  • 三种布局方式: 1>Size To Fit Content
  •                              2>Relative to Container

                             3>Fixed

六.WatchKit框架UI总结

1.1-在WatchOS1.0中我们可以对UI控件做一些什么?

  • 设置和更新控件的属性和内容。
  • 可以动态设置外观(如字体颜色和背景图片等)。
  • 可以设置隐藏使界面重新布局。
  • 可以设置alpha让其透明。

1.2-我们不能对UI控件做一些什么?

  • UI元素不能通过代码动态创建和删除。
  • UI元素不能动态改变显示次序(位置)。

1.3-在WatchOS中,alpha和Hidden属性的区别

  • setHidden:会将控件隐藏,并且界面重新布局
  • setAlpha:会将控件变成透明不可见,但是界面不会重新布局

1.4-WatchOS2.0中,布局规则的改变

  • 可以动态改变UI元素的显示次序
  • 可以给UI元素添加动画
  • 2.0中我们仍然不可以动态创建和删除控件
  • 根据本人多年开发经验推测,可能苹果考虑到手表的芯片比较小,如果频繁在编译过程中动态创建UI,会消耗内存,并且也费电,所以不支持动态创建和删除UI控件

以上知识总结适合初学者,希望能够在学习的道路上我们共同成长