WatchKit应用连接问题

时间:2016-04-20 01:48:57

标签: ios objective-c swift watchkit

我正在尝试创建一个简单的观看应用,显示随播应用发送的信息。我在使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。谢谢!

1 个答案:

答案 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)
      }
    }