面试题答案
一键面试WatchKit应用与iPhone应用数据交互实现方式
在Objective-C的Apple Watch开发中,WatchConnectivity框架用于WatchKit应用与iPhone应用之间的数据交互。此框架允许两个应用在配对的设备间发送和接收信息,即使应用处于后台或未运行状态。
WatchConnectivity框架主要类和方法
-
WCSession类
- 单例获取:通过
[WCSession defaultSession]
获取共享的会话实例,用于管理设备间的连接和通信。 - 连接状态检查:
sessionState
属性用于检查会话状态,例如.activated
表示已激活可通信,.inactive
表示未激活等。 - 启动会话:调用
[session activateSession]
启动会话,在应用启动时通常需要调用此方法。 - 发送消息:
[session sendMessage:message replyHandler:replyHandler errorHandler:errorHandler]
:用于发送消息并期望接收回复。message
是一个NSDictionary
,replyHandler
处理回复,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]
:传输用户信息,userInfo
是NSDictionary
类型。
- 单例获取:通过
-
WCUserInfoTransfer类
- 属性访问:
progress
属性获取传输进度,可用于显示进度条等。 - 取消传输:
[transfer cancel]
取消正在进行的用户信息传输。
- 属性访问:
-
WCFileTransfer类
- 类似WCUserInfoTransfer:
progress
属性获取文件传输进度,[transfer cancel]
取消文件传输。
- 类似WCUserInfoTransfer:
传递复杂对象
- 归档和解档:将复杂对象(如自定义类实例)进行归档(
NSKeyedArchiver
)转换为NSData
,通过sendMessageData:
方法发送,接收端再通过解档(NSKeyedUnarchiver
)还原对象。自定义类需遵循NSCoding
协议并实现initWithCoder:
和encodeWithCoder:
方法。 - JSON序列化:将复杂对象转换为JSON格式(如利用
NSJSONSerialization
),以NSDictionary
或NSArray
形式通过sendMessage:
发送,接收端再反序列化还原对象。
排查数据丢失或不完整问题的方面
- 网络连接:
- 检查设备间蓝牙连接是否正常,Wi-Fi连接是否稳定,可通过系统设置或设备状态指示查看。
- 确认是否因网络切换、信号弱等原因导致连接中断,WatchConnectivity框架会在连接中断时提供相应回调,可通过实现
WCSessionDelegate
协议的- (void)session:(WCSession *)session didDeactivateWithError:(NSError *)error
方法处理。
- 数据大小限制:
- 了解WatchConnectivity框架对传输数据大小的限制,如
sendMessage:
的字典大小有限制。若数据过大,考虑分块传输或优化数据结构。 - 对传输文件大小也有限制,若超过限制,可考虑压缩文件或分段传输。
- 了解WatchConnectivity框架对传输数据大小的限制,如
- 序列化和反序列化:
- 检查发送端序列化过程是否正确,如归档或JSON序列化是否成功,是否有错误抛出。
- 接收端反序列化时同样检查是否成功,错误处理是否得当,如
NSKeyedUnarchiver
解档错误或NSJSONSerialization
反序列化错误。
- 会话状态:
- 确保在发送数据时会话处于激活状态,检查
sessionState
属性,若未激活,确保正确调用activateSession
方法且无错误。 - 处理会话在数据传输过程中状态变化的情况,如会话中断后重新激活时,数据传输的恢复机制是否正确。
- 确保在发送数据时会话处于激活状态,检查
- 代码逻辑:
- 检查发送和接收数据的代码逻辑,确保消息的发送和接收顺序正确,如回复处理是否及时,错误处理是否恰当。
- 确认数据传递过程中是否有覆盖、丢失数据的逻辑错误,如在多线程环境下对共享数据的访问是否同步。