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

任何人都可以在Objective C 中给出最后一个示例吗?如何将WCSession与IOS应用程序和Watch应用程序(WatchOS2)结合使用和一个以上ViewController 来使用是最佳实践。

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

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>。但是其余的对我来说完全不清楚!在通过传递的Dictionary中指定键时会产生一些答案,例如:
[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 app 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。

XYZController1:
#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/

10-12 04:20