我正在尝试使用App Groups在VPN Extension和它在iOS中的容器应用程序之间共享数据。
我一直在关注Apple如何执行此操作的说明,但它似乎没有起作用。
我在Apple Developer配置文件中创建了名为group.com.fisc.vpnapp.datashare
的App Group。 (group
前缀由Apple自动添加到标识符中。
然后我使用此代码在我的VPN扩展代码中设置一个值
- (void) setStatus:(int) status
{
NSUserDefaults *dataShare = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.fisc.vpnapp.datashare"];
[dataShare setObject:@(status) forKey:@"status"];
[dataShare synchronize];
}
然后在我的容器应用程序中,我使用以下代码来检索值。
/**
* Retrieve the status of the VPN Connection.
*
* @return int
*/
- (int) getStatus
{
NSUserDefaults *providerData = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.fisc.vpnapp.datashare"];
if ([providerData objectForKey:@"status"] != NULL) {
long providerStatus = [providerData integerForKey:@"status"];
// Logger is just a class that wraps
// around NSLog to supply headers and
// other information.
[Logger info:[NSString stringWithFormat:@"Found status in shared provider: %@", @(providerStatus)]];
// Validate that the stored status is within the
// range of valid status values.
if
(
providerStatus >= VPN_STATUS_DISCONNECTED &&
providerStatus <= VPN_STATUS_CONNECTED
) {
return (int)providerStatus;
}
}
// Default to disconnected status.
return VPN_STATUS_DISCONNECTED;
}
但是,似乎没有任何东西从应用程序组中读回来。
当我尝试在容器应用程序中读取值时,收到以下消息。
[User Defaults] Failed to read values in CFPrefsPlistSource<0x1c4116c80> (Domain: group.com.fisc.vpnapp.datashare, User: kCFPreferencesAnyUser, ByHost: Yes, Container: (null), Contents Need Refresh: Yes): Using kCFPreferencesAnyUser with a container is only allowed for System Containers, detaching from cfprefsd
我可以通过将代码中的应用程序组的字符串表示更改为group.com.XXXXXXX.fisc.vpnapp.datashare
(其中XXXXXXXX是我的团队ID)来消除该消息,它消除了消息但仍然无法访问我的消息共享数据。
我还尝试将通过NSUserDefaults访问App Group的所有代码放在各个主进程的每个进程上,没有区别。
修改
我还尝试在从它们读取之前同步NSUserDefaults。