2016-04-20 1 views
0

Я пытаюсь создать простое приложение для просмотра, которое отображает информацию, отправленную приложением-компаньоном. У меня возникли проблемы с тем, чтобы приложение 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!") 
     } 
    } 

Когда я звоню updateApplicationContext в viewDidLoad, он работает на 100% отлично, но когда я вызываю его из другой функции, приложение WatchKit просто не отвечает. Я могу подтвердить, что loadWatchApp вызывается, а также updateApplicationContext. Благодаря!

+0

вызов updateApplicationContext вернуться ли ошибка? – ccjensen

ответ

0

Я бы выполнил функцию сеанса из WCSessionDelegate activationDidCompleteWithState, а затем в обратном вызове, если состояние активировано, тогда вызовите функцию grabLocationsFromServer. Если grabLocationsFromServer вызывается, прежде чем активировать сеанс просмотра, возможно, поэтому ваш контекст приложения не обновляется.

Также предлагается активировать сеанс как можно скорее, например, в начале делегирования приложения.

я просто экспериментировал, прежде чем вы сказали, что это работает для вас, так вот что я вижу:

  • при запуске часов (первоначальное соединение), есть призыв к activationDidCompleteWithState, но нет никакого контекста тем не менее, поэтому didReceiveApplicationContext не вызывается.
  • Наблюдайте за обновлениями приложений за каждое ожидаемое приложение. Контекст возникает только при отправке пустого сообщения в sessionReachabilityDidChange. Я понимаю, что мне нужно «пробудить» телефонное приложение в фоновом режиме, отправив это начальное сообщение. Это сообщение можно игнорировать со стороны телефона.

    func sessionReachabilityDidChange(session: WCSession) { 
        if session.reachable { 
        sendMessage(["InitialMessage": true], replyHandler: nil, errorHandler: nil) 
        } 
    } 
    
+0

Извините, я сначала прочитал ваш ответ. Я активировал сессию в делегате, и это, похоже, сработало. –

Смежные вопросы