Buscar..


Introducción

Las notificaciones locales permiten que su aplicación notifique al usuario sobre el contenido que no requiere el uso de un servidor.

A diferencia de las notificaciones remotas que se activan desde un servidor, las notificaciones locales se programan y activan dentro de una aplicación. Las notificaciones en general están dirigidas a aumentar la interacción del usuario con la aplicación, invitando o tentando al usuario a abrir e interactuar con ella.

UILocalNotification estaba en desuso en iOS 10. En su lugar, use el marco UserNotifications.

Observaciones

No confunda UILocalNotification con notificaciones push. Su dispositivo desencadena UILocalNotification y, cuando está programado, se copia en el sistema.

Campo de golf:

Programación de una notificación local.

Asegúrate de ver Registro para notificaciones locales para que esto funcione:

Rápido

let notification = UILocalNotification()
notification.alertBody = "Hello, local notifications!"
notification.fireDate = NSDate().dateByAddingTimeInterval(10) // 10 seconds after now
UIApplication.sharedApplication().scheduleLocalNotification(notification)

C objetivo

UILocalNotification *notification = [[UILocalNotification alloc] init];
notification.alertBody = @"Hello, local notifications!";
notification.fireDate = [NSDate dateWithTimeIntervalSinceNow:10]; // 10 seconds after now
[[UIApplication sharedApplication] scheduleLocalNotification:notification];

Para ver la notificación en el simulador de iOS, escriba ^⌘H (control-command-H) para ir a casa y luego escriba ⌘L (command-L) para bloquear el dispositivo. Espere unos segundos, y la notificación debería aparecer (esta apariencia variará según el tipo de notificación que se describe en "Registro para notificaciones locales"):

Banner de notificación local

Deslice el dedo en la notificación para volver a la aplicación (tenga en cuenta que si lo llamó en la primera vista del controlador viewDidLoad , viewWillAppear , viewDidAppear , etc., la notificación se programará nuevamente).

Registro para notificaciones locales

iOS 8

Para presentar notificaciones locales al usuario, debe registrar su aplicación en el dispositivo:

Rápido

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

C objetivo

UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert) categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];

Esto presentará una alerta la primera vez que se llame:

Registrarse para recibir notificaciones de alerta local.

Independientemente de lo que elija el usuario, la alerta no volverá a aparecer y los cambios deberán ser iniciados por el usuario en Configuración.

Respondiendo a la notificación local recibida

IMPORTANTE: este método de delegado solo se llama en primer plano.

Rápido

func application(application: UIApplication, didReceiveLocalNotification notification: UILocalNotification) {
    
}

C objetivo

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
    
}

Este método generalmente se reemplaza en AppDelegate, que cumple con el protocolo UIApplicationDelegate.

Gestionando notificaciones locales utilizando UUID

Muchas veces tendrá que ser capaz de administrar sus notificaciones, al poder realizar un seguimiento de ellos y cancelarlos.

Rastrear una notificación

Puede asignar un UUID (identificador único universal) a una notificación, por lo que puede rastrearlo:

Rápido

let notification = UILocalNotification()
let uuid = NSUUID().uuidString
notification.userInfo = ["UUID": uuid]
UIApplication.shared.scheduleLocalNotification(notification)

C objetivo

UILocalNotification *notification = [[UILocalNotification alloc] init];
NSString *uuid = [[NSUUID UUID] UUIDString];
notification.userInfo = @{ @"UUID": uuid };
[[UIApplication sharedApplication] scheduleLocalNotification:notification];

Cancelar una notificación

Para cancelar una notificación, primero obtenemos una lista de todas las notificaciones y luego encontramos la que tiene un UUID correspondiente. Finalmente, lo cancelamos.

Rápido

let scheduledNotifications = UIApplication.shared.scheduledLocalNotifications

guard let scheduledNotifications = scheduledNotifications else {
    return
}

