2015-05-07 3 views
3

Я читал и пытался использовать функцию 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!") 

     } 

    }) 
} 

ответ

1

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

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

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

+0

Спасибо @harryhorn. Я смог получить простой истинный предикат для работы и получил push-уведомление. Кроме того, я могу делать аналогичные предикаты для идентификатора пользователя в моем приложении, например, когда я хочу вытащить сообщения текущего пользователя. И мой предикат подписки в основном то же самое, поэтому интересно, есть ли что-то о ссылках и подписках, которые не работают ... хотя я видел, как кто-то другой делал что-то подобное с ссылкой на SO, но не мог определить, был ли пользовательский идентификатор записи , И я не могу найти других примеров того, как кто-то делает то, что я делаю для подписки. Ценю вашу помощь. –

+0

Пожалуйста, объясните, что именно вы делаете со ссылками и на что вы пытаетесь подписаться, поэтому я могу попробовать и помочь. – harryhorn

+0

Спасибо @harryhorn. Когда пользователь делает комментарий к сообщению другого пользователя, я создаю две новые записи - запись комментариев и уведомлений. В записи уведомления у меня есть три поля: один со ссылкой на пользователя, создавшего сообщение, один с ссылкой на сообщение, и тот, который помечает его как прочитанный (для раздела уведомлений приложения). Я хочу, чтобы подписка на запрос позволяла мне отправлять push-уведомление пользователю при создании одной из этих записей уведомлений (кто-то ответил на их сообщение) и когда он еще не был помечен как прочитанный. Вложил мой код выше, чтобы показать, как я это делаю сейчас. –

Смежные вопросы