我正在尝试创建一个简单的观看应用,显示随播应用发送的信息。我在使WatchKit应用程序正确接收信息方面遇到了一些麻烦。
在发件人方面,我有以下代码:
- (void)viewDidLoad {
[super viewDidLoad];
// Prevents UIWebView from displaying under nav bar
self.navigationController.navigationBar.translucent = NO;
_timer = [NSTimer scheduledTimerWithTimeInterval:12.0 target:self selector:@selector(showAlert) userInfo:nil repeats:NO];
_diningLocations = [[NSMutableArray alloc] initWithCapacity:0];
if ([WCSession isSupported]) {
self.session = [WCSession defaultSession];
self.session.delegate = self;
[self.session activateSession];
// The following line works
//[self.session updateApplicationContext:@{@"hello" : @"world"} error:nil];
}
- (void)grabLocationsFromServer {
_query = [PFQuery queryWithClassName:self.tableName];
[MBProgressHUD showHUDAddedTo:self.view animated:YES];
[_query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if (!error) {
// Do stuff
[self.locationTable reloadData];
[self loadWatchApp];
} else {
// Log details of the failure
NSLog(@"Error: %@ %@", error, [error userInfo]);
[MBProgressHUD hideHUDForView:self.view animated:YES];
}
[MBProgressHUD hideHUDForView:self.view animated:YES];
}];
}
- (void)loadWatchApp {
if(self.session) {
if (self.session.paired && self.session.watchAppInstalled) {
NSError *error;
[self.session updateApplicationContext:@{@"Locations": self.diningLocations} error:&error];
}
}
}
在接收端,我有这个简单的代码片段:
func loadTableData(data: [RFDiningLocation]) {
table.setNumberOfRows(data.count, withRowType: "location")
for i in 0..<data.count {
let row = table.rowControllerAtIndex(i) as! RFDiningRowController
// row.label.setText(data[i].name)
row.label.setText("Hello, world!")
}
}
当我在viewDidLoad中调用updateApplicationContext时,它可以正常工作,但是当我从另一个函数中调用它时,WatchKit应用程序只是没有响应。我可以确认调用了loadWatchApp以及updateApplicationContext。谢谢!
答案 0 :(得分:0)
我将从WCSessionDelegate activationDidCompleteWithState
实现会话功能,然后在回调状态下激活状态,然后调用grabLocationsFromServer函数。如果在激活Watch会话之前调用了grabLocationsFromServer,那么这可能就是您的应用程序上下文未被更新的原因。
此外,建议您尽快调用activate session,例如在App Delegate的init中。
在你说这对你有用之前,我只是在试验,所以这就是我所看到的:
activationDidCompleteWithState
的调用,但还没有上下文,因此不会调用didReceiveApplicationContext
。每个预期的应用程序观看应用程序更新仅在sessionReachabilityDidChange
中发送空消息时才会出现。我的理解是,我必须通过发送此初始消息在后台“唤醒”手机应用程序。可以在电话方面忽略此消息。
func sessionReachabilityDidChange(session: WCSession) {
if session.reachable {
sendMessage(["InitialMessage": true], replyHandler: nil, errorHandler: nil)
}
}