1、Apple Watch简介:html
两个不一样的可执行文件:ios
a>在Apple Watch上运行的Watch应用,Watch应用只包含与应用程序的用户界面有关的storyboards和资源文件。编程
b>在用户iPhone上运行的WatchKit应用扩展,WatchKit应用扩展则包含了用于管理、监听应用程序的用户界面以及响应用户交互的代码。服务器
注意:Watch应用须要尽量实现Apple Watch提供的全部交互动做。因为Watch应用目的在于扩展iOS应用的功能,所以Watch应用和WatchKit应用扩展将被捆绑在一块儿,而且都会被打包进iOS应用包。若是用户有与iOS设备配对的Apple Watch,那么随着iOS应用的安装,系统将会提示用户安装相应的Watch应用。app
2、Watch App操做步骤:编辑器
a>建立Watch应用ide
b>建立Glance界面工具
b>自定义通知界面布局
3、配置Xcoe项目:字体
一、向iOS应用中添加Watch应用:
1. 打开现有的iOS应用项目.
2. 选择 File > New > Target,而后选中Apple Watch
3. 选择 Watch App
4. 单击 Next
5. 若是您想要使用glance或者自定义通知界面,请选择相应的选项, 咱们建议您激活应用通知选项。选中以后就会建立一个新的文件来调试该通知界面。若是您没有选择这个选项,那么以后您只能手动建立这个文件了。
6. 单击 Finish
二、应用对象的结构:
Watch App ——————> WatchKit Extension ——————> iOS App
Watch App Target ——————> WatchKit Extension Target ——————> iOS Target
三、编译、运行以及调试程序
为glance和通知配置自定义编译方案:
1. 选择现有的Watch应用方案.
2. 从方案菜单中选择Edit Scheme.
3. 复制现有的Watch应用方案,而后给新方案取一个合适的名字。好比说,命名为“Glance - My Watch app”,表示该方案是专门用来运行和调试glance。
4. 选择方案编辑器左侧栏的Run选项
5. 在信息选项卡中,选择合适的可执行对象
6. 关闭方案编辑器以保存更改
4、Watch应用的体系结构:
1、Watch应用和WatchKit应用扩展之间的通讯:
Apple Watch : Watch App ——————> WatchKit
iPhone : WatchKit Extension ——————> WatchKit
2、启动Watch应用:
Apple Watch : Watch App ——————>Load Initial interface controller ——————> initialize UI ( initWithContext方法) ——————> Display UI(willActivate方法)
3、界面控制器的生命周期:
Apple Watch : Launch App ——————> Load UI ——————> initialize UI(initWithContext方法) ——————> Display UI(willActivate方法) ——————> Load Initial interface controller(Various action methods 方法) ——————> User stops interacting(didDeactivate方法)
4、WKInterfaceController的主要方法:
- (void)awakeWithContext:(nullable id)context;
这个方法用来准备显示界面。借助它来加载数据,以及更新标签、图像和其余在故事板场景上的界面对象。
- (void)willActivate;
这个方法可让您知道该界面是否对用户可视。借助它来更新界面对象,以及完成相应的任务,完成任务只能在界面可视时使用。
- (void)didDeactivate;
使用didDeactivate方法来执行全部的清理任务。例如,使用此方法来废止计时器、中止动画或者中止视频流内容的传输。您不能在这个方法中设置界面控制器对象的值,在本方法被调用以后到willActivate方法再次被调用以前,任何更改界面对象的企图都是被忽略的。
五、与Containing iOS应用共享数据:
若是您的iOS应用和WatchKit应用扩展都依赖于相同的数据,那么您可使用共享程序组来存储数据。共享程序组是一个位于本地文件系统的区域,应用扩展和应用都可以访问。因为两个程序在不一样的沙箱环境中运行,它们通常状况下都不与对方共享文件和进行通讯。共享程序组让共享数据成为可能。你可使用这个空间来存储共享的数据文件或者在两个程序间交换消息。
您能够在iOS应用和WatchKit应用扩展中的Capabilities选项卡中启动共享程序组。激活这项功能后,Xcode将会为每一个对象添加受权文件(须要的话),并给那个文件添加com.apple.security.application-groups受权。要共享数据,这两个对象必须选择相同的共享程序组。
程序运行时,您能够经过在共享容器目录中读写文件以在两个程序间共享数据。要访问容器,请使用NSFileManager中的containerURLForSecurityApplicationGroupIdentifier:方法来接收该目录的根路径。使用方法返回的URL来枚举目录内容或者在目录中为文件建立新的URL。
5、使用iOS技术注意事项:
一、避免使用须要用户权限的技术,好比Core Location。在WatchKit应用扩展中使用该技术的话,可能会在您第一次请求使用时致使用户的iPhone上显示出一个意想不到的提示。更糟糕的是,这个情况可能会在任什么时候间出现,即便用户的iPhone在他们的口袋里而且屏幕是锁定的。
二、不要使用后台执行模式的技术。WatchKit应用扩展只考虑在前台运行的状况,而且其只在用户和对应的Watch应用交互时运行。所以,支持后台运行的某些技术在WatchKit应用扩展中并不被支持。
三、避免使用须要长时间运行的技术。WatchKit应用扩展在用户中止和对应的Watch应用交互后便迅速暂停。因为与Watch应用的交互一般是短暂的,所以应用扩展可能会在请求的数据到达前暂停运行。
6、WatchKit App 概要:
一、界面控制工做流程:
界面控制器(Interface controller)管理你storyboard的场景内容。每一个界面控制器都使用outlet来保存场景中的引用对象,并定义action方法来响应用户交互。在运行时,你可使用界面控制器的initWithContext:和willActivate方法来配置界面。在这些方法里,你的操做任务以下:
a》获取你想展现的数据。
b》设置初始化和配置标签,图片和其余控件。
c》根据你的须要,展现或隐藏你的界面对象。
二、整合你的故事版场景:
三、在运行时更新界面:
在运行过程当中,界面控制器能让对象在相应的storyboad场景中作以下改变:
a》设置或修改数据变量。
b》支持改变对象的外观。
c》改变对象的透明度。
d》显示或隐藏对象。
Responding to User Interactions(响应用户界面方法):
- (IBAction)buttonAction:
- (IBAction)pickerAction:(NSInteger)index:
- (IBAction)switchAction:(BOOL)on:
- (IBAction)sliderAction:(float)value:
- (IBAction)menuItemAction:
四、界面的国际化:
对于文本和图片的国际化处理,可使用iOS和OS X应用相同的技术:
a》使用NSLocalizedString宏来从资源文件夹加载字符串。
b》使用NSNumberFormatter对象来格式化数值型变量。
c》使用NSDateFormatter对象来格式化日期。
7、WatchKit App 界面导航:
a》实现分层界面:
在该界面控制器中,您能够经过调用当前界面控制器的pushControllerWithName:context:方法在屏幕上推出一个新的界面控制器。
想要解除界面控制器,可调用其popController方法。
b》实现基于分页的界面:
能够建立下一页的segue,以便在app的storyboard文件中配置分页界面。想要建立该segue:
1.对您但愿做为第一屏的界面控制器执行Control-click操做,并将其拖拽到不一样的界面控制器中。
应该强调第二个界面控制器,以指明segue是可用的。
2.释放鼠标按钮。
3.从relationship segue面板中选择next page。
一般在storyboard文件中配置一组初始的页面集合。当app启动时,WatchKit会实例化和初始化您的初始界面控制器,而后是分页界面中的其余界面控制器。若是您想改变一组界面控制器,请在初始界面控制器的init方法中调用reloadRootControllersWithNames:contexts:方法。调用该方法会使得WatchKit在尝试展现界面中任何其余页面以前加载新的界面控制器。您也能够在app运行时调用reloadRootControllersWithNames:contexts:方法来改变展现中的页面集合。
当系统加载您的WatchKit app界面时,它将实例化和初始化组成界面的全部界面控制器。当用户从一个界面控制器切换至下一个时,它将调用当前界面控制器的didDeactivate方法,以及即将展现的界面控制器的willActivate方法。willActivate方法可确保界面中的信息是最新的。
c》以模态形式展现界面控制器
一、调用presentControllerWithName:context:方法来模态地展现单个界面控制器。
二、调用presentControllerWithNames:contexts:方法展现两个或者多个使用分页布局的界面控制器。
7、WatchKit App 界面对象:
1、建立界面对象:
@property (weak, nonatomic) IBOutlet WKInterfaceLabel* label;
二、在设计阶段配置界面:
注意:可使用一个WKInterfaceLabel对象来更改标签的文本、颜色以及字体,不过却不能更改它的行数或者是行高。
三、在运行时更改界面:
- (instancetype)initWithContext:(id)context {
// Always call super first.
self = [super initWithContext:context];
if (self){
// It is now safe to access interface objects.
[self.label setText:@“Hello New World”];
}
return self;
}
四、响应用户交互:
请使用按钮、开关以及其余的交互控件来更改应用状态。当点击按钮或某一控件的值发生变化时,WatchKit会调用界面控制器中相关的动做方法(action method)。每种界面对象针对其动做方法都有一个必须的格式,以下所示:
- (IBAction)buttonClicked;
五、隐藏界面对象:
在设计布局时,隐藏起某些项目就能够当作是将其从布局中彻底删除。若是要隐藏某个对象,只须要调用setHidden:方法并为其传递YES值就好了。
8、WatchKit App 文本、标签以及图片:
一、使用自定义字体:
UIFont* menloFont = [UIFont fontWithName:@"Menlo" size:12.0];
NSAttributedString *attrString = [[NSAttributedString alloc]
initWithString:@"My Formatted Text"
attributes:@{NSFontAttributeName: menloFont}];
[self.myCustomFontLabel setAttributedText:attrString];
二、自定义系统字体:
三、国际化您的文本代码:
使用基于Xcode国际化支持的storyboard和xib文件。基于国际化可让你仅仅只用一个storyboad文件就能支持全部的本地化。本地化字符串分别存在特定的区域语言字符串中。
使用NSLocalizedString类的宏定义来让程序自动检索本地化字符串。
经过NSNumberFormatter类使用用户所在区域和本地的设置来格式化数值型的值。
经过NSDateFormatter类使用用户所在区域和本地设置来格式化时间。
9、WatchKit App 表格:
一、配置Row Types:
Row Type是一个在table中以单行形式展现数据的模板。每一个table必须至少有一个row type,您能够根据需求定义额外的row type。您能够用row type区分table中的不一样内容。好比您可能在内容行上、标题和注脚上使用不一样的类型。当您为界面控制器场景添加table时,Xcode会自动建立初始的row types供您配置。
为table添加row types:
a>在storyboard文件中选中table对象.
b>打开Attributes inspector.
c>使用Rows属性更改可用row type数量.
为row type定义一个row controller类:
a>为WatchKit扩展添加一个新的Cocoa Touch类
b>让新类继承NSObject
c>为每一个计划在运行时访问的标签、图片或者控件添加声明的属性。声明属性可以使用如下格式,请更改类以匹配相应的界面对象
在storyboard中配置row type:
a>在storyboard文件中选中row controller对象
b>将row controller的Identifier属性设置为惟一值,随后您会在建立表格行时使用该标识符。在行类型中该值必须是惟一的,可是实际值仍是由您来定夺。在Attributes inspector中设置该值。
c>将row type的类设置为您的自定义类。您须要在Identity inspector中设置类信息。将row type元素和类中对应的outlets链接起来
d>将storyboard文件中的项目和outlets链接并绑定。当您在代码中配置table时,WatchKit会在运行时使用该信息实例化对应的类
二、运行时配置table内容:
建立并配置列表行:
a>先决定你须要建立的行的数目和类型,这取决于你想要展现的数据类型
b>使用setRowTypes:或者setNumberOfRaws:withRowType:方法来建立。这两个方法都会在界面上建立新的列表行,而且会在WatchKit扩展中实例化对应的类。这些实例被保存在table中,且可经过rowControllerAtIndex:方法访问
c>使用rowControllerAtIndex:方法遍历表格中的每一行
d>使用row controller对象来配置每一行中的内容
10、WatchKit App 情景菜单:
一、设计菜单项:
每一个菜单项包含一个可点击区域和一个标题。可点击区域由纯色背景和您提供的图片组成。图片必须是模板图片,其alpha通道指定了绘制在纯色背景上的图形。
二、为界面控制器添加情景菜单:
情景菜单中的菜单项目总数不能超过4个,无论是在storyboard文件中定义仍是以编程方式添加,或者组合两种方式。
1.打开storyboard文件。
2.从工具库中拖拽一个菜单项,并将其添加到界面控制器场景中。初始菜单包含一个单独的菜单项目。
3.最多从库中拖拽3个菜单项到菜单中。你还可使用菜单的Attributes检查器来设置菜单项数量,您添加的菜单项不能被移除。
4.对于每一个菜单项目,可以使用Attributes检查器来指定菜单的标题和图片,这二者都是须要的。
5.在界面控制器类中将每一个菜单项和操做链接起来。菜单操做方法格式以下:
- (IBAction)doMenuItemAction
想要在运行时添加菜单项目,请调用界面控制器对象的addMenuItemWithImage:title:action:或者addMenuItemWithImageNamed:title:action:方法。您添加的菜单项被附加到storyboard文件中指定的对象上。以编程方式添加的菜单项目持续附属于菜单,直到您明确地移除它们或者您的界面控制器解除配置。
11、Glance开发基础:
一、Glance的生命周期:
Glance界面控制器的生命周期和其余WatchKit界面控制器同样,不过glance的界面控制器的初始化要早于其它,以便于glance能快速的显示给用户。
二、Glance界面指南:
遵循下面的指南来填充内容:
1.Glance的设计目的在于快速的传达信息。不要显示一堆文字。适当的使用图像、颜色和动画来快速传达信息。
2.聚焦在最重要的数据上。Glance不是你的应用的替代。就像Watch app是对应的iOS app的缩水版,你也能够把glance看作Watch app的缩水版。
3.不要在glance界面中包含交互控件。好比按钮、选择器、滑动器和菜单。
4.避免使用表格和地图。尽管并无禁止你这么作,手表上有限的控件让表格和地图不是那么有用。
5.让显示的信息保持及时。使用全部可用的资源,包括时间和地理位置,来向用户提供有用的信息。而且注意更新你的glance,以免由于glance初始化到显示花费的时间而让信息过期。
12、管理Glance界面:
一、实现一个Glance界面控制器:
a.使用initWithContext:方法来初始化你的glance界面,而且设置标签和图像的初始值。
b.基于内容的改变,使用willActivate来更新glance。
二、自定义从Glance启动应用:
在触摸glance时启动并显示一个不一样的界面控制器,你须要按以下步骤操做:
a.在glance界面控制器中:
配置glance的initWithContext: 和 willActivate ,这一步和其余状况是相同的。
调用updateUserActivity:userInfo:方法,而且使用userinfo参数来传达你的应用glance的状态。
b.在你的应用的主界面控制器:
实现actionForUserActivity:context: 方法,使用提供的userinfo字典来肯定显示哪一个界面控制器,你还应该生成一个上下文对象并将它传递给指定的界面控制器。
十3、Notification 通知的一些要点:
一、Short-Look 界面
Short-Look 界面是一个不可滚动的视图,而且不能够被定制。系统使用一个通用的模板来显示应用名称、图标,以及存储在本地或远程通知消息中的标题。
二、Long-Look 界面
Long-Look 界面是一个可滚动的界面,它显示了通知的所有内容,以及全部的关联按钮。若是您没有提供自定义的通知界面,那么 Apple Watch将会显示默认界面,里面包括了应用图标、通知的标题,以及提示消息。而若是您提供了自定义的通知界面,那么 Apple Watch 将会显示它。
Long-Look 通知界面分为三个区域:
a.Sash顶部——》System-Provided
b.Content Area中间部分——》App-Provided content
c.Bottom Area——》App-Defined actions
三、为通知上添加按钮
按钮经过为通知提供封装的动做响应来帮用户节省时间。Apple Watch使用iOS 应用注册的交互通知界面来显示按钮。在 iOS 8 以及更高版本中,应用都须要使用UIUserNotificationSettings 对象来注册它们显示的生成通知对话框。一旦对象建立,应用也一样能够指定自定义通知类别以及其对应的按钮动做。Apple Watch使用这个类别信息来添加相应的按钮到 Long-Look 界面上。
四、让按钮响应单击动做
前台按钮动做将启动您的 Watch 应用,而后将按下的按钮的 ID 传递给主界面控制器。
十4、Notification 自定义通知界面:
一、自定义通知界面含有两个独立的界面:
一个静态界面:静态界面是一个简单的界面,它仅仅只含有通知的提示信息,以及您在设计时配置的静态图像以及文本信息。
一个动态界面:动态界面显示了完整的自定义通知内容样式,而且它能够包含由 WatchKit 扩展提供的定制内容和图形。
二、配置自定义界面的通知类型:
当生成远程通知时,您的服务器要经过在其`aps`字典中包含category键的值来指定通知类型。`category`的键值要和您在 iOS 应用以及您在通知类别对象中的 Name 属性指定的同样。例如,在图15-2中,类别文本是`MeetingInvite`。
三、配置静态通知界面:
a.全部的图像必须驻留在 Watch 应用包中
b.界面不能包含控件、表格、地图,以及其余交互元素
c.界面的`notificationAlertLabel`输出口必须与某个标签相关联。标签的文本设置为通知的警告信息。其余的标签文本不变,而且只可以在设计时设置。
d.除了和`notificationAlertLabel`输出口相连的标签外,在静态通知场景中的标签和图像是不可以改变的。当您在设计界面时请记住这条准则,并确保每一个标签的文本是合适的。
四、配置动态通知界面:
动态通知界面给用户提供了一个更丰富的通知体验。借助动态界面,您能够显示不少的内容。您能够添加额外的信息,配置多个标签,动态地生成内容,等等。
五、设计动态界面
可在绝大多数界面上使用标签、图像、组以及分隔符。
您可能想要在须要的时候使用表格和地图。
不要包含有按钮、开关,或者其余交互控件。
六、在运行时配置动态界面
界面初始化以后,WatchKit将负载数据传输到通知界面控制器的不一样方法中。对于远程通知来讲,WatchKit 调用didReceiveRemoteNotification:withCompletion:方法。对于本地通知来讲,它调用didReceiveLocalNotification:withCompletion:方法。请使用接受到的数据来配置您的通知界面。界面配置完成后,您必需要调用所提供的完成处理代码块来让 WatchKit 知道您的界面已经准备就绪。
Watch App ——————>Locate the custom UI in the notification storyboard( init方法 ) ——————> Process the notification( didReceiveRemoteNotification:withCompletion:方法 ) ——————> Display the Notification UI