wake-up-neo.com

Push-Benachrichtigungen werden unter iOS 10 nicht empfangen, funktionieren jedoch unter iOS 9 und früher

Ich habe mehrere Apps, die in Swift 2.2 geschrieben wurden, mit Xcode 7.3 kompiliert wurden und live im App Store sind. Die Apps verwenden Push Notifications und funktionieren einwandfrei in iOS 9.3 und früher.

Auf Geräten, die auf iOS 10 aktualisiert wurden, erhalten meine Apps jedoch keine Push-Benachrichtigungen. Geräte, auf denen noch iOS 9 ausgeführt wird, erhalten weiterhin Benachrichtigungen.

In der Annahme, dass es sich um ein Zertifikat- oder Berechtigungsproblem handeln könnte, habe ich Folgendes versucht: Eine meiner Apps wurde auf Swift 2.3) aktualisiert, die APS-Umgebungsberechtigung wurde hinzugefügt und in Xcode 8 kompiliert, dies machte jedoch keinen Unterschied .

In meinem AppDelegate habe ich noch die vorhandenen Methoden zum Registrieren für Push-Benachrichtigungen, die Folgendes umfassen:

let notificationSettings = UIUserNotificationSettings(forTypes: [.Badge, .Sound, .Alert], categories:nil)
application.registerUserNotificationSettings(notificationSettings)

Diese Registrierung scheint auch unter iOS 10 erfolgreich zu sein, da die Anwendung didRegisterForRemoteNotificationsWithDeviceToken aufgerufen wird und ich ein Token von APNS erhalte.

Das Problem ist, dass beim Senden einer Push-Benachrichtigung an dieses Gerät die Anwendung didReceiveRemoteNotification nie aufgerufen wird.

Nun, hier es wird gesagt, dass die Methoden von UIApplicationDelegate unter iOS 10 veraltet sind und ich userNotificationCenter implementieren sollte (: didReceive: withCompletionHandler :) und userNotificationCenter (: willPresent: withCompletionHandler :)

Das Problem ist, dass ich nicht NUR iOS 10 anvisiere. Ich brauche die App immer noch, um mit iOS 8 und 9 zu arbeiten. Ich bezweifle daher, dass dies der richtige Ansatz ist, um diese Methoden zu implementieren.

Wie erhalte ich Push-Benachrichtigungen für eine vorhandene App, um auf Geräten weiterarbeiten zu können, die auf iOS 10 aktualisiert wurden? Muss ich Code umschreiben? Muss ich nur einige Zertifikate oder Berechtigungen aktualisieren und in Xcode 8 mit einigen "neuen" Einstellungen neu kompilieren?

30
Stanley

Ok, ich habe es herausgefunden. Ich habe jetzt meine ursprünglichen Push Notifications, die unter iOS 9 funktionierten, unter iOS 10 mit Xcode 8 und Swift 2.3.

Ich habe dies implementiert, indem ich die folgenden Änderungen an meinem AppDelegate vorgenommen habe:

1) In meinen Projekteinstellungen scrolle ich auf der Registerkarte "Funktionen" nach unten zu "Push-Benachrichtigungen" und schalte sie auf "EIN". Dadurch wird automatisch eine Berechtigungsdatei generiert, die den Schlüssel "APS Environment" und den Wert "development" enthält.

2) In AppDelegate.Swift nehme ich mehrere Codeänderungen vor. Zunächst importiere ich das UserNotifications-Framework:

import UserNotifications

Dann muss AppDelegate das UNUserNotificationCenterDelegate-Protokoll implementieren:

class AppDelegate: /*Some other protocols I am extending...*/, UNUserNotificationCenterDelegate {

Dann füge ich die folgende Methode hinzu:

func registerForPushNotifications(application: UIApplication) {

    if #available(iOS 10.0, *){
        UNUserNotificationCenter.currentNotificationCenter().delegate = self
        UNUserNotificationCenter.currentNotificationCenter().requestAuthorizationWithOptions([.Badge, .Sound, .Alert], completionHandler: {(granted, error) in
            if (granted)
            {
                UIApplication.sharedApplication().registerForRemoteNotifications()
            }
            else{
                //Do stuff if unsuccessful...
            }
        })
    }

