我在WatchOS 2.1和iOS 9上使用WatchConnectivity框架时遇到了麻烦。 我正在使用transferUserInfo()将数据从iOS应用程序发送到Watch并且它可以工作。问题出现在回来的路上:当用户在Watch上的视图中按下按钮后尝试发送更新时,通信仅偶尔进行。例如,它通常在第一次工作,而所有其他时间似乎消息丢失。 我尝试了不同的解决方案(sendMessage,updateContext,ecc),但我总是遇到同样的问题。谁能帮我? 这是代码:
//在观察方面:
@IBAction func completeButtonPressed() {
if let index = isActivityTitled(activityTitle, inArray: todayActivities) {
activityCompleted = !activityCompleted
todayActivities[index].completed = activityCompleted
}
if self.activityCompleted == false {
self.completeButton.setBackgroundImage(UIImage(named: "completedButton"))
self.completeButton.setTitle("COMPLETA")
} else {
self.completeButton.setBackgroundImage(UIImage(named: "rectButtonGray"))
self.completeButton.setTitle("COMPLETATO")
}
if self.session != nil {
session.transferUserInfo(["WatchUpdatedActivityTitle":self.activityTitle])
}
}
//在iOS方面:(我处理AppDelegate中的回调)
func session(session: WCSession, didReceiveUserInfo userInfo: [String : AnyObject]) {
print("Message From Watch:")
print(userInfo["WatchUpdatedActivityTitle"])
if let actTitle = userInfo["WatchUpdatedActivityTitle"] {
self.activitiesList = ActivitiesList.sharedActivitiesList
let updatedActivity = self.activitiesList.getActivityTitled(actTitle as! String)
if updatedActivity?.completed == false {
updatedActivity?.completed! = true
} else {
updatedActivity?.completed! = false
}
self.activitiesList.updateActivity(updatedActivity!, withReorder: true)
dispatch_async(dispatch_get_main_queue()) {
NSNotificationCenter.defaultCenter().postNotificationName("reloadTableViews", object: nil)
}
}
}
希望尽快解决问题, 非常感谢你。
答案 0 :(得分:1)
我遇到了类似的问题,我认为它可能与WCSession有关。在使用之前尝试在.apply()
中重新创建会话变量。
completeButtonPressed
答案 1 :(得分:0)
https://forums.developer.apple.com/thread/43596
目前watchOS 2.2和iOS 9.3存在问题,其中使用方法transferUserInfo将数据发送到协议方法
将在开始工作,然后它将停止工作。
当它停止工作时,我在重新启动iPhone和Apple Watch后再次开始工作。
此外,请确保将您的会话作为具有强大属性的成员变量:
@interface InterfaceController() <WCSessionDelegate>
@property (strong, nonatomic) WCSession *session;
@end
if ([WCSession isSupported]) {
self.session = [WCSession defaultSession];
self.session.delegate = self;
[self.session activateSession];
}
另外需要注意的是使用主队列来更新UI:
- (void)session:(WCSession *)session didReceiveUserInfo:(NSDictionary<NSString *, id> *)userInfo {
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"InterfaceController.m ------------ (watch received: %@)----------------", userInfo);
[self.descriptionLabel setText:userInfo[@"emojiDescription"]];
});
}