WCSession 只工作一次

Posted

技术标签:

【中文标题】WCSession 只工作一次【英文标题】:WCSession only working once 【发布时间】:2016-08-05 03:41:26 【问题描述】:

在我的应用程序中,我必须将信息从手表 InterfaceController 发送到手机 HomeViewController。但是,当我运行我的代码时,这些信息只工作一次。要让它再次工作,我必须删除 Apple Watch 应用并重新安装。

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 通信的问题,还是代码的问题?

【问题讨论】:

【参考方案1】:

代码有问题,基于updateApplicationContext的意图:

您应该使用此方法来传达状态更改或传送更新频繁

的数据

在您的情况下,您尝试将 未更改 应用程序上下文从手表重新发送到手机。

由于与之前的应用程序上下文没有任何变化,并且手机不会收到与之前收到的内容不同的任何内容,因此手表没有理由(重新)传输任何内容,所以它不会。

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

您如何解决这个问题?

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

如果您的应用必须第二次重新传输相同的信息,您必须改变方法:

You can add additional data(例如 UUID时间戳)到应用程序上下文,以确保您发送的更新相同到您发送的上一个应用程序上下文。

使用不同的WCSession 功能,例如sendMessage,这样您就可以再次发送相同的数据。

【讨论】:

而且您不能只更改键/值字典中的值 - 您每次必须至少有一个不同的键。

以上是关于WCSession 只工作一次的主要内容,如果未能解决你的问题,请参考以下文章

将 WCSession 的委托设置为 nil

WCSession 无法发送消息

session.isReachable 在 watchos 的背景中总是假的

WCSession:使用 transferUserInfo 或 sendMessage 的最佳方式?

对于 Swift 中的 Apple Watch OS,如何在 WCSession 激活完成后运行函数?

未安装 WC WCSession 对应应用程序