Изо всех сил пытаться понять CKSubscription в CloudKit

Я читал и пытался использовать функцию CKSubscription в течение нескольких недель, но я не могу найти информацию о некоторых общих вопросах. Я читал документы Apple, онлайн-уроки, книги, которые я купил, и вопросы здесь о SO, но я все еще не понимаю основы, я думаю. Любая помощь очень ценится.

Вот вопросы, на которые я не могу найти ответы:

1). Какова цель подписки ID? Удобство init не включает его, так зачем оно нужно в назначенном init? Если вы используете его, это то же самое для всех пользователей приложения?

2). Я видел здесь упоминание о том, что вы можете отменить регистрацию ID подписки. Почему или как бы вы это сделали?

3). Можно ли настроить подписки как в общедоступной, так и в личной базе данных пользователя?

4). Если у меня есть подписка на основе запросов, которая одинакова для всех пользователей, будет ли в базе данных указана только одна подписка?

Например, у меня возникают проблемы с получением уведомлений для работы с моим конкретным вариантом использования. В моей настройке это не проблема, так как я могу заставить работать предикат True, и приходит уведомление. Поэтому я не должен понимать основы того, как работают подписки.

Я пытаюсь настроить подписку, которая срабатывает при создании новой записи, когда другой пользователь комментирует сообщение. Эта новая запись будет содержать ссылку на пользователя, который создал сообщение. Единственная подписка, которую я вижу в базе данных для обоих пользователей, - Notifications.user (равнозначно ссылке). Итак, я предполагаю, что когда-нибудь увижу только одну эту подписку.(?) Но как сервер отслеживает запись каждого пользователя и знает, когда отправить его на определенное устройство?

Проблема в том, что я не могу получить уведомление на работу. Я вручную добавляю запись на приборной панели и помещаю идентификатор записи другого пользователя в качестве CKReference. Пока я добавляю запись, приложение работает в фоновом режиме на устройстве под учетной записью пользователя, которое я добавил в поле как CKReference. Я ожидаю, что запрос сработает и отправит push-уведомление, так как кто-то прокомментировал сообщение этого пользователя.

Вот мой код для настройки подписки:

func subscribe(userID: CKRecordID) {


    let options = CKSubscriptionOptions.FiresOnRecordCreation

    let userRef = CKReference(recordID: userID, action: .DeleteSelf)
    let predicate = NSPredicate(format: "userRef == %@", userRef)
    let predicateTwo = NSPredicate(format: "read = %@", "")
    let compoundPred = NSCompoundPredicate(type: .AndPredicateType, subpredicates: [predicate, predicateTwo])

    let subscription = CKSubscription(recordType: "Notifications", predicate: compoundPred, subscriptionID: subscriptionID,
        options: options)
    subscription.notificationInfo = CKNotificationInfo()
    subscription.notificationInfo.desiredKeys = ["userPost"]
    subscription.notificationInfo.alertBody = "Someone replied to your Pod post"

    publicDB.saveSubscription(subscription, completionHandler: {

        subscription, error in

        if (error != nil) {

            println("error subscribing: \(error)")

        } else {

            println("subscribed!")

        }

    })
}

1 ответ

Позвольте мне попытаться ответить:

  1. SubscriptionId позволяет позже идентифицировать подписку, например, чтобы удалить ее, используя метод CKDatabase deleteSubscriptionWithID
  2. Как узнать ответ 1. Что касается того, почему, может быть, вы больше не хотите получать уведомления об этой подписке. Это зависит от того, чего вы пытаетесь достичь с помощью приложения.
  3. да
  4. Да, если вы зарегистрируете только одну подписку, она должна работать для всех пользователей вашего приложения

Что касается ваших проблем, пожалуйста, обратите внимание, что идентификаторы записей пользователей являются особыми, поэтому у вас могут быть проблемы, связанные именно с ними, из-за проблем конфиденциальности вокруг них. Я бы предложил попробовать простой случай, в котором не участвуют пользователи, и посмотреть, работают ли подписки на вас. Затем подумайте еще раз о том, как вы используете идентификаторы записей пользователей.

Другие вопросы по тегам