CloudKit - Notifications

Bonjour,


 


Je galère avec les remote silent notifications...


 


Globalement, ça fonctionne lorsque mon iPhone et mon iPad sont tous les deux connectés à  Xcode. Donc la subscription existe et est bien déclarée ; je la vois sur le dashboard.


Mais lorsque je fais tourner l'application sur l'iPhone et l'iPad sans Xcode :


- lorsque je mets à  jour un CKRecord dans l'application iPhone, il se met bien à  jour sur le Cloud (je le vois dans les logs de CloudKit dashboard)


- la remote notification est bien émise par les serveurs d'Apple (cf capture d'écran)


 


Réponses

  • Bonsoir,


     


    Je me réponds à  moi-même !


     


    ça fonctionne... Je ne suis pas sûr à  100% du pourquoi, mais c'est probablement lié à  une remise à  zéro des subscriptions, à  la fois sur le cloudKit dashboard et via une requête "fetchAllSubscriptions" avec suppression des subscriptions avant de les recréer.


     


    Bonne fin de WE,


    Cordialement,


    Nicolas


  • Bonsoir,


     


    Ben non, je m'arrache toujours les cheveux !


    Dans ce que j'arrivais à  faire marcher, il ne s'agissait pas réellement d'une notification silencieuse, puisque "shouldbadge" était à  "true".


     


    J'ai recréé une nouvelle application qui ne fait que :


    - créer la zone dans la private database


    - créer une subscription pour toute modification apportée à  cette zone


    - lorsqu'une notification arrive, le viewController met à  jour un label avec un compteur qui s'incrémente


     


    Lorsque l'iPhone et l'iPad font fonctionner l'app à  partir de xCode, tout va bien ; lorsque je crée un "record" à  partir du "cloud kit dashboard", la notification arrive bien instantanément sur les deux iDevices et le label se met à  jour.


     


    Lorsque je fais fonctionner l'app en autonome sur iPhone et iPad, la notification push est bien créée (je la vois sur le dashboard"), mais elle ne semble pas arriver sur les iDevices. Ou alors parfois au bout d'un temps qui se compte en plusieurs heures. Alors que les deux iDevices sont branchés, connectés, allumés...


     


    Le code pour l'AppDelegate :



    import UIKit

    @UIApplicationMain
    class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    UIApplication.shared.registerForRemoteNotifications()
    return true
    }

    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    // if let viewController = self.window?.rootViewController as? ViewController {
    // viewController.displayAlert(title: "Good news", subtitle: "Registration for remote notification OK")
    // }
    }

    func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
    if let viewController = self.window?.rootViewController as? ViewController {
    viewController.displayAlert(title: "Bad news", subtitle: "Registration for remote notification failed")
    }
    }

    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    guard let viewController = self.window?.rootViewController as? ViewController else {return }
    viewController.fetchChanges(handler: {success in
    completionHandler(success ? .newData : .noData)})
    }
    }

    Et pour le viewController 



    import UIKit
    import CloudKit

    class ViewController: UIViewController {


    var compteur = 0
    @IBOutlet weak var label: UILabel!
    let database = CKContainer.default().privateCloudDatabase
    let recordZone = CKRecordZone(zoneName: "cave")

    override func viewDidLoad() {
    super.viewDidLoad()
    label?.text = "en attente"
    zoneSubscription()

    database.save(recordZone) { (recordZone, erreur) in
    if erreur != nil {
    print("erreur zone")
    }
    }
    // Do any additional setup after loading the view, typically from a nib.
    }

    func zoneSubscription() {

    let zoneSubscription = CKRecordZoneSubscription(zoneID: recordZone.zoneID, subscriptionID: "caveSubscription")
    let notificationInfo = CKNotificationInfo()
    notificationInfo.shouldSendContentAvailable = true
    zoneSubscription.notificationInfo = notificationInfo
    database.save(zoneSubscription) { (subscription, erreur) in
    if erreur != nil {
    self.displayAlert(title: "Erreur", subtitle: "Impossible d'enregistrer la subscription : \(String(describing: erreur?.localizedDescription))")

    } else {
    self.displayAlert(title: "Good news", subtitle: "Subscription bien enregistrée")
    }
    }
    }

    func fetchChanges(handler: @escaping (Bool) -> Void) {
    compteur += 1
    label?.text = "Notification \(compteur) reçue"
    }

    // Utilitaire permettant d'afficher une alerte
    func displayAlert(title: String, subtitle: String) {
    let alert = UIAlertController()
    alert.title = title
    alert.message = subtitle
    alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
    alert.popoverPresentationController?.sourceView = self.view
    alert.popoverPresentationController?.sourceRect = CGRect(origin: self.view.center, size: CGSize(width: 100, height: 20))
    self.present(alert, animated: true, completion: nil)
    }

    }


    Les réglages dans "capabilities" sont conformes à  ce que j'ai lu partout :


    - iCloud : avec CloudKit activé et le default container


    - Push notifications


    - Background modes avec background fetch et remote notifications


     


    J'ai vu la vidéo WWDC17 sur le cloud kit dashboard : lorsque l'intervenant met à  jour quelque chose dans le dashboard, la mise à  jour sur l'iPhone est instantanée.


     


    Questions :


    - est-ce que je rate quelque chose ?


    - ou bien est-ce qu'il normal qu'une notification mette des heures ou des jours à  arriver ? Et encore, je n'en suis même pas sûr !


     


    Mille mercis pour toute aide !


     


    Cordialement,


    Nicolas

  • Bonsoir,


     


    Bon, je vois que ça n'inspire pas grand monde.


     


    Si jamais quelqu'un(e) pouvait tester et confirmer si les notifications arrivent rapidement ou pas ? Je désespère  :'(


     


    Thanks !


    Nicolas


Connectez-vous ou Inscrivez-vous pour répondre.