0

私は XCode 7.3、iOS 9.3 を搭載した iPhone5、WatchOS 2.2 を搭載した Apple Watch を持っています。

Watch アプリをサポートしたい会社のプロジェクトがあります。最初に、空のプロジェクトを作成して、ウォッチキットとウォッチキット拡張機能が機能していることを確認しました。セッションが確立され、ウォッチがペアリングされていることがわかります。

しかし、会社のプロジェクトに同じコードを入れた後、一度だけ機能します: Xcode から直接アプリを初めて実行するとき。この状態で、以下のログを取得しました: iOS アプリで

paired == NO ---- watchAppInstalled=== NO---- complicationEnabled==NO  ----<WCSession:0x7ffb9a815ab0,hasDelegate:No,activationState:2>

watchKit 拡張機能で

Error Domain=WCErrorDomain Code=7004 "WatchConnectivity session has not been activated." UserInfo={NSLocalizedRecoverySuggestion=Activate the WatchConnectivity session., NSLocalizedDescription=WatchConnectivity session has not been activated., NSLocalizedFailureReason=Function activateSession has not been called.}

wcsession に関する私のコード:

iOS アプリ

AppDelegate+GC_WCSession で

 - (void)startWCSession{

    [self configSession];
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeLoginStatus:) name:GCLoginNotifyKey object:nil];

}
- (void)configSession{
    if (![WCSession isSupported]) {
        return;
    }
    _session = [WCSession defaultSession];
    [_session setDelegate:self];
    [_session activateSession];
}
- (void)session:(nonnull WCSession *)session didReceiveApplicationContext:(nonnull NSDictionary<NSString *,id> *)applicationContext {
    [self.session activateSession];
    if ([applicationContext objectForKey:k_WK_Token]) {
        [self synchronousUserInfo];
    }
}

- (void)changeLoginStatus:(NSNotification *)noti{
    ///
    [self synchronousUserInfo];
}

- (void)synchronousUserInfo{
   ///customCode
    [self.session updateApplicationContext:replayDict error:nil];
}

- (WCSession *)session{
    if (![WCSession isSupported] || ![[WCSession defaultSession] isPaired ]|| ![[WCSession defaultSession]isWatchAppInstalled] ) {
        return nil;
    }
    return  _session;
}

AppDelegate で

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
     [self startWCSession]; 
}

watchKit 拡張機能

ExtensionDelegate で

- (void)applicationDidFinishLaunching {
    // Perform any final initialization of your application.
     [self startWCSession];
}
- (void)startWCSession{

    [self configSession];
}
- (void)configSession{
    _session = [WCSession defaultSession];
    [_session setDelegate:self];
    [_session activateSession];
}

- (void)session:(nonnull WCSession *)session didReceiveApplicationContext:(nonnull NSDictionary<NSString *,id> *)applicationContext {
  ///customcode
}
- (WCSession *)session{
    return _session;
}

これは私が今まで試したことです:

  • すべてのシミュレーターのコンテンツと設定をリセットします

  • 時計とiPhoneから時計アプリを削除

  • 電話の Watch アプリの設定経由: 電話アプリの Watch 拡張機能を削除し、再インストールしました。

  • AppDelegate INIT メソッドで iPhone WCSession をセットアップしてみました

空のプロジェクトで動作しているので、コードが間違っているとは思いません。環境設定に問題があるのだろうか。私は今、この問題に何日も苦労しています。したがって、すべてのヒントは高く評価されます。

4

2 に答える 2

-1

この問題を解決しました。コードは打撃です。

- (void)configSession{
    dispatch_async(dispatch_get_main_queue(), ^{
    if (![WCSession isSupported]) {
        return;
    }
    _session = [WCSession defaultSession];
    [_session setDelegate:self];
    [_session activateSession];
   });
}

しかし、メイン スレッドでこのメソッドを呼び出す必要があるドキュメントは見当たりません。また、このメソッドはメインスレッドで呼び出される前に呼び出されます。したがって、ランループの問題である可能性があります。

于 2016-04-08T11:31:34.320 に答える