2016-04-20 37 views
0

コンパニオンアプリから送信された情報を表示する簡単な時計アプリを作ろうとしています。私はWatchKitアプリを適切に受け取るのにいくつか問題があります。WatchKit App接続の問題

私は次のコードを持っている送信者側では

:受信側の

- (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を呼び出すと、それは100%の作品しかし、別の関数の中から呼び出すと、WatchKitアプリケーションは応答しません。私は、loadWatchAppがupdateApplicationContextと同様に呼び出されることを確認できます。ありがとう!

+0

updateApplicationContextへの呼び出しはエラーを返していますか? – ccjensen

答えて

0

私はWCSessionDelegate activationDidCompleteWithStateからセッション関数を実装し、コールバックで状態が有効ならば、あなたのgrabLocationsFromServer関数を呼び出します。 Watchセッションをアクティブにする前にgrabLocationsFromServerが呼び出されると、アプリケーションコンテキストが更新されていない可能性があります。

また、App Delegateのinitなど、できるだけ早くactivateセッションを呼び出すことをお勧めします。

あなたはこれがあなたのために働いていたと述べた前に私はちょうど試したので、ここで私が見ているものです:

  • を時計(初期接続)の起動時に、activationDidCompleteWithStateへの呼び出しがあったが、何のコンテキストがありませんしかし、didReceiveApplicationContextは呼び出されません。
  • 予期したアプリケーションごとにアプリのアップデートを確認するは、sessionReachabilityDidChangeで空のメッセージを送信した場合にのみ発生します。私の理解は、この初期のメッセージを送って、バックグラウンドで電話アプリを「目を覚ます」必要があるということです。このメッセージは電話側では無視できます。

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

申し訳ありませんが、最初はあなたの答えが間違っています。私はデリゲートのセッションを活性化し、それはうまくいくように見えました。 –