gpt4 book ai didi

ios - Apple Watch 上的 WCSession 无法正常工作

转载 作者:可可西里 更新时间:2023-11-01 06:17:29 28 4
gpt4 key购买 nike

我有 XCode 7、iOS 9.1 的 iPhone6、WatchOS 2.0 的 Apple Watch(现在我更新到 2.0.1)

我尝试在 Watch 和 iPhone 之间进行通信。

在 iPhone 上我初始化了我的单例

- (instancetype)init {
self = [super init];
if (self.isConnectivityAvailable) {
session = [WCSession defaultSession];
session.delegate = self;
[session activateSession];
}
return self;
}

- (BOOL)isConnectivityAvailable {
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"9.0")) {
return [WCSession isSupported];
} else {
return NO;
}
}

在 AppDelegate 中

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//custom code
(void)[AppConnectivityHandler instance]; //start App connectivity with Apple Watch
return YES;
}

一切都很好

我是这样处理消息的

- (void)session:(WCSession *)session didReceiveMessage:(NSDictionary<NSString *,id> *)message replyHandler:(void (^)(NSDictionary<NSString *,id> * _Nonnull))replyHandler {
LOG(@"receive message");
NSString *request = message[kRequestKey];
__block NSDictionary *reply = @{};
dispatch_sync(dispatch_get_main_queue(), ^{
if ([request isEqualToString:kRequestDayInfo]) {
//formirate reply dictionary
}
});
LOG(@"send reply");
replyHandler(reply);
}

在我的 watch 上,我在主界面 Controller 中调用函数时开始加载

- (void)willActivate {
[super willActivate];
if ([WatchConnectivityHandler instance].isConnectivityAvailable) {
[[WatchConnectivityHandler instance] loadDayInfoWithCompletion:^(NSError * _Nullable error, WatchDayInfo * _Nullable dayInfo) {
//code
}];
} else {
//error
}
}

我的 watch 单例

+ (nonnull instancetype)instance {
static WatchConnectivityHandler *instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [WatchConnectivityHandler new];
});
return instance;
}

- (instancetype)init {
self = [super init];
if (self.isConnectivityAvailable) {
session = [WCSession defaultSession];
session.delegate = self;
[session activateSession];
}
return self;
}

- (BOOL)isConnectivityAvailable {
return [WCSession isSupported];
}
- (void)loadDayInfoWithCompletion:(void(^ _Nonnull)( NSError * _Nullable error, WatchDayInfo * _Nullable dayInfo))completion {
[session sendMessage:@{kRequestKey : kRequestDayInfo} replyHandler:^(NSDictionary<NSString *,id> * _Nonnull replyMessage) {
NSLog(@"reply");
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"%@", replyMessage);
//custom code
completion(nil, /*custom object*/);
});
} errorHandler:^(NSError * _Nonnull error) {
NSLog(@"error");
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"%@", error);
completion(error, nil);
});
}];
}

所以它第一次工作正常,我得到了回复。但是后来我开始出现很多错误,比如

Error Domain=WCErrorDomain Code=7007 "WatchConnectivity session on paired device is not reachable." 


Error Domain=WCErrorDomain Code=7014 "Payload could not be delivered."

我在 Watch 上测试,从我的 iPhone 上得到回复经常是个问题,要等很长时间。但是我在 iPhone 上测试过,当它从 Watch 收到消息时,它会很快发送回复,但我在 Watch 上看不到回复。

每次 watch 启动我的应用程序时,我都需要更新我的信息。什么问题?可能是我功能使用不当?

最佳答案

使用 transeruserinfo 方法代替 sendmessage,使用 didreceiveuserinfo 方法代替 didreceiveapplicationcontext。

关于ios - Apple Watch 上的 WCSession 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33562768/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com