for notification in scheduledNotifications where "\(notification.userInfo!["UUID"]!)" == UUID_TO_CANCEL {
    UIApplication.sharedApplication().cancelLocalNotification(notification)
}

C objetivo

NSArray *scheduledNotifications = [[UIApplication sharedApplication] scheduledLocalNotifications];

for (UILocalNotification *notification in scheduledNotifications) {
    if ([[notification.userInfo objectForKey:"UUID"] compare: UUID_TO_CANCEL]) {
        [[UIApplication sharedApplication] cancelLocalNotification:notification];
        break;
    }
}

Probablemente querrá almacenar todos estos UUID en Core Data o Realm.

Presentando una notificación local de inmediato.

Si desea mostrar una notificación local de inmediato, debe llamar a:

Swift 3

UIApplication.shared.presentLocalNotificationNow(notification)

Swift 2

UIApplication.sharedApplication().presentLocalNotificationNow(notification)

C objetivo

[[UIApplication sharedApplication] presentLocalNotificationNow:notification];

Una ventaja de usar esto es que no tendrá que configurar las propiedades fireDate y timeZone de su objeto UILocalNotification .

Sonido de notificación

Se pueden proporcionar sonidos personalizados para las notificaciones generadas por su aplicación. Cuando el sistema muestra una alerta para una notificación local o asigna un icono a una aplicación, reproduce este sonido (siempre que el usuario no haya desactivado los sonidos de notificación).

El valor predeterminado es nil, lo que significa que no se reproduce ningún sonido para su notificación.

Para proporcionar un sonido personalizado, agregue un .caf , .wav o .aiff a su paquete de aplicaciones. No se admiten los sonidos que duran más de 30 segundos. El suministro de un sonido que no cumpla con esos requisitos hará que se reproduzca el sonido predeterminado ( UILocalNotificationDefaultSoundName ).

C objetivo

UILocalNotification *notification = [UILocalNotification new];
notification.soundName = @"nameOfSoundInBundle.wav"; // Use UILocalNotificationDefaultSoundName for the default alert sound

Rápido

let notification = UILocalNotification()
notification.soundName = "nameOfSoundInBundle.wav"

Regístrese y programe notificaciones locales en Swift 3.0 (iOS 10)

Registro

en AppDelegate

import UserNotifications

en el método didFinishLaunchingWithOptions ,

UNUserNotificationCenter.current().requestAuthorization(options: [.alert,.sound,.badge]) { (granted, error) in

// Here you can check Request is Granted or not.

}

Crear y programar la notificación.

    let content = UNMutableNotificationContent()
    content.title = "10 Second Notification Demo"
    content.subtitle = "From Wolverine"
    content.body = "Notification after 10 seconds - Your pizza is Ready!!"
    content.categoryIdentifier = "myNotificationCategory"

    let trigger = UNTimeIntervalNotificationTrigger(
        timeInterval: 10.0,
        repeats: false)
    
    let request = UNNotificationRequest(
        identifier: "10.second.message",
        content: content,
        trigger: trigger
    )
    UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)

Donde sea que se active esta parte del código, si ha permitido el Permiso de Notificación, recibirá una notificación.

Para probarlo correctamente, asegúrese de que su aplicación en modo de fondo.

Novedades en UILocalNotification con iOS10

Puede usar UILocalNotification , las API antiguas también funcionan bien con iOS10, pero es mejor que utilicemos las API en el marco de notificaciones de usuarios. También hay algunas características nuevas que solo puede usar con el marco de notificaciones de usuario de iOS10.

Esto también le sucede a la Notificación Remota, para más información: Aquí .

Nuevas características:

  1. Ahora puede presentar un distintivo de alerta, sonido o aumento mientras la aplicación también está en primer plano con iOS 10
  2. Ahora puede manejar todos los eventos en un solo lugar cuando el usuario pulsó (o deslizó) el botón de acción, incluso cuando la aplicación ya se ha eliminado.
  3. Soporta toque 3D en lugar de gesto deslizante.
  4. Ahora puede eliminar notificaciones locales específicas solo por un código de fila.
  5. Admite notificaciones enriquecidas con una interfaz de usuario personalizada.

