在不运行时保持我的WatchKit并发症最新

时间:2015-10-18 13:15:20

标签: ios watch apple-watch-complication

我正在开发我的应用程序的WatchKit扩展程序,并且遇到了一些并发症问题。

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

但只有当扩展程序正在运行时才会出现这种情况(如果没有,它将无法获得应用程序上下文直到下一次启动)。

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

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

即使扩展未运行,我该怎样做才能使我的并发症保持最新?

由于

PS:我正在使用手表模拟器,以及"关闭"扩展我只是重启Watch(从硬件菜单)

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

  

Oct 18 18:08:11 pc16 WatchApp Extension [26615]:收到扩展   请求唤醒并发症支持。

     

Oct 18 18:08:11 pc16断言[26585]:断言失败:15A284 13S343:断言+ 15398 [B48FCADB-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];

    [...]
}

1 个答案:

答案 0 :(得分:4)

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

似乎即使我没有在日志文件中看到它(请参阅我的上一条评论),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;
}

有一段时间它工作得很好......