2017-06-14 15 views
2

Ich konnte keinen geeigneten und richtigen Weg finden, um zu überprüfen, ob ein CKRecord-Abonnement bereits existiert, und wenn es nicht abonniert ist, um Push-Benachrichtigungen zu erhalten.Überprüfen Sie, ob das Datensatzabonnement bereits in CloudKit existiert.

Ich habe das Abonnement selbst implementiert und es reagiert, aber jedes Mal, wenn ich den richtigen View Controller betrete, versuche ich immer wieder zu abonnieren und der Server antwortet mit einem Fehler, wenn das Abonnement bereits existiert - Meine Frage ist: Is Gibt es eine Möglichkeit, zuerst zu überprüfen, ob das Abonnement vorhanden ist, anstatt zu versuchen, es zu erstellen und auf die Serverantwort zu warten?

Hier ist, wie ich auf ein Rekord bin abonnieren:

// Create the predicate 
let predicate = NSPredicate(format: "recordId = %@", RECORD_ID) 

// Create a subscription specifying the record type, predicate and notification options 
let subscription = CKQuerySubscription(recordType: "Tabs", predicate: predicate, options: [.firesOnRecordUpdate, .firesOnRecordCreation]) 

// Create a CloudKit notification object 
let notificationInfo = CKNotificationInfo() 
notificationInfo.alertLocalizationKey = "Updates have been made" 
notificationInfo.shouldBadge = true 

// Set the subscriptor's notification object to the new CloudKit notification object 
subscription.notificationInfo = notificationInfo 

// Save the subscription to the database 
let publicDatabase = CKContainer.default().publicCloudDatabase 
publicDatabase.save(subscription) { (subs, err) in 
    if let err = err { 
     print("Failed to save subscription:", err) 
     return 
    } 
} 

Dank

Antwort

1

Sie fetchAllSubscriptionsWithCompletionHandler können alle vorhandenen U-Boote abfragen, dann können Sie subscriptionID Eigenschaft auf jedem der Abschluss-Handler zurückUnter überprüfen . Die objective-c-Version sieht so aus:

[publicDatabase fetchAllSubscriptionsWithCompletionHandler:^(NSArray<CKSubscription *> * _Nullable subscriptions, NSError * _Nullable error) 
    { 
     NSMutableArray *subIDs = [NSMutableArray new]; 
     for (CKSubscription *sub in subscriptions) 
     { 
      if ([sub.subscriptionID isEqualToString:@"whatever"]; 
      { 
        //do some stuff 
      } 
     } 
    }]; 

Sie erwähnen jedoch, einen View-Controller erneut einzugeben und diese Prüfung erneut auszuführen. Nicht, dass diese Prüfung jedes Mal eine Anfrage an den Server sendet und somit auf Ihre Transaktions- und Transferquoten angerechnet wird. Ich empfehle stattdessen, dass Sie diese Überprüfung einmal beim Start der Anwendung ausführen und dann den Status jedes Unterelements in Klassenvariablen speichern, damit Sie den Server nicht wiederholt mit unnötigen Aufrufen erneut abfragen müssen.

Verwandte Themen