在不 运行 时保持我的 WatchKit 并发症是最新的
Keeping my WatchKit complications up to date when not running
我正在开发我的应用程序的 WatchKit 扩展,遇到一些复杂问题。
我有一个显示给定总量的复杂功能,这取决于用户在 iOS 应用程序上所做的事情。当 WatchKit 扩展为 运行 时,iOS 应用程序使用 -[WCSession updateApplicationContext:]
方法更新手表应用程序上下文。它工作正常,然后在我的 Watch 应用程序的 ExtensionDelegate 中,我用新数据手动更新复杂功能。
但这只有在扩展名是 运行 时才可以(如果不是,它将在下一次启动之前无法获取应用程序上下文)。
所以我编辑了我的代码,当用户在 iOS 应用程序中更改某些内容时,使用 -[WCSession transferCurrentComplicationUserInfo:]
方法(它写在文档中,ExtensionDelegate 应该被唤醒以在后台接收用户信息)。
我已经实现了 ExtensionDelegate 的 -session:didReceiveUserInfo:
方法,以便在它从 iOS 应用程序接收到数据时更新复杂功能,但是当扩展不是 [=55 时它不起作用=]...(我不知道它是否收到过用户信息,因为我无法登录)
即使扩展名不是 运行,我应该如何使我的并发症保持最新??
谢谢
PS:我正在使用 Watch Simulator,"close" 扩展我只是重新启动手表(从硬件菜单)
Edit:当应用程序不是 运行(通过打开 Watch Simulator 系统日志)时,我设法注销了语句,当iOS 向手表扩展发送一个新的复杂功能用户数据:
Oct 18 18:08:11 pc16 WatchApp Extension[26615]: Extension received
request to wake up for complication support.
Oct 18 18:08:11 pc16 assertiond[26585]: assertion failed: 15A284 13S343: assertiond + 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];
[...]
}
哇,我终于解决了这个问题!
看来,即使我没有在日志文件中看到它(请参阅我的最后一条评论),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;
}
暂时它工作正常...
我正在开发我的应用程序的 WatchKit 扩展,遇到一些复杂问题。
我有一个显示给定总量的复杂功能,这取决于用户在 iOS 应用程序上所做的事情。当 WatchKit 扩展为 运行 时,iOS 应用程序使用 -[WCSession updateApplicationContext:]
方法更新手表应用程序上下文。它工作正常,然后在我的 Watch 应用程序的 ExtensionDelegate 中,我用新数据手动更新复杂功能。
但这只有在扩展名是 运行 时才可以(如果不是,它将在下一次启动之前无法获取应用程序上下文)。
所以我编辑了我的代码,当用户在 iOS 应用程序中更改某些内容时,使用 -[WCSession transferCurrentComplicationUserInfo:]
方法(它写在文档中,ExtensionDelegate 应该被唤醒以在后台接收用户信息)。
我已经实现了 ExtensionDelegate 的 -session:didReceiveUserInfo:
方法,以便在它从 iOS 应用程序接收到数据时更新复杂功能,但是当扩展不是 [=55 时它不起作用=]...(我不知道它是否收到过用户信息,因为我无法登录)
即使扩展名不是 运行,我应该如何使我的并发症保持最新??
谢谢
PS:我正在使用 Watch Simulator,"close" 扩展我只是重新启动手表(从硬件菜单)
Edit:当应用程序不是 运行(通过打开 Watch Simulator 系统日志)时,我设法注销了语句,当iOS 向手表扩展发送一个新的复杂功能用户数据:
Oct 18 18:08:11 pc16 WatchApp Extension[26615]: Extension received request to wake up for complication support.
Oct 18 18:08:11 pc16 assertiond[26585]: assertion failed: 15A284 13S343: assertiond + 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];
[...]
}
哇,我终于解决了这个问题!
看来,即使我没有在日志文件中看到它(请参阅我的最后一条评论),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;
}
暂时它工作正常...