2016-05-24 5 views
1

Ich frage mich, wie Apple Push-Benachrichtigungen verwaltet werden, wenn sich viele Benutzer für dieselbe App auf demselben Gerät befinden, da das Geräte-Token für jedes Gerät eindeutig ist.Verwalten von APN-Benachrichtigungen für mehrere Benutzer auf demselben Telefon

Wenn ich zwei registrierte Benutzer in meiner App auf demselben Gerät habe, wie kann ich verhindern, dass die Push-Benachrichtigung angezeigt wird, wenn die Benachrichtigung für userA erfolgt, aber userB derzeit in der App angemeldet ist?

Wenn sich die App im Vordergrund befindet, kann sie leicht von einer Benutzer-ID verwaltet werden, die verhindert, dass der Code ausgeführt wird, wenn der APN nicht für diesen Benutzer bestimmt ist.

Aber wie geht das, wenn die App im Hintergrund ist? Das Gerät empfängt den APN, gibt eine Warnung aus und zeigt die Benachrichtigung an, welcher Benutzer gerade in der App angemeldet ist ...

Antwort

1

Basierend auf Ihrem Kommentar zur Situation, wenn die App in der App ist Ich gehe davon aus, dass die Benachrichtigung einige Informationen enthält, die den Benutzer identifizieren, für den die Benachrichtigung gilt. Es sieht so aus, als ob Sie Informationen in NSUserDefaults unter didReceiveRemoteNotification abrufen können und basierend darauf entscheiden, ob die Benachrichtigung verarbeitet werden soll oder nicht.

aktualisieren Hinzufügen weitere Informationen:

Sie auch implementieren müssen application:didReceiveRemoteNotification:fetchCompletionHandler und schalten Sie die Benachrichtigung in eine „stille“ Benachrichtigung, dann, nachdem Sie die, die herausgefiltert haben Sie von denen, anzeigen möchten Sie wollen unterdrücken, würden Sie lokale Benachrichtigungen für diejenigen erstellen, die Sie anzeigen möchten. Sie müssen außerdem einen UIBackgroundModes in Ihrer info.plist hinzufügen und einen "content-available" -Schlüssel in Ihre Payload einfügen. Weitere Informationen finden Sie unter here.

<key>UIBackgroundModes</key> 
    <array> 
     <string>fetch</string> 
     <string>remote-notification</string> 
    </array> 

Es ist kritisch die Version mit fetchCompletionHandler da das eine ohne das implementieren wird nicht aufgerufen, wenn die Anwendung im Hintergrund ist.

Hier ist ein Beispiel aus einer meiner Apps, das "stille" Benachrichtigungen für Standortaktualisierungsanforderungen empfängt und auch einige "nicht stille" Benachrichtigungen empfängt. Wenn die App aktiv ist, zeige ich einen "Toast", wenn die App im Hintergrund ist, erstelle ich eine lokale Benachrichtigung aus der Remote-Benachrichtigung und trigse diese dann an.

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler handler: (UIBackgroundFetchResult) -> Void) { 
    log?.info("******* got a remote message = \(userInfo) *******") 
    let message: String = (userInfo["message"] ?? "stop") as! String 
    log?.info("message = \(message)") 
    switch message { 
    case "update_locations": 
     log?.info("starting location update cycle") 
     locationUploader?.startUploading(handler) 
    case "micropost_created": 
     log?.info("got a new micropost notification") 
     let notification = UILocalNotification() 
     let userName = userInfo["user_name"] as? String ?? "" 
     let content = userInfo["content"] as? String ?? "" 
     notification.alertTitle = "Micropost from \(userName)" 
     let alertBody = "\(userName) said: \(content)" 
     notification.alertBody = alertBody 
     notification.soundName = UILocalNotificationDefaultSoundName 
     application.presentLocalNotificationNow(notification) 
     if let topMostView = application.keyWindow { 
     topMostView.makeToast(message: alertBody) 
     } 
     handler(.NewData) 
    default: 
     handler(.NoData) 
    } 
    } 
+0

Ja das ist es, ich speichere Benutzerinformationen in 'NSUserDefaults'.Aber wie vermeidet man, dass das Telefon den APN (Bildschirmbenachrichtigung, Ausweis und Tonalarm) in 'didReceiveRemoteNotification' behandelt? Ich habe es in 'Anwendung (Anwendung: UIApplication, didReceiveRemoteNotification userInfo: [NSObjekt: AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void)' durch eine Bedingung auf die Benutzer-ID setzen: der Code, der den APN behandelt, ist nicht gut ausgeführt, aber im Hintergrund zeigt das Telefon immer noch die Benachrichtigung, ein Abzeichen und einen Alarm an. – Thomi

+0

Entschuldigung Ich habe verpasst, dass Sie scheinen, die Version mit fetchCompletionHandler bereits aufrufen, ich denke, vielleicht der Teil, den Sie vermissen, ist der Inhalt verfügbaren Schlüssel in der APN-Nutzlast. – nPn

+0

Nein meine Nutzlast enthält "content-available" auf 1 gesetzt: 'var note = new apn.Notification(); ... note.contentAvailable = 1; ' – Thomi

0

Für das oben genannte Problem zu lösen habe ich zwei Möglichkeiten 1.e Abmeldung den Token vom Server DB entfernt in Benutzer und jedes Mal protokollierte, wenn neue Benutzer in App Anfrage für neues Token anmelden werden und auf Server senden. 2. Beim Abmelden kann die App sich selbst aus dem Benachrichtigungscenter abmelden und bei der Login-App muss sie sich selbst registrieren und das Token auf dem Server aktualisieren.

Hier ist der Code für die Registrierung und die Aufhebung der Registrierung. Beim Abmelden: [[UIApplication sharedApplication] unregisterForRemoteNotifications];

Auf Login:

[[UIApplication shared] registerForRemoteNotificationTypes: (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];