AppleWatch开发初探

目录

Apple Watch 简介
为什么要做Apple Watch App
基本概念
开始进行开发

总结


Apple Watch 简介

2014年9月9日,苹果2014年秋季新品发布会在加州库比蒂诺的Flint表演艺术中心举行,会上苹果公司CEO Tim Cook 对外公布了全新的产品:Apple Watch,并于4月24日上市。
Apple Watch采用蓝宝石屏幕,两个屏幕尺寸。支持电话,语音回短信,连接汽车,天气、航班信息,地图导航,播放音乐,测量心跳、计步等几十种功能,是一款全方位的健康和运动追踪设备。

为什么要做Apple Watch App

得益于Apple的巨大号召力,Apple Watch是目前看来市场上唯一一款有市场前景和应用前景的智能穿戴设备,人们普遍相信Apple能精益求精,做出出色的产品,Apple也对它寄予厚望:

“No other Apple device has ever been so closely connected to the user.”

现在已有Apple Watch应用适配的App已经有很多,许多常见的App已经对它做了适配,像微信、微博、网易新闻、qq、支付宝等大众应用,早已推出了Watch版。我司的竞品中,也有提供了Watch版的厂商,落后就要挨打,我们在竞争中已经落后了一丢丢,所以有必要对它进行关注,往后推出产品。
除此之外,作为一个iOS开发者,为这样一个新的设备做好适配也是很有必要的。

基本概念

Apple Watch 是一条全新的产品线,Apple引入了一些全新的概念在手表上,下面简略介绍一下:

  • Force Touch

    用力按压屏幕,这会触发当前屏幕的菜单。

  • Gestures

    分别是点按、横划、竖划、侧滑返回。

  • Digital Crown

    数码表冠可以滚动content,点按可以返回应用列表和表盘界面,长按呼出Siri,这些都是系统管理的, 类似于Home键。

  • Side Button

    可以呼出Friends screen,长按会有关机选项。

  • Glance

    Glance界面可以在表盘页面下边缘滑动弹出,用来显示App的预览信息,可以左右横划,每个页面展示一个App的Glance,对应用来说,它不是必须的。

  • Notification

    分为两种,Short looks 和 Long looks,分别对应刚看到通知的简短信息和停留一会的详细信息。

  • handoff

    Apple Watch helps people quickly access information, but there are times when they may want to dive deeper into content on their iOS devices. Your Apple Watch app uses Handoff to convey information about the wearer’s current activity to their other devices.

开始进行开发

iPhone App、WatchKit Extension和Watch App 三者的关系

iOS8开始Apple推出了一个新的概念App Extension,通过App Extension,开发者可以创建像第三方键盘、TodayWidget的这种扩展。

这是他们之间的关系图:
iphone_watch_communication

Apple Watch的开发用的也是这种模式,其中Watch App与WatchKit Extension的通信方式我们不用关注,WatchKit的API就是对这种通信的封装。
在Apple Watch的开发上:

  • Watch App相当于Host app,它由WatchKit Extension控制,Watch App会安装在手表上,它只包含资源文件,不包含代码。
  • WatchKit Extension是安装在手机上的,它负责实现Watch App的逻辑,交互通过蓝牙进行。
  • iPhone App是主应用,WatchKit Extension和Watch App依赖于它。

主要类

AppleWatch发布的时间并不长,现在WatchKit暴露出来的API不多。下面是一些常见的类。

WKInterfaceController

WKInterfaceController 在 WatchKit 中类似UIKit的 UIViewController,它的生命周期方法比UIViewController少很多:
lifecircle

func awakeWithContext(context: AnyObject?)//类似viewDidLoad
func willActivate() // 类似viewDidAppear
func didDeactivate() // 类似viewDidDispear

WKInterfaceController还可以负责处理通知的action选择事件,table的选择事件等

func handleActionWithIdentifier(identifier: String?, forRemoteNotification remoteNotification: [NSObject : AnyObject]) 
func handleActionWithIdentifier(identifier: String?, forLocalNotification localNotification: UILocalNotification) 
func handleUserActivity(userInfo: [NSObject : AnyObject]?) 
func table(table: WKInterfaceTable, didSelectRowAtIndex rowIndex: Int) 

除了上面几个它还有API与iPhone App 交互

class func openParentApplication(userInfo: [NSObject : AnyObject], reply: (([NSObject : AnyObject], NSError?) -> Void)?) -> Bool

处理handoff的API,其中updateUserActivity()向iOS App提供handoff信息,可以在iOS应用端处理此信息。
invalidateUserActivity()通知系统handoff信息已经更改。

func updateUserActivity(type: String, userInfo: [NSObject : AnyObject]?, webpageURL: NSURL?) 
func invalidateUserActivity()

WKInterfaceObject

是UI元素的父类,Button、Label和Image这些类都是它的子类。WKInterfaceObject在功能和用法上有点像UIKit中的UIView,但是它并不是直接显示在Watch上的View,因为代码的逻辑是运行在iOS上的,WKInterfaceObject只是watch app在WatchKit Extension上的代理对象。
在WatchKit 1.0它只有5个API:

func setHidden(hidden: Bool)
func setAlpha(alpha: CGFloat)
func setWidth(width: CGFloat)
func setHeight(height: CGFloat)

var interfaceProperty: String { get }

可见它不支持操作添加删除子元素(只能用storyboard了),不如UIView灵活。

WKInterfaceTable

WKInterfaceTable相当于UIKit的UITableView,在WatchOS1.0上,AppleWatch的逻辑代码执行在iPhone上,要以delegate方式交互数据受蓝牙传输的限制,并不现实,要对它进行配置,只能靠初始化时调用代码设置:

//  MyRowController.swift
import Foundation  
import WatchKit

class MyRowController: NSObject {  
    @IBOutlet weak var label: WKInterfaceLabel!
}

//  InterfaceController.swift
import WatchKit  
import Foundation

class InterfaceController: WKInterfaceController {

    let tableDataSource :[[String:String]] = [
        ["title":"title0","description":"description0"],
        ["title":"title1","description":"description1"],
        ["title":"title2","description":"description2"],
        ["title":"title3","description":"description3"],
        ["title":"title4","description":"description4"],
        ["title":"title5","description":"description5"],

    ]
    @IBOutlet weak var table: WKInterfaceTable!

    override awakeWithContext(context: AnyObject?) {
        super.awakeWithContext(context: context)

        table.setNumberOfRows(data.count, withRowType: "MyRowController")
        for (i, value) in enumerate(tableDataSource) {
            if let rowController = table.rowControllerAtIndex(i) as? MyRowController {
                rowController.info = value
            }
        }
    }
}

Menu

Context Menu是AppleWatch的独有概念,它由ForceTouch呼出,可以在代码里调整它的数量和功能,有点像安卓里的上下文菜单。

func addMenuItemWithImage(image: UIImage, title: String, action: Selector) // all parameters must be non-nil
func addMenuItemWithImageNamed(imageName: String, title: String, action: Selector)
func addMenuItemWithItemIcon(itemIcon: WKMenuItemIcon, title: String, action: Selector)
func clearAllMenuItems()

用户文本输入

使用 presentTextInputControllerWithSuggestions 方法实现输入(语音转文本)。

    func presentTextInputControllerWithSuggestions(suggestions: [AnyObject]?, allowedInputMode inputMode: WKTextInputMode, completion: ([AnyObject]!) -> Void)

与iPhone交互

Watch App 从运行机制上更像是 iOS 应用的一个 Widget,本质上跟 iPhone 锁屏界面的“今天”(Today)没有区别,它们的开发思路和运行模式也很接近,Today 和 Watch APP 都属于 iOS 中 Extension 开发。

这就意味着,WatchOS的App跟iOS的App做交互很麻烦,查了一下,开发者可以使用下面几种方式实现:
App的通信需要我们自己开发。有下面几种方式:
Extension和iPhone


  1. 共享存储空间
    App之间的一种通信方式是读写同一块共享存储空间,达到数据交换的目的,我们可以共享NSUserDefault或SQLite。需要注意的是Extension和iPhone App属于不同的进程,要共享存储空间,需要在工程对应的target中同时打开App Groups的权限,并选择共享的组名。
  2. 直接通信
    xtension和iPhone App另外一种通信方式是Extension主动向iPhone App发起请求,进行某种操作,或者请求数据。
  3. CFNotificationCenter
    DarwinNotifyCenter是系统全局的通知,跨进程当然不在话下。

The Darwin Notify Center has no notion of per-user sessions, all notifications are system-wide.
WatchKit Extension中向iPhone App发送请求:

class func openParentApplication(userInfo: [NSObject : AnyObject], reply: (([NSObject : AnyObject]!, NSError!) -> Void)?) -> Bool

在iPhone App的AppDelegate中实现如下方法响应Watch App的请求:

- (void)application:(UIApplication * nonnull)application handleWatchKitExtensionRequest:(NSDictionary * nullable)userInfo reply:(void (^ nonnull)(NSDictionary * nullable replyInfo))reply;

此外,我们还可以通过openURL的方式由WatchKit Extension向iOS App发起请求。

其他

WatchKit Extension是运行在手机上的,资源如果展示在手表上要经过蓝牙传输,所以一般需要把资源文件放在Watch App的target里。
因为代码并不直接操控Watch上的View,所以,手表上的touch事件无法捕捉,动画也只有帧动画。

WatchOS 2.0

以上只适用于WatchOS 1.0,WatchOS 2.0会有一个巨大的改变:Apple开放了多个硬件的权限,Apple Watch可以连接Wifi,开发者可以调用声音视频,使用它上面的传感器。

Apps now run natively for better performance.

With watchOS 2, many apps are native apps, which means they run entirely on your Apple Watch. So they load more quickly and have even greater capabilities.

Do even more with apps.

Apple Watch apps have more possibilities with watchOS 2. Apps can now take advantage of features like the Taptic Engine , Digital Crown, accelerometer, heart rate sensor, speaker, and microphone.

已有应用分析

微信

微信可以查看简单的消息和浏览朋友圈,有一个很有趣的功能,它可以在手表上向好友打招呼,好友的iPhone上会有一个定制的通知。

网易新闻

可以看新闻列表和内容,不过实际操作起来并不爽快,不如直接看手机。

家庭用药

定时提醒用药有点抓住了痛点,其他功能并没什么用,只会提示打开iOS App查看文章。

小结

现在的好应用还是太少了,这不得不感谢糟糕的API。

总结

Apple Watch发布的时候说的很好听,但是实际开发中的限制太多,根据我对API的分析,它为开发者开放的东西太少了,动画基本不可用,视频音乐不支持,界面也不怎么灵活,手表当中一些炫酷的功能也没有API,就好像传感器和屏幕仅仅是粘在了一起,目前用处不大。虽然我们有竞品早一步进入了市场,基于Apple的限制,也没法做出很出色的产品,这也是开头我所说的落后一丢丢的由来。Watch OS 2.0的发布将会是一个跨越,它会带来更加灵活强大的功能,开发者在新的平台上能开发出有想象力的应用。

参考文献

http://www.zhihu.com/question/29446492
https://developer.apple.com/watch/human-interface-guidelines/
http://onevcat.com/2014/11/watch-kit/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值