ios - notificaciones push swift 4




Cómo configurar notificaciones push en Swift (7)

Estoy tratando de configurar un sistema de notificación push para mi aplicación. Tengo un servidor y una licencia de desarrollador para configurar el servicio de notificación push.

Actualmente estoy ejecutando mi aplicación en Swift. Me gustaría poder enviar las notificaciones de forma remota desde mi servidor. ¿Cómo puedo hacer esto?


Swift 4

Creo que esta es la forma correcta de configurar en iOS 8 y superior .

Active Push Notifications en la pestaña Capabilities

Importar UserNotifications

import UserNotifications

Modificar didFinishLaunchingWithOptions

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 extremadamente importante llamar a registerUserNotificationSettings(_:) cada vez que se inicia la aplicación. Esto se debe a que el usuario puede, en cualquier momento, acceder a la aplicación Configuración y cambiar los permisos de notificación. application(_:didRegisterUserNotificationSettings:) siempre le proporcionará los permisos que el usuario ha permitido actualmente para su aplicación.

Copie y pegue esta extensión de 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)
    }
}
}

Consulte: Tutorial de Notificaciones Push: Primeros pasos


Gracias por las respuestas anteriores. Xcode ha realizado algunos cambios y aquí está el código de SWIFT 2 que pasa la comprobación de código de XCode 7 y es compatible con iOS 7 y versiones posteriores:

    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)
    }

Para registrarse y recibir notificaciones push a través del Servicio Push de Apple, debe llamar al método registerForRemoteNotifications() de UIApplication .

Si el registro tiene éxito, la aplicación llama a la aplicación del objeto delegado de su application:didRegisterForRemoteNotificationsWithDeviceToken: método application:didRegisterForRemoteNotificationsWithDeviceToken: y le pasa un token del dispositivo.

Debe pasar este token al servidor que usa para generar notificaciones automáticas para el dispositivo. Si el registro falla, la aplicación llama a la aplicación del delegado de su application:didFailToRegisterForRemoteNotificationsWithError: método application:didFailToRegisterForRemoteNotificationsWithError: lugar.

Eche un vistazo a la Guía de programación local y de notificación de inserción .


Puede enviar notificaciones utilizando el siguiente fragmento de código:

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

Utilizo este recorte de código en AppDelegate.swift:

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

application.registerUserNotificationSettings(pushSettings)
application.registerForRemoteNotifications()

registerForRemoteNotification() se ha eliminado de ios8.

Entonces deberías usar UIUserNotification

EJEMPLO DE CÓDIGO:

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

Espero que esto te ayudará.


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()

Asegúrese de importar UserNotifications en la parte superior de su controlador de vista.

import UserNotifications






apple-push-notifications