Я читал и пытался использовать функцию CKSubscription в течение нескольких недель, но я не могу найти информацию о некоторых общих вопросах. Я читал документы Apple, обучающие онлайн-книги, книги, которые я купил, и вопросы здесь, на SO, но я до сих пор не понимаю основополагающих принципов, которые я думаю. Любая помощь очень ценится.Борьба за понимание CKSubscriptions в CloudKit
Вот вопросы, которые я не могу найти ответы на:
1). Какова цель идентификатора подписки? Установщик удобства не включает его, так зачем он нужен в назначенном init? Если вы используете его, будет ли он одинаковым для всех пользователей приложения?
2). Я видел, как кто-то упоминал здесь, что вы можете отменить регистрацию идентификатора подписки. Почему и как вы это сделаете?
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!")
}
})
}
Спасибо @harryhorn. Я смог получить простой истинный предикат для работы и получил push-уведомление. Кроме того, я могу делать аналогичные предикаты для идентификатора пользователя в моем приложении, например, когда я хочу вытащить сообщения текущего пользователя. И мой предикат подписки в основном то же самое, поэтому интересно, есть ли что-то о ссылках и подписках, которые не работают ... хотя я видел, как кто-то другой делал что-то подобное с ссылкой на SO, но не мог определить, был ли пользовательский идентификатор записи , И я не могу найти других примеров того, как кто-то делает то, что я делаю для подписки. Ценю вашу помощь. –
Пожалуйста, объясните, что именно вы делаете со ссылками и на что вы пытаетесь подписаться, поэтому я могу попробовать и помочь. – harryhorn
Спасибо @harryhorn. Когда пользователь делает комментарий к сообщению другого пользователя, я создаю две новые записи - запись комментариев и уведомлений. В записи уведомления у меня есть три поля: один со ссылкой на пользователя, создавшего сообщение, один с ссылкой на сообщение, и тот, который помечает его как прочитанный (для раздела уведомлений приложения). Я хочу, чтобы подписка на запрос позволяла мне отправлять push-уведомление пользователю при создании одной из этих записей уведомлений (кто-то ответил на их сообщение) и когда он еще не был помечен как прочитанный. Вложил мой код выше, чтобы показать, как я это делаю сейчас. –