今天学到了watchOS2.0与iOS9通信,特地来此总结一下。附送我做的练习
两个设备的交流,只要掌握他们的“语言”,也就是API或者协议就可以用编程实现了。watchOS2.0盒iOS9之间的语言那就是Watch Connectivity Framework这个API库了。下面我想用自己弱弱的中文翻译一下官方文档,可能带入一点自己的理解,写一个阉割版的Watch Connectivity Framework文档。

Watch Connectivity framework (WatchConnectivity.framework手表连接性。框架) 提供了iOS应用与WatchKit扩展双向通信的管道。有两种可能形式的通信,一种是当接受数据的应用没有激活,它会在激活以后接收到那些数据;另一种是双方都激活的实时通信。

WCSession

手表连接性-会话

根据苹果代理模式的设计尿性,这个类应该是在通信过程中实际的业务类,我们和操作系统共用它提供应用级别的操作(检查是否支持啊,分配代理啊,激活会话啊)。WCSession在运行期间会在两个应用中都建立实例(2.0中extension是运行在手表上的),我们要做的是给他们都建立一个代理,并激活他们:

if WCSession.isSupported() {
    let session = WCSession.defaultSession()
    session.delegate = self
    session.activateSession()
}

[blockquote]记得总是在发送消息之前分配代理和激活哦[/blockquote]

在激活以后,session的属性可以用来决定连接的状态,在ios上需要判断对应的apple watch应用是否已安装,手表上不用判断ios上是否有对应应用

交流

updateApplicationContext:error:
发送状态信息,当接收方醒来可以用来更新对方。总是将旧的状态信息替换掉。

sendMessage:replyHandler:errorHandler:
sendMessageData:replyHandler:errorHandler:
发送消息进行实时通信,(session.reachable == true时会有用)

transferUserInfo:
后台排队转移用户信息

transferFile:metadata:
后台转移不只一个字典的信息,如图片和文件

这里有段翻译不来,complication和counts against 什么意思
In iOS, use the transferCurrentComplicationUserInfo: method to send data related to your Watch app’s complication. Use of this method counts against your complication’s time budget.

所有消息发送的顺序和接收顺序以致,接收方都是奔跑在后线程中的代理。

获得默认会话

isSupported()
defaultSession()

设置会话

delegate
activateSession

获得配对设备信息

iOSDeviceNeedsUnlockAfterRebootForReachability
当iPhone不可实时是因为需要解锁导致的,可以用这个的true来告诉用户解锁

决定会话实时性

reachable

管理后台前后文更新

updateApplicationContext(_:)
applicationContext
recivedApplicationContext

发送实时消息

sendMessage(_:replyHandler:errorHandler:)
sendMessageData(_:replyHandler:errorHandler:)
这个方法在watch上使用会在后台唤醒ios app

后台移交数据

transferUserInfo(_:)
outstandingUserInfoTransfers
这个属性用来取出接收到的一个个WCSessionUserInfoTransfer的数组

后台移交文档

transferFile(_:metadata:)
outstandingFileTransfers
用来取出接收到的一个个WCSessionFileTransfer的数组

WCSessionFile

手表连接性-会话文件

包含传输的文件的信息,我们不会直接创建这个类的实例。

获得文件信息

fileURL
已经接收到的文件的路径,有必要转移这个文件到更永久的路径如果需要,session:didReceiveFile:方法返回以后就不见了
metadata
跟着一起来的字典

WCSessionFileTransfer

手表连接性-会话文件移交

当要取出接收到的文件就会考虑到以下这个类的功能:

获得文件信息

file
是一个WCSessionFile

管理移交过程

transferring
是否仁在传输
cancel()
结束传输,传输完毕的话就没有效果了

WCSessionUserInfoTransfer

手表连接性-会话用户信息移交

获得移交的信息

userInfo
接收到的字典

管理移交过程

transferring
cancel()

WCSessionDelegate

手表连接性-会话代理

用来响应接收到的文件、跟踪会话连接状态

管理状态改变

sessionReachabilityDidChange(_:)
连接性发生改变

接收上下文数据

session(_:didReceiveApplicationContext:)

接收即时消息

session(_:didReceiveMessage:)
发送方使用sendMessage:replyHandler:errorHandler: 时没有提供replyHandler(=nil)时调用这个方法,
session(_:didReceiveMessage:replyHandler:)
replyHandler一定要拿来执行吗,等等我试试,要回给replymessage
session(_:didReceiveMessageData:)
类似以上俩
session(_:didReceiveMessageData:replyHandler:)

管理用户信息后台移交

session(_:didReceiveUserInfo:)
当成功接收了整个userInfo时触发
session(_:didFinishUserInfoTransfer:error:)
当自己的transfer停止了的时候触发

管理文件后台移交

session(_:didReceiveFile:)
session(_:didFinishFileTransfer:error:)

有些函数写得很self-telling(不知道这英语对不对)如果有问题直接在这下面留言给我吧~
记得去star一下我的练习

总结下三种通信模式的使用场景

updateApplicationContext

不需要reachable,
一个设备上只会有一个applicationContext,所以消息是最新的覆盖旧的

用途:更新ui界面。比如手表邮箱应用显示的最新收到的五个邮件,还有glance界面。
(如果需要这个方法包含的消息的更详细内容应该用其他两种通信方式)

sendMessage

需要reachable,手机重启后第一次解锁才行,iOSDeviceNeedsUnlockAfterRebootForReachability可以判断这个情况。
手表使用这个方法可以让手机上的应用进入后台,手机使用并不能,消息排队发送和接收
可以有回调更新发送方的视图

用途:手表上请求手机的服务。比如定位、web服务。

xxxTransfer

一种传输和reachable无关的通信,可以管理传输的过程,可以取消
用途:填充应用的内容

「Unity Shaders」Surface Shaders and Texture Mapping

 本文内容参考《Unity 5.x Shaders and Effects Cookbook》 表面着色器和材质贴图 总的来说,一个表面着色器有两个关键的步骤。第一,必须确定材质的物理...

阅读全文

「Unity Shaders」Creating First Shader

创建第一个着色器 最近学习了一段时间Unity Shader相关知识,在进一步自顶向下学习计算机图形学之前,先将之前看《Unity 5.x Shaders and Effects Cookbook...

阅读全文

《Effective c++》、《Inside C++ Model》 小结(一)

最近瞻仰了一下Scott Meyers久负盛名的《effective c++》,特来总结一下,以加深一下印象与防止自己今后记忆力衰退。这本书里很多都是工程上很有意思的tips...

阅读全文

2 条评论

欢迎留言