簡體   English   中英

iOS WatchOS2 WatchConnectivity [WCSession defaultSession] activateSession] 失敗

[英]iOS WatchOS2 WatchConnectivity [WCSession defaultSession] activateSession] failure

我有 XCode 7.3、帶 iOS 9.3 的 iPhone5、帶 WatchOS 2.2 的 Apple Watch

我有一個想要支持 Watch App 的公司項目。 首先,我構建了一個空項目以確保 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 的代碼:

應用程序

在 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 擴展

在擴展委托中

- (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 中刪除手表應用程序

  • 通過手機上的手表應用中的設置:刪除手機應用的手表擴展並重新安裝

  • 嘗試在 AppDelegate INIT 方法中設置 iPhone WCSession

我不認為代碼是錯誤的,因為它在一個空項目中工作。我想知道環境配置是否有問題。 我現在在這個問題上掙扎了很多天。 所以每一個提示都受到高度贊賞。

正如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 接收內容。

我解決了這個問題。 代碼是吹的。

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

但是我在主線程中沒有看到任何需要調用該方法的文檔。 而且這個方法是在主線程之前調用的,所以我覺得可能是runloop的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM