MST
星途 面试题库

面试题:Objective-C的WatchKit数据交互机制

在Objective-C的Apple Watch开发中,WatchKit应用与iPhone应用之间的数据交互是如何实现的?请阐述WatchConnectivity框架的主要类和方法,以及如何利用它在两个设备间传递复杂对象。如果在传递数据过程中遇到数据丢失或不完整的情况,你会从哪些方面排查问题?
26.9万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

WatchKit应用与iPhone应用数据交互实现方式

在Objective-C的Apple Watch开发中,WatchConnectivity框架用于WatchKit应用与iPhone应用之间的数据交互。此框架允许两个应用在配对的设备间发送和接收信息,即使应用处于后台或未运行状态。

WatchConnectivity框架主要类和方法

  1. WCSession类

    • 单例获取:通过[WCSession defaultSession]获取共享的会话实例,用于管理设备间的连接和通信。
    • 连接状态检查sessionState属性用于检查会话状态,例如.activated表示已激活可通信,.inactive表示未激活等。
    • 启动会话:调用[session activateSession]启动会话,在应用启动时通常需要调用此方法。
    • 发送消息
      • [session sendMessage:message replyHandler:replyHandler errorHandler:errorHandler]:用于发送消息并期望接收回复。message是一个NSDictionaryreplyHandler处理回复,errorHandler处理错误。
      • [session sendMessageData:messageData replyHandler:replyHandler errorHandler:errorHandler]:发送二进制数据,适用于更复杂数据格式。
    • 接收消息:实现WCSessionDelegate协议的- (void)session:(WCSession *)session didReceiveMessage:(NSDictionary<NSString *,id> *)message replyHandler:(void (^)(NSDictionary<NSString *,id> * _Nonnull))replyHandler方法,当接收到消息时系统会调用此方法。
    • 传输文件
      • [session transferFile:fileURL metadata:metadata]:用于传输文件,fileURL是文件路径,metadata是关于文件的元数据(如字典形式)。
      • [session transferUserInfo:userInfo]:传输用户信息,userInfoNSDictionary类型。
  2. WCUserInfoTransfer类

    • 属性访问progress属性获取传输进度,可用于显示进度条等。
    • 取消传输[transfer cancel]取消正在进行的用户信息传输。
  3. WCFileTransfer类

    • 类似WCUserInfoTransferprogress属性获取文件传输进度,[transfer cancel]取消文件传输。

传递复杂对象

  1. 归档和解档:将复杂对象(如自定义类实例)进行归档(NSKeyedArchiver)转换为NSData,通过sendMessageData:方法发送,接收端再通过解档(NSKeyedUnarchiver)还原对象。自定义类需遵循NSCoding协议并实现initWithCoder:encodeWithCoder:方法。
  2. JSON序列化:将复杂对象转换为JSON格式(如利用NSJSONSerialization),以NSDictionaryNSArray形式通过sendMessage:发送,接收端再反序列化还原对象。

排查数据丢失或不完整问题的方面

  1. 网络连接
    • 检查设备间蓝牙连接是否正常,Wi-Fi连接是否稳定,可通过系统设置或设备状态指示查看。
    • 确认是否因网络切换、信号弱等原因导致连接中断,WatchConnectivity框架会在连接中断时提供相应回调,可通过实现WCSessionDelegate协议的- (void)session:(WCSession *)session didDeactivateWithError:(NSError *)error方法处理。
  2. 数据大小限制
    • 了解WatchConnectivity框架对传输数据大小的限制,如sendMessage:的字典大小有限制。若数据过大,考虑分块传输或优化数据结构。
    • 对传输文件大小也有限制,若超过限制,可考虑压缩文件或分段传输。
  3. 序列化和反序列化
    • 检查发送端序列化过程是否正确,如归档或JSON序列化是否成功,是否有错误抛出。
    • 接收端反序列化时同样检查是否成功,错误处理是否得当,如NSKeyedUnarchiver解档错误或NSJSONSerialization反序列化错误。
  4. 会话状态
    • 确保在发送数据时会话处于激活状态,检查sessionState属性,若未激活,确保正确调用activateSession方法且无错误。
    • 处理会话在数据传输过程中状态变化的情况,如会话中断后重新激活时,数据传输的恢复机制是否正确。
  5. 代码逻辑
    • 检查发送和接收数据的代码逻辑,确保消息的发送和接收顺序正确,如回复处理是否及时,错误处理是否恰当。
    • 确认数据传递过程中是否有覆盖、丢失数据的逻辑错误,如在多线程环境下对共享数据的访问是否同步。