尝试在手机上启动iCloud应用程序时出现黑屏

时间:2013-06-03 19:43:06

标签: ios objective-c icloud

我现在有这个根据我是否在模拟器中触发iCloud加载。当我尝试在真实设备上运行时,我得到一个黑屏,并且'addPersistentStore'线似乎挂起。 “我的项目名称”是权利文件的名称和应用程序的名称。

发生了什么事?

#if (TARGET_IPHONE_SIMULATOR)
        if (![psc addPersistentStoreWithType:NSSQLiteStoreType
                               configuration:nil
                                         URL:dbUrl
                                     options:nil
                                       error:&error]) {
            [NSException raise:@"Open failed" format:@"Reason: %@", [error localizedDescription]];
        }
#else
        NSFileManager *fm = [NSFileManager defaultManager];
        NSURL *ubContainer = [fm URLForUbiquityContainerIdentifier:nil];
        NSMutableDictionary *options = [NSMutableDictionary dictionary];
        [options setObject:@"My Project Name" forKey:NSPersistentStoreUbiquitousContentNameKey];
        [options setObject:ubContainer forKey:NSPersistentStoreUbiquitousContentURLKey];

        if (![psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:dbUrl options:options error:&error]) {
            [NSException raise:@"Open failed" format:@"%@", [error localizedDescription]];
        }
#endif

2 个答案:

答案 0 :(得分:2)

Apple建议您在使用iCloud时,应在单独的线程上执行所有这些步骤。 URLForUbiquityContainerIdentifieraddPersistentStoreWithType:configuration:options:error:都将连接到网络,并可能会长时间阻止。第二个调用 - 添加持久存储 - 可以阻止更长时间。在iOS上,iCloud数据仅按需下载,并且在添加持久性存储时会发生此需求。你得到一个空白屏幕因为NSPersistentStoreCoordinator忙于与网络通话(或尝试这样做)。 Apple的示例代码将它放在一个单独的队列中,您也应该这样做。

答案 1 :(得分:0)

您的代码并未表明这一点,但您无法在主要主题上调用-URLForUbiquityContainerIdentifier。来自Apple documentation的注意事项:

  

重要提示:请勿在应用的主要主题中调用此方法。   因为此方法可能需要花费大量时间来设置   iCloud并返回请求的URL,您应该始终从a中调用它   次要线程。确定iCloud是否可用,尤其是在   启动时,改为调用ubiquityIdentityToken方法。

很可能需要花费很长时间,看起来你的应用程序似乎没有加载,而实际上只是等待该方法返回。