首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CloudKit - CKRecord setObject上的异常: forKey:

CloudKit - CKRecord setObject上的异常: forKey:
EN

Stack Overflow用户
提问于 2016-11-05 07:28:19
回答 1查看 279关注 0票数 1

我正在尝试添加iCloud同步到我的游戏,通过存储保存数据文件名作为关键字,并在一个CKAsset中的文件。但是,当程序尝试在CKRecord上执行setObject: forKey:操作时,即使我使用简单的虚拟字符串而不是文件资产,它也总是会崩溃。

如果我没有将任何对象分配给CKRecord,记录将成功保存到iCloud,因为我可以在iCloud仪表板中看到具有正确名称的记录。

引发异常时,调试器输出中不会记录任何内容。是什么导致了这次崩溃?

代码语言:javascript
复制
bool        iCloudSync::UploadToCloud( SaveDataManager::CloudOperationComplete Callback, void *UserData, std::vector< const char * > *PathsToUpload )
{
    m_UploadCallback = Callback;
    m_UploadCallbackUserData = UserData;

    if (PathsToUpload == NULL) return false;

    // TODO: [[CKContainer defaultContainer] accountStatusWithCompletionHandler] to check if there is a signed-in icloud user
    CKDatabase *db = [[CKContainer defaultContainer] privateCloudDatabase];

    CKRecord *record = [[CKRecord alloc] initWithRecordType:@"SaveDataFiles"];

    for (int i = 0; i < PathsToUpload->size(); i++) {
        NSString *filenameString = [NSString stringWithCString:(*PathsToUpload)[i] encoding:NSASCIIStringEncoding];
        NSURL *documentsURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
        NSURL *fullPathURL = [documentsURL URLByAppendingPathComponent:filenameString];

        NSError *error = nil;
        bool reachable = [fullPathURL checkResourceIsReachableAndReturnError:&error];

        if (reachable) {
            CKAsset *fileAsset = [[CKAsset alloc] initWithFileURL:fullPathURL];

            // CRASH HERE Trying to assign any value to a key
//          record[filenameString] = fileAsset;
            [record setObject:@"Dummy test string" forKey:filenameString];
        }
    }

    // TODO: completion handler
    // TODO: always overwrite remote
    [db saveRecord:record completionHandler:nil];

//  CKModifyRecordsOperation *modify = [[CKModifyRecordsOperation alloc] initWithRecordsToSave:[NSArray arrayWithObject:record] recordIDsToDelete:nil];

    // Success!
    return true;
}
EN

回答 1

Stack Overflow用户

发布于 2016-11-05 08:55:26

记录的错误为:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'recordKey (gamestate1.dat) contains invalid characters'

没有日志记录的原因是因为我的异常断点在日志记录实际发生之前被连续触发了几次。我只需要继续按下continue,然后它就会记录异常输出。

所以,我只需要找到一些我可以使用的不包含点的其他键,这是一个令人沮丧的无效字符。

对于参考,有效字符是第一个字符必须是字母顺序,后面的字符是字母数字或下划线。以下是苹果的措辞:

密钥名称由一个或多个字母数字字符组成,并以字母开头。如果不使用下划线作为名称中的第一个字符,也可以包括下划线字符。键名称中不允许有空格。键的名称不得与此类的任何属性的名称匹配。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40433101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档