web-dev-qa-db-de.com

So richten Sie Push-Benachrichtigungen in Swift ein

Ich versuche, ein Push-Benachrichtigungssystem für meine Anwendung einzurichten. Ich habe eine Server- und eine Entwicklerlizenz, um den Push-Benachrichtigungsdienst einzurichten. 

Ich betreibe derzeit meine App in Swift. Ich möchte die Benachrichtigungen von meinem Server aus der Ferne versenden können. Wie kann ich das machen?

44
BlakeH

Die Antwort ist zwar gut für die Push-Benachrichtigung gegeben, aber ich glaube trotzdem, dass ich den integrierten vollständigen Fall auf einmal teilen möchte, um es einfacher zu machen:

So registrieren Sie die Anwendung für APNS (Fügen Sie den folgenden Code in die Methode didFinishLaunchingWithOptions in AppDelegate.Swift ein.) 

IOS 9

var settings : UIUserNotificationSettings = UIUserNotificationSettings(forTypes:UIUserNotificationType.Alert|UIUserNotificationType.Sound, categories: nil)
UIApplication.sharedApplication().registerUserNotificationSettings(settings)
UIApplication.sharedApplication().registerForRemoteNotifications()

Nach IOS 10

Eingeführtes UserNotifications Framework:

Importieren Sie das UserNotifications-Framework und fügen Sie in AppDelegate.Swift das UNUserNotificationCenterDelegate hinzu

So registrieren Sie die Anwendung für APNS

let center = UNUserNotificationCenter.current()
center.requestAuthorization(options:[.badge, .alert, .sound]) { (granted, error) in
        // Enable or disable features based on authorization.
}
application.registerForRemoteNotifications()

Dies wird folgende Delegatmethode aufrufen

func application(application: UIApplication,didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
//send this device token to server
}

//Called if unable to register for APNS.
func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) {

println(error)

}

Bei Erhalt einer Benachrichtigung wird der folgende Delegierte anrufen:

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {

    println("Recived: \(userInfo)")
   //Parsing userinfo:
   var temp : NSDictionary = userInfo
   if let info = userInfo["aps"] as? Dictionary<String, AnyObject> 
            {
                var alertMsg = info["alert"] as! String
                var alert: UIAlertView!
                alert = UIAlertView(title: "", message: alertMsg, delegate: nil, cancelButtonTitle: "OK")
                alert.show()
            }
}

Um die erteilte Erlaubnis zu identifizieren, können wir verwenden:

UNUserNotificationCenter.current().getNotificationSettings(){ (setttings) in

        switch setttings.soundSetting{
        case .enabled:
            print("enabled sound")

        case .disabled:
            print("not allowed notifications")

        case .notSupported:
            print("something went wrong here")
        }
    }

Also die Checkliste von APNS:

  1. Erstellen Sie eine AppId, die mit der Push-Benachrichtigung zulässig ist
  2. Erstellen Sie ein SSL-Zertifikat mit einem gültigen Zertifikat und einer App-ID
  3. Erstellen Sie ein Bereitstellungsprofil mit demselben Zertifikat, und stellen Sie sicher, dass Sie im Falle von Sandboxen ein Gerät hinzufügen (Entwicklungsbereitstellung) Hinweis: Dies ist gut, wenn Sie nach dem SSL-Zertifikat ein Bereitstellungsprofil erstellen erstellen.

Mit Code:

  1. App für Push-Benachrichtigung registrieren
  2. Behandelte didRegisterForRemoteNotificationsWithDeviceToken-Methode
  3. Legen Sie Ziele> Fähigkeit> Hintergrundmodi> Remote-Benachrichtigung fest
  4. Behandeln Sie didReceiveRemoteNotification
35
Arvind

Swift 2:

let settings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil)
UIApplication.sharedApplication().registerUserNotificationSettings(settings)
UIApplication.sharedApplication().registerForRemoteNotifications()
74
Adam Waite

Um sich für den Erhalt von Push-Benachrichtigungen über den Apple Push Service zu registrieren, müssen Sie eine registerForRemoteNotifications()-Methode von UIApplication aufrufen.

