3

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

接口控制器.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

1 回答 1

8

这是代码的问题,基于以下意图 updateApplicationContext

您应该使用此方法来传达状态更改或传递经常更新的数据

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

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

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

你怎么能解决这个问题?

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

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

    • 您可以向应用程序上下文添加其他数据(例如UUID时间戳或时间戳),以确保您发送的更新与您发送先前应用程序上下文不同。

    • 使用不同的WCSession功能,例如sendMessage,它可以让您再次重新发送相同的数据。

于 2016-08-05T04:48:17.130 回答