我现在有3天的巨大问题。 我尝试在iOS上使用iCloud Key-Value存储,但值永远不会与iCloud同步,没有明显的错误。 当我说它没有同步时,它根本就不会同步。我可以让应用程序运行15分钟,关闭它并再次启动它,价值仍然不存在。
我在Apple会员中心的App-ID上启用了iCloud。 我在项目的xCode功能中启用了iCloud。 一切都运行良好而没有错误但是当我试图获得我的价值时,它根本就不存在。
以下是我用来与iCloud通信的代码(请记住,我需要将它与Unity3D一起使用):
extern "C" void UnitySendMessage(const char *, const char *, const char *);
@interface iCloudPlugin : NSObject
{
NSUbiquitousKeyValueStore *keyStore;
}
@end
@implementation iCloudPlugin
- (id) initClass
{
if([NSUbiquitousKeyValueStore defaultStore] == nil){
NSLog(@"iCloud not enabled");
}else{
keyStore = [NSUbiquitousKeyValueStore defaultStore];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyValueStoreDidChange:) name:NSUbiquitousKeyValueStoreDidChangeExternallyNotification object:keyStore];
}
return self;
}
- (void) synchronize
{
NSLog(@"Syncing iCloud");
if([keyStore synchronize])
{
NSLog(@"Successfully synced");
}
}
- (void) addValue:(const char*)key value:(const char*)value
{
NSLog([NSString stringWithFormat:@"%s",key]);
NSLog([NSString stringWithFormat:@"%s",value]);
[keyStore setString:[NSString stringWithFormat:@"%s",key] forKey:[NSString stringWithFormat:@"%s",value ]];
[self synchronize];
}
-(void) keyValueStoreDidChange: (NSNotification *) notification
{
NSLog([NSString stringWithFormat:@"Key/Value Changed"]);
}
- (const char*) getValue:(const char*)key
{
NSString *storedString = [keyStore stringForKey:[NSString stringWithFormat:@"%s",key]];
return [storedString UTF8String];
}
- (BOOL) hasKey:(const char*)key
{
NSString *storedString = [keyStore stringForKey:[NSString stringWithFormat:@"%s",key]];
if(storedString == nil){
return NO;
}else{
return YES;
}
}
- (void) removeKey:(const char*)key
{
[keyStore removeObjectForKey:[NSString stringWithFormat:@"%s",key]];
[self synchronize];
}
@end
extern "C" {
void *_InitICloud();
void _Synchronize(void *instance);
void _AddValue(void *instance, const char *key, const char *value);
const char *_GetValue(void *instance, const char *key);
BOOL _HasKey(void *instance, const char *key);
void _RemoveKey(void *instance, const char *key);
}
void *_InitICloud()
{
id instance = [[iCloudPlugin alloc] initClass];
return (void *)instance;
}
void _Synchronize(void *instance)
{
iCloudPlugin *iCloudInstance = (iCloudPlugin *) instance;
[iCloudInstance synchronize];
}
void _AddValue(void *instance, const char *key, const char *value){
iCloudPlugin *iCloudInstance = (iCloudPlugin *) instance;
[iCloudInstance addValue:key value:value];
}
const char *_GetValue(void *instance, const char *key)
{
iCloudPlugin *iCloudInstance = (iCloudPlugin *) instance;
return [iCloudInstance getValue:key];
}
BOOL _HasKey(void *instance, const char *key)
{
iCloudPlugin *iCloudInstance = (iCloudPlugin *) instance;
return [iCloudInstance hasKey:key];
}
void _RemoveKey(void *instance, const char *key)
{
iCloudPlugin *iCloudInstance = (iCloudPlugin *) instance;
[iCloudInstance removeKey:key];
}
因此,每次启动我的应用程序时,都会检查一个名为" myKey"有"测试"值。
如果它不存在,我创建它,如果它存在,我显示它。
如果没有挂起,则hasKey函数始终返回NO。
我尝试在我的应用的不同位置调用它,或者多次同步它,但是当我重新启动应用时,我从未拥有自己的价值。
我查看了iPhone 5(运行iOS 8.1)日志,并且没有关于iCloud的日志。 我已经阅读了另一个主题,即隐藏的iCloud日志可以通过与iCloud同步访问,然后导航到〜/ Library / Logs / CrashReporter / MobileDevice / iPhone de ******* / DiagnosticLogs。
在这些日志中,我有时会发现:
Nov 4 16:57:29 iPhone-de-******* librariand[139] <Debug>: cancelled, closing fd 4
Nov 4 16:57:29 iPhone-de-******* librariand[139] <Debug>: client process 140 does not have a valid com.apple.developer.ubiquity-container-identifiers entitlement
Nov 4 16:57:29 iPhone-de-******* librariand[139] <Debug>: not tracking pid 140 since it does not require us to enable push
Nov 4 16:57:29 iPhone-de-******* librariand[139] <Debug>: application identifier for process 140 = bird
Nov 4 16:57:29 iPhone-de-******* librariand[139] <Debug>: received request 12 from client 140 (bird): <dictionary: 0x175749a0> { count = 1, contents =
"Request Type" => <uint64: 0x17683ed0>: 12
}
Nov 4 16:57:29 iPhone-de-******* librariand[139] <Debug>: container com.apple.shoebox has 0 bytes evictable
Nov 4 16:57:29 iPhone-de-******* librariand[139] <Debug>: client connection error: Connection invalid
问题是我无法在iCloud权利中找到任何com.apple.developer.ubiquity-container-identifiers。 所以我创建它并给它我们的AppID值,但它也没有工作(+它在xCode中显示错误,因为它不能识别它)。
我尝试从手机中删除所有配置文件,但它并没有改变任何内容。 我试图在iCloud中禁用Cellular Data,它没有改变任何东西(我也尝试再次启用它,猜测什么,不会改变任何东西)。
我现在真的卡住了,并且搜索了我能找到的与此错误相关的所有内容。
感谢您的帮助。