iCloud Key-Value从不同步

时间:2014-11-04 16:31:14

标签: ios objective-c xcode icloud nsubiquitouskeyvaluestore

我现在有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,它没有改变任何东西(我也尝试再次启用它,猜测什么,不会改变任何东西)。

我现在真的卡住了,并且搜索了我能找到的与此错误相关的所有内容。

感谢您的帮助。

0 个答案:

没有答案