gpt4 book ai didi

ios - 将 WCSession 与多个 ViewController 一起使用

转载 作者:可可西里 更新时间:2023-11-01 03:06:21 27 4
gpt4 key购买 nike

我发现了很多问题和答案,但没有请求的最终示例:

谁能给出一个在 Objective C 中的最后一个例子,什么是将 WCSession 与 IOS 应用程序和带有多个 ViewController 的 Watch 应用程序 (WatchOS2) 一起使用的最佳实践。

到目前为止,我注意到以下事实:

1.) 在 AppDelegate 的父 (IOS) 应用程序中激活 WCSession:

- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//Any other code you might have

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

2.) 在 WatchOS2 端使用 <WCSessionDelegate> .但其余的对我来说完全不清楚!一些答案是通过在传递的字典中指定键来说话的,例如:

[session updateApplicationContext:@{@"viewController1": @"item1"} error:&error];
[session updateApplicationContext:@{@"viewController2": @"item2"} error:&error];

其他人在谈论检索默认 session

WCSession* session = [WCSession defaultSession];
[session updateApplicationContext:applicationDict error:nil];

别人说的是不同的队列? “如有必要,客户有责任分派(dispatch)到另一个队列。分派(dispatch)回主队列。”

我完全糊涂了。因此,请举例说明如何将 WCSession 与 IOS 应用程序和带有多个 ViewController 的 WatchOS2 应用程序一起使用。

我需要它来处理以下情况(已简化):在我的 parent 应用程序中,我正在测量心率、锻炼时间和卡路里。在 Watch 应用程序 1.ViewController 中,我将显示心率和锻炼时间,在 2.ViewController 中,我也会显示心率和燃烧的卡路里。

最佳答案

据我了解,您只需要在 Phone -> Watch 方向上进行同步即可,因此简而言之,您的最低配置是:

电话:

我相信 application:didFinishLaunchingWithOptions: 处理程序是 WCSession 初始化的最佳位置,因此将以下代码放在那里:

if ([WCSession isSupported]) {
// You even don't need to set a delegate because you don't need to receive messages from Watch.
// Everything that you need is just activate a session.
[[WCSession defaultSession] activateSession];
}

然后在您的代码中某处测量心率,例如:

NSError *updateContextError;
BOOL isContextUpdated = [[WCSession defaultSession] updateApplicationContext:@{@"heartRate": @"90"} error:&updateContextError]

if (!isContextUpdated) {
NSLog(@"Update failed with error: %@", updateContextError);
}

更新:

观看:

ExtensionDelegate.h:

@import WatchConnectivity;
#import <WatchKit/WatchKit.h>

@interface ExtensionDelegate : NSObject <WKExtensionDelegate, WCSessionDelegate>
@end

ExtensionDelegate.m:

#import "ExtensionDelegate.h"

@implementation ExtensionDelegate

- (void)applicationDidFinishLaunching {
// Session objects are always available on Apple Watch thus there is no use in calling +WCSession.isSupported method.
[WCSession defaultSession].delegate = self;
[[WCSession defaultSession] activateSession];
}

- (void)session:(nonnull WCSession *)session didReceiveApplicationContext:(nonnull NSDictionary<NSString *,id> *)applicationContext {
NSString *heartRate = [applicationContext objectForKey:@"heartRate"];

// Compose a userInfo to pass it using postNotificationName method.
NSDictionary *userInfo = [NSDictionary dictionaryWithObject:heartRate forKey:@"heartRate"];

// Broadcast data outside.
[[NSNotificationCenter defaultCenter] postNotificationName: @"heartRateDidUpdate" object:nil userInfo:userInfo];
}

@end

在您的 Controller 中的某处,我们将其命名为 XYZController1。

XYZ Controller 1:

#import "XYZController1.h"

@implementation XYZController1

- (void)awakeWithContext:(id)context {
[super awakeWithContext:context];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleUpdatedHeartRate:) name:@"heartRateDidUpdate" object:nil];
}

-(void)handleUpdatedHeartRate:(NSNotification *)notification {
NSDictionary* userInfo = notification.userInfo;
NSString* heartRate = userInfo[@"heartRate"];
NSLog (@"Successfully received heartRate notification!");
}

@end

代码没有经过测试,我只是按原样编写,所以可能会有一些拼写错误。

我认为现在的主要思路已经很清楚了,剩余类型数据的传输并不是那么困难的任务。

我当前的 WatchConnectivity 架构要复杂得多,但它仍然基于此逻辑。

如果您仍有任何疑问,我们可能会在聊天中进行进一步讨论。

关于ios - 将 WCSession 与多个 ViewController 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32574961/

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