我正在iCloud KVStore
使用多个应用程序配置风景。在这个场景中,您有一个写入其 kvstore 容器的主要应用程序,以及从主要应用程序的 kvstore 读取的辅助应用程序。主要应用程序有一个 kvstore 标识符,默认情况下(激活时iCloud Key-Value Store Capability
)是
<key>com.apple.developer.icloud-container-identifiers</key>
<array/>
<key>com.apple.developer.ubiquity-kvstore-identifier</key>
<string>$(TeamIdentifierPrefix)$(CFBundleIdentifier)</string>
正如 Apple's Doc 中多个应用程序的通用键值存储场景所述:
您必须为除主要应用程序以外的所有应用程序指定主要应用程序的 kv-store 标识符,例如
<key>com.apple.developer.icloud-container-identifiers</key>
<array/>
<key>com.apple.developer.ubiquity-kvstore-identifier</key>
<string>ABCDEFGH.com.myCompany.myApp</string>
在哪里
ABCDEFGH.com.myCompany.myApp
是$(TeamIdentifierPrefix)$(CFBundleIdentifier)
价值观。
在运行辅助应用程序(在这种情况下是 tvOS 应用程序)时,如果它具有默认的 kv-store 标识符,则它可以工作,它不会运行(它编译),当使用请求的ABCDEFGH.com.myCompany.myApp
值时,用于读取共享iCloud KVStore
错误是:
您的应用程序的代码签名权利文件中指定的权利与您的配置文件中指定的权利不匹配。(0xE8008016)。
我还尝试以编程方式检查 Team-ID 标识符的值,以确保它是在 iTunesConnect 门户上定义的值,如下所示:
+ (NSString *)bundleSeedID {
NSDictionary *query = [NSDictionary dictionaryWithObjectsAndKeys:
(__bridge NSString *)kSecClassGenericPassword, (__bridge NSString *)kSecClass,
@"bundleSeedID", kSecAttrAccount,
@"", kSecAttrService,
(id)kCFBooleanTrue, kSecReturnAttributes,
nil];
CFDictionaryRef result = nil;
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, (CFTypeRef *)&result);
if (status == errSecItemNotFound)
status = SecItemAdd((__bridge CFDictionaryRef)query, (CFTypeRef *)&result);
if (status != errSecSuccess)
return nil;
NSString *accessGroup = [(__bridge NSDictionary *)result objectForKey:(__bridge NSString *)kSecAttrAccessGroup];
NSArray *components = [accessGroup componentsSeparatedByString:@"."];
NSString *bundleSeedID = [[components objectEnumerator] nextObject];
CFRelease(result);
return bundleSeedID;
}
事实上它是正确的:
ABCDEFGH.com.myCompany.myApp
我已经尝试了一个已经在 AppStore 上的应用程序,以及一个正在开发中但在 AppStore 上配置的应用程序(因此 BundleID,此 BundleID 的配置文件,都来自 iTunes Connect),但是错误仍然存在。