WCSession只能工作一次

问题描述:

在我的应用程序中,我必须将手表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之间的沟通出了问题,或者是它的代码有问题吗?

这是一个与代码中的问题的基础上,updateApplicationContext意图:

你应该使用这种方法来沟通状态改变或提供的数据是更新频繁

在你的情况,你要重新发送,从手表到手机的不变应用程序上下文。

由于没有从以前的应用程序环境的变化,而手机将不再接收任何东西比它先前接收不同的,我们没有理由为腕表(重新)传送任何东西,所以也没有。

这是Apple为Watch Connectivity设计的一项优化。

你怎么能解决这个问题?

  • 您可以重新设计您的应用程序以消除需要重新传输相同的数据。

  • 如果您的应用程序必须重发相同信息的第二次,你必须改变你的方法:

    • You can add additional data(如UUID或时间戳)到应用环境中,以确保您发送的更新为而不是与您发送的以前的应用程序上下文相同。

    • 使用不同的WCSession功能,如sendMessage,这将允许您第二次重新发送相同的数据。

+0

而在一个键/值字典,你不能只是更改值 - 你必须有至少一个不同的密钥各一次。 –