iOS WatchOS2 WatchConnectivity [WCSession defaultSession] activSession] ошибка

У меня есть XCode 7.3, iPhone5 с iOS 9.3, Apple Watch с WatchOS 2.2

У меня есть проект компании, который хочет поддержать приложение Watch. Во-первых, я создал пустой проект, чтобы убедиться, что расширение watchkit и watchkit работает, и оно работает. Я вижу, что сеанс установлен и часы сопряжены.

Но после того, как я вставил тот же код в проект компании, он может работать только один раз: в первый раз я запускаю приложение непосредственно из 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 Extension for Phone и установлено его заново

  • Попытка настройки iPhone WCSession в методе AppDelegate INIT

Я не думаю, что код неправильный, потому что он работает в пустом проекте. Интересно, есть ли проблемы в конфигурации среды. Я борюсь с этой проблемой уже много дней. Так что каждый намек высоко ценится.

2 ответа

Решение

Я решил эту проблему. Код удар.

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

Но я не вижу никаких документов, которые должны вызывать этот метод в основном потоке. Более того, этот метод вызывается раньше и находится в главном потоке. Так что я думаю, что это может быть проблемой runloop.

Как сказал в комментариях PetahChristian, в вашем классе ExtensionController измените этот метод:

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

быть:

- (instancetype)init
{
    self = [super init];
    if (self) {
        [self startWCSession];
    }
    return self;
}

- (void)applicationDidFinishLaunching {
    // Perform any final initialization of your application.
}

После этого вы сможете получать контент через WatchConnectivity, даже если ваше расширение работает в фоновом режиме для обновления с усложнением.

Другие вопросы по тегам