Wenn die Registrierung erfolgreich ist, ruft die App die application:didRegisterForRemoteNotificationsWithDeviceToken:-Methode Ihres App-Delegatenobjekts auf und übergibt ein Gerätetoken. 

Sie sollten dieses Token an den Server weitergeben, den Sie zum Generieren von Push-Benachrichtigungen für das Gerät verwenden. Wenn die Registrierung fehlschlägt, ruft die App stattdessen die application:didFailToRegisterForRemoteNotificationsWithError:-Methode ihrer App-Delegierten auf.

Schauen Sie sich die Programmieranleitung für Local und Push Notification an.

34
RaffAl

registerForRemoteNotification() wurde von ios8 entfernt.

Sie sollten also UIUserNotification verwenden.

CODE-BEISPIEL:

var type = UIUserNotificationType.Badge | UIUserNotificationType.Alert | UIUserNotificationType.Sound;
var setting = UIUserNotificationSettings(forTypes: type, categories: nil);
UIApplication.sharedApplication().registerUserNotificationSettings(setting);
UIApplication.sharedApplication().registerForRemoteNotifications();

Hoffe, das wird dir helfen.

26
Dog Su

Um ios 8 und zuvor zu unterstützen, verwenden Sie Folgendes: 

// Register for Push Notitications, if running iOS 8
if application.respondsToSelector("registerUserNotificationSettings:") {

  let types:UIUserNotificationType = (.Alert | .Badge | .Sound)
  let settings:UIUserNotificationSettings = UIUserNotificationSettings(forTypes: types, categories: nil)

  application.registerUserNotificationSettings(settings)
  application.registerForRemoteNotifications()

} else {      
  // Register for Push Notifications before iOS 8
  application.registerForRemoteNotificationTypes(.Alert | .Badge | .Sound)
}
15
Gmeister4

Schnell 4

Ich denke, das ist der korrekte Weg für das Setup in iOS 8 und darüber.

Aktivieren Sie Push Notifications in der Registerkarte Capabilities enter image description here

UserNotifications importieren

import UserNotifications

didFinishLaunchingWithOptions ändern

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


    if let notification = launchOptions?[.remoteNotification] as? [String: AnyObject] {

        // If your app wasn’t running and the user launches it by tapping the Push notification, the Push notification is passed to your app in the launchOptions

        let aps = notification["aps"] as! [String: AnyObject]
        UIApplication.shared.applicationIconBadgeNumber = 0
    }

    registerForPushNotifications()

    return true
}

Es ist äußerst wichtig, bei jedem Start der App registerUserNotificationSettings(_:) aufzurufen. Dies liegt daran, dass der Benutzer jederzeit in die Einstellungen-App gehen und die Benachrichtigungsberechtigungen ändern kann. Mit application(_:didRegisterUserNotificationSettings:) erhalten Sie immer die Berechtigungen, die der Benutzer derzeit für Ihre App erteilt hat.

Kopieren Sie diese Erweiterung AppDelegate

// Push Notificaion
extension AppDelegate {
func registerForPushNotifications() {
    if #available(iOS 10.0, *) {
        UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) {
            [weak self] (granted, error) in
            print("Permission granted: \(granted)")

            guard granted else {
                print("Please enable \"Notifications\" from App Settings.")
                self?.showPermissionAlert()
                return
            }

            self?.getNotificationSettings()
        }
    } else {
        let settings = UIUserNotificationSettings(types: [.alert, .sound, .badge], categories: nil)
        UIApplication.shared.registerUserNotificationSettings(settings)
        UIApplication.shared.registerForRemoteNotifications()
    }
}

@available(iOS 10.0, *)
func getNotificationSettings() {

    UNUserNotificationCenter.current().getNotificationSettings { (settings) in
        print("Notification settings: \(settings)")
        guard settings.authorizationStatus == .authorized else { return }
        DispatchQueue.main.async {
            UIApplication.shared.registerForRemoteNotifications()
        }
    }
}

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {

    let tokenParts = deviceToken.map { data -> String in
        return String(format: "%02.2hhx", data)
    }

    let token = tokenParts.joined()
    print("Device Token: \(token)")
    //UserDefaults.standard.set(token, forKey: DEVICE_TOKEN)
}

