我正在尝试添加iCloud同步到我的游戏,通过存储保存数据文件名作为关键字,并在一个CKAsset中的文件。但是,当程序尝试在CKRecord上执行setObject: forKey:操作时,即使我使用简单的虚拟字符串而不是文件资产,它也总是会崩溃。
如果我没有将任何对象分配给CKRecord,记录将成功保存到iCloud,因为我可以在iCloud仪表板中看到具有正确名称的记录。
引发异常时,调试器输出中不会记录任何内容。是什么导致了这次崩溃?
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;
}发布于 2016-11-05 08:55:26
记录的错误为:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'recordKey (gamestate1.dat) contains invalid characters'
没有日志记录的原因是因为我的异常断点在日志记录实际发生之前被连续触发了几次。我只需要继续按下continue,然后它就会记录异常输出。
所以,我只需要找到一些我可以使用的不包含点的其他键,这是一个令人沮丧的无效字符。
对于参考,有效字符是第一个字符必须是字母顺序,后面的字符是字母数字或下划线。以下是苹果的措辞:
密钥名称由一个或多个字母数字字符组成,并以字母开头。如果不使用下划线作为名称中的第一个字符,也可以包括下划线字符。键名称中不允许有空格。键的名称不得与此类的任何属性的名称匹配。
https://stackoverflow.com/questions/40433101
复制相似问题