    else{ //If user is not on iOS 10 use the old methods we've been using
        let notificationSettings = UIUserNotificationSettings(
            forTypes: [.Badge, .Sound, .Alert], categories: nil)
        application.registerUserNotificationSettings(notificationSettings)

    }

}

Dann rufe ich diese neu erstellte Funktion in didFinishLaunchingWithOptions auf:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
...
    registerForPushNotifications(application)
...
}

Ich lasse meine didRegisterForRemoteNotificationsWithDeviceToken-Methode unverändert:

func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
    //Implement this. Do something with the token I receive. Send it to my Push notification server to register the device or something else I'd like to do with the token.
 }

Jetzt implementiere ich zwei neue Methoden für iOS 10, um Push-Benachrichtigungen zu erhalten:

@available(iOS 10.0, *)
func userNotificationCenter(center: UNUserNotificationCenter, willPresentNotification notification: UNNotification, withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void) {
    //Handle the notification
}

@available(iOS 10.0, *)
func userNotificationCenter(center: UNUserNotificationCenter, didReceiveNotificationResponse response: UNNotificationResponse, withCompletionHandler completionHandler: () -> Void) {
    //Handle the notification
}

Ich habe keine der Methoden entfernt, die ich zuvor für Push-Benachrichtigungen in iOS 9 implementiert habe.

52
Stanley

IOS 10 hat ein anderes Benachrichtigungskit.

import UserNotifications

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {



    if #available(iOS 10.0, *) {
        let center = UNUserNotificationCenter.current()
        center.requestAuthorization(options: [.badge, .alert , .sound]) { (granted, error) in
            if granted {
                UIApplication.shared.registerForRemoteNotifications()
            }
        }
    } else {
        let type: UIUserNotificationType = [UIUserNotificationType.badge, UIUserNotificationType.alert, UIUserNotificationType.sound]
        let setting = UIUserNotificationSettings(types: type, categories: nil)
        UIApplication.shared.registerUserNotificationSettings(setting)
        UIApplication.shared.registerForRemoteNotifications()
    }
}



func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data){
    let token = String(format: "%@", deviceToken as CVarArg)
}
9
ilan

Ich habe dieses Problem mit folgendem Schritt behoben:

Schritt 1: Gehen Sie zu Projekt -> Ziel -> Funktionen -> Push-Benachrichtigungen -> Schalten Sie es ein

enter image description here Schritt 2: Beheben Sie das Problem mit dem richtigen Zertifikat und dem richtigen Bereitstellungsprofil

Schritt 3: Xcode beenden, bereinigen und ausführen

8
Dheeraj D

In verschiedenen SO Antworten auf Fragen zu iOS 9 vs iOS 10 Push-Benachrichtigungen habe ich die folgenden Tests ausprobiert:

1) Aktualisieren Sie die Benachrichtigungsaufrufe, um speziell das UNUserNotificationCenter für iOS 10-Geräte zu verwenden

2) Aktualisieren Sie die Push-Funktion, damit die Berechtigungsdatei aktualisiert wird

Ich kann bestätigen, dass durch Ausführen von Nummer 2 und Beibehalten des gleichen vorhandenen iOS 9-Push-Codes grundlegende Push-Benachrichtigungen auf den iOS 10-Geräten eingehen können

2
kevinl

Als meine App von IOS 9 nach IOS 10 verschoben wurde, wurden die stillen Push-Benachrichtigungen, die von meinem auf Heroku gehosteten Parse-Server gesendet wurden, von der App nicht mehr empfangen.

Die einzige Änderung, die ich vorgenommen habe, um Benachrichtigungen wieder funktionsfähig zu machen, bestand darin, das Javascript auf meinem Server so zu ändern, dass das Argument für content-available eine Ganzzahl 1 und keine Zeichenfolge "1" war.

           Parse.Push.send({
                where: notifyDeletedRequestsQuery,
                data: {
                    'content-available': 1,
                    refresh: constants.requestsClassName
                    }
            }, { useMasterKey: true });

Beachten Sie außerdem, dass nicht alle verfügbaren Inhalte in derselben Push-Benachrichtigung enthalten sind wie Abzeichen, Ton oder Warnung.

0
BrianM