func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
    print("Failed to register: \(error)")
}

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) {

    // If your app was running and in the foreground
    // Or
    // If your app was running or suspended in the background and the user brings it to the foreground by tapping the Push notification

    print("didReceiveRemoteNotification /(userInfo)")

    guard let dict = userInfo["aps"]  as? [String: Any], let msg = dict ["alert"] as? String else {
        print("Notification Parsing Error")
        return
    }
}

func showPermissionAlert() {
    let alert = UIAlertController(title: "WARNING", message: "Please enable access to Notifications in the Settings app.", preferredStyle: .alert)

    let settingsAction = UIAlertAction(title: "Settings", style: .default) {[weak self] (alertAction) in
        self?.gotoAppSettings()
    }

    let cancelAction = UIAlertAction(title: "Cancel", style: .default, handler: nil)

    alert.addAction(settingsAction)
    alert.addAction(cancelAction)

    DispatchQueue.main.async {
        self.window?.rootViewController?.present(alert, animated: true, completion: nil)
    }
}

private func gotoAppSettings() {

    guard let settingsUrl = URL(string: UIApplicationOpenSettingsURLString) else {
        return
    }

    if UIApplication.shared.canOpenURL(settingsUrl) {
        UIApplication.shared.openURL(settingsUrl)
    }
}
}

Check out: Tutorial für Push-Benachrichtigungen: Erste Schritte

11

Danke für die früheren Antworten. Xcode hat einige Änderungen vorgenommen. Hier ist der Swift 2-Code, der die Codeüberprüfung von XCode 7 durchläuft und sowohl iOS 7 als auch höher unterstützt: 

    if #available(iOS 8.0, *) {
        let settings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil)
        UIApplication.sharedApplication().registerUserNotificationSettings(settings)
        UIApplication.sharedApplication().registerForRemoteNotifications()
    } else {
        let settings = UIRemoteNotificationType.Alert.union(UIRemoteNotificationType.Badge).union(UIRemoteNotificationType.Sound)
        UIApplication.sharedApplication().registerForRemoteNotificationTypes(settings)
    }
8
Oliver Zhang

Swift 4

Importieren Sie das UserNotifications-Framework und fügen Sie in AppDelegate das UNUserNotificationCenterDelegate hinzu

import UserNotifications

class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate

So registrieren Sie die Anwendung für APNS (Fügen Sie den folgenden Code in die Methode didFinishLaunchingWithOptions in AppDelegate.Swift ein.)

let center = UNUserNotificationCenter.current()
    center.requestAuthorization(options:[.badge, .alert, .sound]) { (granted, error) in
        // Enable or disable features based on authorization.
    }
    application.registerForRemoteNotifications()

Dies wird folgende Delegatmethode aufrufen

func application(_ application: UIApplication,didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    //send this device token to server

}

//Called if unable to register for APNS.
func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
    print(error)
}

Bei Erhalt einer Benachrichtigung wird der folgende Delegierte anrufen:

private func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {

    print("Recived: \(userInfo)")
    //Parsing userinfo:

}
1
jojo

Swift 3:

let center = UNUserNotificationCenter.current()
center.requestAuthorization(options:[.badge, .alert, .sound]) { (granted, error) in
        // Enable or disable features based on authorization.
    }
UIApplication.shared.registerForRemoteNotifications()

Stellen Sie sicher, dass Sie UserNotifications oben in Ihrem View-Controller importieren.

import UserNotifications
1
Henry

Ich benutze diesen Code-Ausschnitt in AppDelegate.Swift:

let pushType = UIUserNotificationType.alert.union(.badge).union(.sound)
let pushSettings = UIUserNotificationSettings(types: pushType
            , categories: nil)

application.registerUserNotificationSettings(pushSettings)
application.registerForRemoteNotifications()
0
ZYiOS

Sie können eine Benachrichtigung mit dem folgenden Code-Snippet senden: 

let settings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil)
if(UIApplication.sharedApplication().currentUserNotificationSettings() == settings ){
//OK
}else{
//KO
}