Изо всех сил пытаться понять 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 ответ
Позвольте мне попытаться ответить:
- SubscriptionId позволяет позже идентифицировать подписку, например, чтобы удалить ее, используя метод CKDatabase deleteSubscriptionWithID
- Как узнать ответ 1. Что касается того, почему, может быть, вы больше не хотите получать уведомления об этой подписке. Это зависит от того, чего вы пытаетесь достичь с помощью приложения.
- да
- Да, если вы зарегистрируете только одну подписку, она должна работать для всех пользователей вашего приложения
Что касается ваших проблем, пожалуйста, обратите внимание, что идентификаторы записей пользователей являются особыми, поэтому у вас могут быть проблемы, связанные именно с ними, из-за проблем конфиденциальности вокруг них. Я бы предложил попробовать простой случай, в котором не участвуют пользователи, и посмотреть, работают ли подписки на вас. Затем подумайте еще раз о том, как вы используете идентификаторы записей пользователей.