2016-11-04 11 views
1

私のゲームにiCloud同期を追加しようとしています。保存データファイル名をキーとして保存し、そのファイルをCKAssetに保存しようとしています。ただし、ファイルアセットの代わりに単純なダミー文字列を使用しても、CKRecordsetObject: 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; 
} 

答えて

1

た記録されたエラー:

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

私の例外ブレークポイントが実際に伐採前の行に数回トリガーなっていたので、何も記録されませんされていた理由でした起こりました。私は例外出力を記録する前に、継続して押し続ける必要がありました。

だから、私はちょうど無効な文字であるドットを含まない他のキーを見つける必要があります。

参考として、最初の文字はアルファベットでなければならず、後続の文字は英数字またはアンダースコアでなければなりません。ここにAppleの表現があります。

キー名は、1つ以上の英数字で構成され、文字で始まります。また、名前の最初の文字としてアンダースコアを使用しない場合は、アンダースコア文字を含めることもできます。キー名にスペースは使用できません。キーの名前は、このクラスのプロパティの名前と一致していてはなりません。

関連する問題