私のゲームにiCloud同期を追加しようとしています。保存データファイル名をキーとして保存し、そのファイルをCKAsset
に保存しようとしています。ただし、ファイルアセットの代わりに単純なダミー文字列を使用しても、CKRecord
のsetObject: forKey:
に接続しようとすると、プログラムは常にクラッシュします。CloudKit - 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;
}