Этот код не работает. Что на самом деле я должен делать, чтобы получать уведомления, когда я не владелец записи?

я есть два аккаунта icloud (A а такжеB) на двух разных устройствах. От одного из них (A) Я делюсь ckrecord с другим (B) нравится:

let controller = UICloudSharingController { controller, preparationCompletionHandler in

    let share = CKShare(rootRecord: record)
    share[CKShareTitleKey] = "title" as CKRecordValue

    share[CKShareTypeKey] = "pl.blueworld.fieldservice" as CKRecordValue
    share.publicPermission = .readWrite

    let modifyOperation = CKModifyRecordsOperation(recordsToSave: [record, share], recordIDsToDelete: nil)
    modifyOperation.savePolicy = .ifServerRecordUnchanged
    modifyOperation.perRecordCompletionBlock = { record, error in
        print(error?.localizedDescription ?? "")
    }

    modifyOperation.modifyRecordsCompletionBlock = { records, recordIds, error in

        print(share.url)
        preparationCompletionHandler(share, CloudAssistant.shared.container, error)
    }

    CloudAssistant.shared.container.privateCloudDatabase.add(modifyOperation)
}

controller.delegate = self

UIViewController.top()?.present(controller, animated: true)

Когда второе устройство (B) действительно принял cloudkit поделиться я получаю записи и подписаться на изменения:

func application(_ application: UIApplication, userDidAcceptCloudKitShareWith cloudKitShareMetadata: CKShareMetadata) {

    let acceptSharesOperation = CKAcceptSharesOperation(shareMetadatas: [cloudKitShareMetadata])
    acceptSharesOperation.perShareCompletionBlock = { metadata, share, error in

        if let error = error {
            UIAlertController.show(withMessage: error.localizedDescription)
        } else {

            let operation = CKFetchRecordsOperation(recordIDs: [cloudKitShareMetadata.rootRecordID])
            operation.perRecordCompletionBlock = { record, _, error in

                if let error = error {
                    UIAlertController.show(withMessage: error.localizedDescription)
                } else if let record = record {
                    CloudAssistant.shared.save(records: [record], recordIDsToDelete: [])

                    let options: CKQuerySubscriptionOptions = [.firesOnRecordCreation, .firesOnRecordUpdate, .firesOnRecordDeletion]
                    let territorySubscription = CKQuerySubscription(recordType: "Territory", predicate: NSPredicate(value: true), options: options)

                    let notificationInfo = CKNotificationInfo()
                    notificationInfo.shouldBadge = false
                    notificationInfo.shouldSendContentAvailable = true

                    territorySubscription.notificationInfo = notificationInfo

                    CloudAssistant.shared.sharedDatabase?.save(territorySubscription) { _, _ in }
                }
            }

            CloudAssistant.shared.container.sharedCloudDatabase.add(operation)
        }
    }
    acceptSharesOperation.qualityOfService = .userInteractive
    CKContainer(identifier: cloudKitShareMetadata.containerIdentifier).add(acceptSharesOperation)
}

Теперь с устройстваA I успешно (Я уверен, что изменения сохраняются в iCloud). Выполните обновление записи, которой поделились с другими. Но устройствоB не знает об этом, если я не получу запись вручную еще раз.

Но с другой стороны, это работает довольно хорошо.

Если я успешно выполню обновление записи, которой поделились со мной (на устройствеB) затем устройствоA Mnagically получает уведомление об изменении, и все в порядке. В чем разница?

Как подписаться на изменения в записях, которыми поделились со мной?

P.S, когда я смогу, я начну вознаграждение 200 или даже больше для кого-то, кто поможет мне в этом.

iOS 11, Swift 4, Xcode 9

 manismku20 окт. 2017 г., 09:00
Вы зарегистрировались для push-уведомлений на другом устройстве?
 Bartłomiej Semańczyk20 окт. 2017 г., 09:01
для push-уведомлений зарегистрировано на обоих. Должно быть потому, что одно и то же приложение скомпилировано на обоих устройствах ... и в одном сценарии оно работает
 Bartłomiej Semańczyk20 окт. 2017 г., 08:59
точно ... это как сейчас
 manismku20 окт. 2017 г., 08:58
Я понял следующее: «Когда владелец изменяет свою запись на общую, тогда другое устройство не получает обновления об уведомлении, а наоборот работает хорошо»?

Ответы на вопрос(1)

которые не отображаются должным образом. Похоже, вы, возможно, уже исключили некоторые из них.

Убедитесь, что приложение зарегистрировано для уведомленийУбедитесь, что на устройстве включены уведомления для этого приложенияУбедитесь, что все устройства используют один и тот же контейнерПри следующем запуске приложения прочитайте все подписки, используяfetchAllSubscriptionsWithCompletionHandler и NSLog детализирует каждую подпрограмму (особенно: subscriptionID, параметры триггера, тип записи и предикат). Убедитесь, что ожидаемые подводные лодки существуют. Убедитесь, что предикат каждого подчиненного элемента соответствует ожиданиям (в этом случае сравните предикаты, которые вы найдете на обоих устройствах).

Я потратил кучу времени на отладку «отсутствующих» уведомлений, когда:

Моя локально построенная версия использовала среду TEST, а пользователи TestFlight получали доступ к среде PROD. Шаг 2 отладки нашел это.При непреднамеренном повторном использовании идентификатора подписки, таким образом, каждая новая подпрограмма перезаписывает предыдущую. Шаг 4 отладки в конечном итоге выявил проблему

До сих пор эти четыре шага отладки помогли мне понять все мои проблемы с «отсутствующим уведомлением». Однажды я понял, почему уведомления не появляются, это сузило, какой блок кода был ответственным.

 Bartłomiej Semańczyk30 окт. 2017 г., 22:16
Этот код не работает. Что на самом деле я должен делать, чтобы получать уведомления, когда я не владелец записи?
 Bartłomiej Semańczyk26 окт. 2017 г., 10:36
Чтобы получить подписки, сначала нужно подписаться на изменения ... и это так ... это не работает ... Я подписываюсь на изменения, но он все еще не получает уведомления от ВЛАДЕЛЬЦА записи (однако владелец получает уведомление) от других пользователей)
 Thunk26 окт. 2017 г., 15:58
Когда вы вызываете FetchAllSubscription на компьютере пользователя, сколько найденных подпрограмм? Сколько вы ожидали?
 Thunk27 окт. 2017 г., 18:00
Шаг 4 заключается в проверке правильности создания подпрограмм на устройстве пользователя.
 Bartłomiej Semańczyk27 окт. 2017 г., 10:02
Что является причиной для получения всех подписок? Они могут быть получены для базы данных. И я думаю, что они нужны мне для общей базы данных, верно? Я проверю это в течение одного дня ...

Ваш ответ на вопрос