2017-12-07 6 views
0

を共有することができません:私はCKRecordを共有するには、以下のコードを書いたCKRecord

CKRecordZone *restaurantsZone = [[CKRecordZone alloc] initWithZoneName:@"RestaurantsZone"]; 
CKRecordID *recordID = [[CKRecordID alloc] initWithRecordName:self.recordName zoneID:restaurantsZone.zoneID]; 
CKRecord *record = [[CKRecord alloc] initWithRecordType:@"Restaurant" recordID:recordID]; 
[record setValue:self.restaurant forKey:@"name"]; 

UICloudSharingController *cloudSharingController = [[UICloudSharingController alloc] initWithPreparationHandler:^(UICloudSharingController * _Nonnull controller, void (^ _Nonnull preparationCompletionHandler)(CKShare * _Nullable, CKContainer * _Nullable, NSError * _Nullable)) { 
    [self shareRootRecord:record name:self.restaurant completion:preparationCompletionHandler]; 
}]; 
cloudSharingController.delegate = self; 
[self presentViewController:cloudSharingController animated:YES completion:nil]; 

そしてshareRootRecord機能:

- (void)shareRootRecord:(CKRecord *)rootRecord name:(NSString *)name completion:(void (^)(CKShare * _Nullable share, CKContainer * _Nullable container, NSError * _Nullable error))completion 
{ 
    CKShare *shareRecord = [[CKShare alloc] initWithRootRecord:rootRecord]; 
    shareRecord[CKShareTitleKey] = name; 
    NSArray *recordsToSave = @[rootRecord, shareRecord]; 
    CKContainer *container = [CKContainer defaultContainer]; 
    CKDatabase *privateDatabase = [container sharedCloudDatabase]; 

    CKModifyRecordsOperation *operation = [[CKModifyRecordsOperation alloc] initWithRecordsToSave:recordsToSave recordIDsToDelete:@[]]; 
    [operation setPerRecordCompletionBlock:^(CKRecord * _Nullable record, NSError * _Nullable error) { 
     if (error) { 
      NSLog(@"%@", [error localizedDescription]); 
     } 
    }]; 
    [operation setModifyRecordsCompletionBlock:^(NSArray<CKRecord *> * _Nullable savedRecords, NSArray<CKRecordID *> * _Nullable deletedRecordIDs, NSError * _Nullable error) { 
     if (error) { 
      NSLog(@"%@", [error localizedDescription]); 
     } 
     completion(shareRecord, container, error); 
    }]; 

    [privateDatabase addOperation:operation]; 
} 

、私はこのコードを実行すると、次のエラーがスローされます:Only shared zones can be accessed in the shared DB。私は理由を理解することができないようです。何か案は?

答えて

0

共有しようとしているCKRecordが共有する前に所有者のprivateDBに入っていることを確認してください。

参加者が共有を受け入れると、参加者sharedDBにレコードが表示されます。

このコードは、レコードと共有を作成し、レコードの所有者のsharedDBを変更しようとします。

概念的には、所有者のprivateDBのレコードを参加者と共有したいとします。参加者のsharedDBは、所有者のprivateDBへのウィンドウとして機能します。

関連する問題