2016-08-05 224 views
2

在我的應用程序中,我必須將手錶InterfaceController的信息發送到手機HomeViewController。但是,當我運行我的代碼時,信息只能運行一次。爲了再次運行,我必須刪除Apple Watch應用程序並重新安裝它。WCSession只能工作一次

InterfaceController.m:

#import "InterfaceController.h" 
#import <WatchConnectivity/WatchConnectivity.h> 

@interface InterfaceController() <WCSessionDelegate> 

@property (strong, nonatomic) WCSession *session; 

@end 

@implementation InterfaceController 

-(instancetype)init { 
    self = [super init]; 

    if (self) { 
     if ([WCSession isSupported]) { 
      self.session = [WCSession defaultSession]; 
      self.session.delegate = self; 
      [self.session activateSession]; 
     } 
    } 
    return self; 
} 

-(void)sendText:(NSString *)text { 

    NSDictionary *applicationDict = @{@"text":text}; 
    [self.session updateApplicationContext:applicationDict error:nil]; 

} 

- (IBAction)ButtonPressed { 
    [self sendText:@"Hello World"]; 

} 

HomeViewController.m:

#import "HomeViewController.h" 
#import <WatchConnectivity/WatchConnectivity.h> 

@interface HomeViewController()<WCSessionDelegate> 
@end 

@implementation HomeViewController 
@synthesize TextLabel; 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

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

- (void)session:(nonnull WCSession *)session didReceiveApplicationContext:(nonnull NSDictionary<NSString *,id> *)applicationContext { 

    NSString *text = [applicationContext objectForKey:@"text"]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     [TextLabel setText:text]; 
    }); 
} 

如前所述,iOS的唯一的標籤更改爲 「Hello World」 的一次。在我重新啓動iOS應用程序並且其文本標籤不再顯示「Hello World」後,我無法設法讓手錶再次將iOS文本標籤更改回「Hello World」。

這是手錶和iPhone之間的溝通出了問題,或者是它的代碼有問題嗎?

回答

4

這是一個與代碼中的問題的基礎上,updateApplicationContext意圖:

你應該使用這種方法來溝通狀態改變或提供的數據是更新頻繁

在你的情況,你要重新發送,從手錶到手機的不變應用程序上下文。

由於沒有從以前的應用程序環境的變化,而手機將不再接收任何東西比它先前接收不同的,我們沒有理由爲腕錶(重新)傳送任何東西,所以也沒有。

這是Apple爲Watch Connectivity設計的一項優化。

你怎麼能解決這個問題?

  • 您可以重新設計您的應用程序以消除需要重新傳輸相同的數據。

  • 如果您的應用程序必須重發相同信息的第二次,你必須改變你的方法:

    • You can add additional data(如UUID或時間戳)到應用環境中,以確保您發送的更新爲而不是與您發送的以前的應用程序上下文相同。

    • 使用不同的WCSession功能,如sendMessage,這將允許您第二次重新發送相同的數據。

+0

而在一個鍵/值字典,你不能只是更改值 - 你必須有至少一個不同的密鑰各一次。 –