4

チュートリアル/サンプル コードを使用してアプリに WCConnectivity を設定したところ、正しく実装できたと感じています。シミュレーターを使用してテストしていません。何らかの理由で、すべてが正しく設定されているにもかかわらず、didReceiveApplicationContext が監視アプリで呼び出されていません。

ExtensionDelegate で WatchKit アプリのインターフェイス コントローラーを呼び出し、代わりに NSUserDefaults を使用してインターフェイス コントローラー データを設定しようとしました。

iOS アプリ

ViewController.m

- (void) viewDidLoad{
if ([WCSession isSupported]) {
    WCSession *session = [WCSession defaultSession];
    session.delegate = self;
    [session activateSession];
  }
}

-(void) saveTrip{
NSMutableArray *currentTrips = [NSMutableArray arrayWithArray:[self.sharedDefaults objectForKey:@"UserLocations"]];

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:newLocation];
[currentTrips addObject:data];
[self.sharedDefaults setObject:currentTrips forKey:@"UserLocations"];
[self.sharedDefaults synchronize];

WCSession *session = [WCSession defaultSession];
NSDictionary *applicationDict = [[NSDictionary alloc] initWithObjects:@[currentTrips] forKeys:@[@"UserLocations"]];;
[session updateApplicationContext:applicationDict error:nil];
}

延長コードを見る

ExtensionDelegate.m

- (void)applicationDidFinishLaunching {
if ([WCSession isSupported]) {
    WCSession *session = [WCSession defaultSession];
    session.delegate = self;
    [session activateSession];
}
}
- (void)session:(nonnull WCSession *)session didReceiveApplicationContext:(nonnull NSDictionary<NSString *,id> *)applicationContext {
self.places= [applicationContext objectForKey:@"UserLocations"];
[[NSUserDefaults standardUserDefaults] setObject:self.places forKey:@"UserLocations"];
[[NSUserDefaults standardUserDefaults] synchronize]; 
}

InterfaceController.m

- (void)willActivate {
[super willActivate];
self.placesData = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"UserLocations"]];
[self loadData];
}
4

4 に答える 4

2

機能しない場合は、正しく実装されていない可能性があります。

一見したところ、いくつかの問題があります。

  • iOS アプリでは、共有セッションへの参照を取得してアクティブにしますが、そのローカル変数をビュー コントローラーのどのプロパティにも割り当てないでください。これは、いったんviewDidLoad終了すると、ローカル変数がスコープ外になることを意味します。また、ウォッチ拡張機能でそれを修正する必要があります。

  • saveTrip、別のローカル セッションを再度作成しますが、これはアクティブ化されておらず、デリゲートもありません。以前にセットアップしてアクティブ化した最初のセッションを使用する必要があります。

  • ウォッチでは、受信したデータを保存しますが、インターフェイス コントローラーは、読み込んで表示する必要がある新しいデータがあることを知りません。

いくつかのヒント:

  • でセッションをセットアップしてアクティブ化するとapplication:didFinishLaunchingWithOptions、アプリ全体で使用できるようになります (また、アプリのライフサイクルのかなり早い段階でアクティブ化されます)。

  • 時計がペアリングされていないか、時計アプリがインストールされていない可能性があるため、セッションが有効であることを確認する必要があります。これは、これらのケースをカバーする優れた (Swift) チュートリアルです。また、セッション マネージャーを使用して、アプリ全体で Watch Connectivity の使用をサポートしやすくします。

  • カスタム オブジェクトの配列をアーカイブするよりも、ウォッチに渡すデータを少なく/軽量にしたい場合があります。

  • 余談ですが、あなたがやろうとしていることNSUserDefaultsは非常に複雑です。これは実際には、起動間で設定を保持するためのものです。拡張機能とコントローラーの間でモデルをやり取りする方法として誤用することは適切ではありません。

于 2016-03-07T23:35:06.993 に答える
1

同じ問題があり、修正しました。Watch 拡張機能に WatchConnectivity フレームワークを追加するのを忘れていました。

于 2016-06-18T23:08:17.070 に答える