【问题标题】:CloudKit - exception on CKRecord setObject: forKey:CloudKit - CKRecord setObject 上的异常:forKey:
【发布时间】:2017-03-18 21:40:23
【问题描述】:

我正在尝试将 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;
}

【问题讨论】:

    标签: icloud cloudkit


    【解决方案1】:

    记录的错误是:

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

    没有记录任何内容的原因是,在记录实际发生之前,我的异常断点连续多次触发。我只需要在记录异常输出之前一直按继续。

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

    作为参考,有效字符是第一个字符必须是字母,后续字符是字母数字或下划线。这是苹果的措辞:

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

    【讨论】:

      猜你喜欢
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-29
      相关资源
      最近更新 更多