【问题标题】:Keeping my WatchKit complications up to date when not running在不运行时让我的 WatchKit 复杂功能保持最新
【发布时间】:2016-01-16 20:24:30
【问题描述】:

我正在开发我的应用的 WatchKit 扩展,但遇到了一些复杂问题。

我有一个显示给定总量的复杂功能,这取决于用户在 iOS 应用上所做的事情。当 WatchKit 扩展运行时,iOS 应用使用-[WCSession updateApplicationContext:] 方法更新手表应用上下文。它工作正常,然后在我的 Watch 应用程序的 ExtensionDelegate 中,我使用新数据手动更新复杂功能。

但这只有在扩展程序运行时才可以(如果不是,它不会在下次启动之前获取应用程序上下文)。

所以我编辑了我的代码,以便当用户在 iOS 应用程序中更改某些内容时,使用 -[WCSession transferCurrentComplicationUserInfo:] 方法将复杂数据直接发送到手表(文档中写到应该唤醒 ExtensionDelegate 以接收用户信息在后台)。

我已经实现了 ExtensionDelegate 的 -session:didReceiveUserInfo: 方法,以便在它从 iOS 应用程序接收数据时更新复杂性,但是当扩展程序未运行时它不起作用......(我不知道如果它曾经收到用户信息,因为我无法记录它)

即使扩展程序未运行,我应该如何使我的并发症保持最新??

谢谢

PS:我正在使用手表模拟器,要“关闭”扩展程序,我只是重新启动手表(从硬件菜单)

编辑:我设法在应用程序未运行时注销语句(通过打开 Watch Simulator 系统日志),当 iOS 将新的复杂用户数据发送到手表扩展:

10 月 18 日 18:08:11 pc16 WatchApp 扩展[26615]:收到扩展 请求唤醒以获取并发症支持。

10 月 18 日 18:08:11 pc16 断言 [26585]:断言失败:15A284 13S343:断言 + 15398 [B48FCDB-A071-3A46-878B-538DC0AFF60B]:0x1

所以手表很好地接收了用户信息字典,但似乎无法唤醒扩展...

编辑 2:这是 ExtensionDelegate 中应接收复杂用户信息的代码部分(但在应用未运行时不会调用):

- (void) session: (WCSession *)session didReceiveUserInfo: (NSDictionary *)userInfo
{
    NSLog(@"session:didReceiveUserInfo: %@", userInfo);

    NSString *userInfoType = userInfo[KHWASessionTransferUserInfoType];
    NSDictionary *userInfoContents = userInfo[KHWASessionTransferUserInfoContents];

    // Complication Data
    if ([userInfoType isEqualToString:KHWASessionTransferUserInfoTypeComplicationData]) {

        // Store the complication data into user defaults
        [[NSUserDefaults standardUserDefaults] setValue:userInfoContents[KHWAComplicationTotalBalance] forKey:KHWAComplicationTotalBalance];
        [[NSUserDefaults standardUserDefaults] synchronize];

        // And refresh the complications
        CLKComplicationServer *complicationServer = [CLKComplicationServer sharedInstance];
        for (CLKComplication *complication in complicationServer.activeComplications) {
            [complicationServer reloadTimelineForComplication:complication];
        }
    }
}

编辑 3:WCSession 设置在扩展委托applicationDidFinishLaunching 方法中:

- (void) applicationDidFinishLaunching
{
    // Setup the WatchConnectivity session
    WCSession *session = [WCSession defaultSession];
    session.delegate = self;
    [session activateSession];

    [...]
}

【问题讨论】:

  • 您在 WatchExtension 中具体在哪里实现了-session:didReceiveUserInfo:
  • 在我的 ExtensionDelegate.m 文件中(定义为:@interface ExtensionDelegate : NSObject <WKExtensionDelegate, WCSessionDelegate>
  • 请将您的 ExtensionDelegate 中的相关代码添加到您的问题中。
  • 您在 WatchKit 扩展中的哪里设置 WCSession?
  • applicationDidFinishLaunching 方法的开头

标签: ios watch apple-watch-complication


【解决方案1】:

哇,我终于解决了这个问题!

看来,即使我没有在日志文件中看到它(请参阅我的上一条评论),唤醒应用程序时调用 WCExtensionDelegate 的 init 方法也很好。

所以我只需要将 WCSession 设置块移动到 init 方法中:

- (id) init
{
    if (self = [super init]) {

        // Setup the WatchConnectivity session
        WCSession *session = [WCSession defaultSession];
        session.delegate = self;
        [session activateSession];
    }

    return self;
}

虽然它工作正常......

【讨论】:

  • 我遇到了同样的问题,您的回答对我有帮助。我建议您用绿色复选标记接受它,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-13
  • 2020-04-30
  • 2014-04-19
  • 2016-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多