Es realmente fácil para nosotros convertir UILocalNotification API de UILocalNotification en las API del marco de notificaciones de usuario de iOS10, son realmente similares.

Escribo una demostración aquí para mostrar cómo usar las API nuevas y antiguas al mismo tiempo: iOS10AdaptationTips .

Por ejemplo,

Con la implementación Swift:

  1. importar notificaciones de usuarios
    ///    Notification become independent from UIKit
    import UserNotifications
  1. autorización de solicitud para la notificación local

        let center = UNUserNotificationCenter.current()
        center.requestAuthorization(options: [.alert, .sound]) { (granted, error) in
            // Enable or disable features based on authorization.
        }
    
  1. horario localNotificación

  2. icono de la aplicación de actualización número de placa

    @IBAction  func triggerNotification(){
        let content = UNMutableNotificationContent()
        content.title = NSString.localizedUserNotificationString(forKey: "Elon said:", arguments: nil)
        content.body = NSString.localizedUserNotificationString(forKey: "Hello Tom!Get up, let's play with Jerry!", arguments: nil)
        content.sound = UNNotificationSound.default()
        content.badge = UIApplication.shared().applicationIconBadgeNumber + 1;
        content.categoryIdentifier = "com.elonchan.localNotification"
        // Deliver the notification in five seconds.
        let trigger = UNTimeIntervalNotificationTrigger.init(timeInterval: 60.0, repeats: true)
        let request = UNNotificationRequest.init(identifier: "FiveSecond", content: content, trigger: trigger)
    
        // Schedule the notification.
        let center = UNUserNotificationCenter.current()
        center.add(request)
    }
    
    @IBAction func stopNotification(_ sender: AnyObject) {
        let center = UNUserNotificationCenter.current()
        center.removeAllPendingNotificationRequests()
        // or you can remove specifical notification:
        // center.removePendingNotificationRequests(withIdentifiers: ["FiveSecond"])
    }
    

Implementación de Objective-C:

  1. importar notificaciones de usuarios
    // Notifications are independent from UIKit
    #import <UserNotifications/UserNotifications.h>
  1. autorización de solicitud para la notificación local

    UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    [center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert)
                          completionHandler:^(BOOL granted, NSError * _Nullable error) {
                              if (!error) {
                                  NSLog(@"request authorization succeeded!");
                                  [self showAlert];
                              }
                          }];
    
  1. horario localNotificación

  2. icono de la aplicación de actualización número de placa

    UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
    content.title = [NSString localizedUserNotificationStringForKey:@"Elon said:"
                                                        arguments:nil];
    content.body = [NSString localizedUserNotificationStringForKey:@"Hello Tom!Get up, let's play with Jerry!"
                                                       arguments:nil];
    content.sound = [UNNotificationSound defaultSound];
    
    // 4. update application icon badge number
    content.badge = [NSNumber numberWithInteger:([UIApplication sharedApplication].applicationIconBadgeNumber + 1)];
    // Deliver the notification in five seconds.
    UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger
                                                triggerWithTimeInterval:5.f
                                                repeats:NO];
    UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:@"FiveSecond"
                                                                        content:content
                                                                        trigger:trigger];
    /// 3. schedule localNotification
    UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
        if (!error) {
            NSLog(@"add NotificationRequest succeeded!");
        }
    }];
    

Vaya a aquí para obtener más información: iOS10AdaptationTips .

#actualizado

Aplicación de terminación debido a la excepción no detectada 'NSInternalInconsistencyException', razón: 'el intervalo de tiempo debe ser de al menos 60 si se repite'

let trigger = UNTimeIntervalNotificationTrigger.init(timeInterval: 60, repeats: true)


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow