Sök…


Introduktion

Lokala aviseringar gör att din app kan meddela användaren om innehåll som inte kräver användning av en server.

Till skillnad från fjärrmeddelanden som utlöses från en server, är lokala aviseringar schemalagda och utlösta i en app. Meddelanden i allmänhet är inriktade på att öka användarens interaktion med appen, och bjuder in eller frestar användaren att öppna och interagera med den.

UILocalNotification avskrivs i iOS 10. Använd istället användarnotifieringsramen.

Anmärkningar

Förväxla inte UILocalNotification med push-aviseringar. UILocalNotification utlöses av din enhet och kopieras till systemet när den schemaläggs.

länkar:

Schemalägga en lokal avisering

Se till att du registrerar dig för lokala aviseringar för att detta ska fungera:

Snabb

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

Objective-C

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

Om du ^⌘H se meddelandet i iOS Simulator skriver du ^⌘H (control-command-H) för att gå hem och skriver sedan ⌘L (command-L) för att låsa enheten. Vänta några sekunder, så ska meddelandet visas (detta utseende kan variera beroende på anmälningstyp diskuterad i "Registrera för lokala aviseringar"):

Lokal meddelandebanner

Svep på meddelandet för att komma tillbaka till appen (notera att om du ringde detta i den första visningskontrollerns viewDidLoad , viewWillAppear , viewDidAppear osv. viewDidAppear meddelandet att planeras igen).

Registrering för lokala aviseringar

iOS 8

För att kunna presentera lokala aviseringar för användaren måste du registrera din app på enheten:

Snabb

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

Objective-C

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

Detta visar en varning första gången det kallas:

Registrera dig för lokala aviseringar

Oavsett vad användaren väljer kommer inte varningen att visas igen och ändringar måste initieras av användaren i Inställningar.

Svar på mottagen lokal meddelande

VIKTIGT: Denna delegerade metod kallas endast i förgrunden.

Snabb

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

Objective-C

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

Denna metod åsidosätts generellt i AppDelegate, som överensstämmer med UIApplicationDelegate-protokollet.

Hantera lokala aviseringar med UUID

Ofta behöver du kunna hantera dina aviseringar genom att kunna hålla reda på dem och avbryta dem.

Spåra ett meddelande

Du kan tilldela en UUID (universellt unik identifierare) till en avisering, så att du kan spåra den:

Snabb

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

Objective-C

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

Avbryt en avisering

För att avbryta ett meddelande får vi först en lista över alla aviseringar och sedan hittar du den med en matchande UUID. Slutligen avbryter vi det.

Snabb

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

Objective-C

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

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

Du skulle förmodligen vilja lagra alla dessa UUID: er i Core Data eller Realm.

Presentera en lokal avisering omedelbart

Om du vill visa lokalt meddelande omedelbart ska du ringa:

Snabb 3

UIApplication.shared.presentLocalNotificationNow(notification)

Snabb 2

UIApplication.sharedApplication().presentLocalNotificationNow(notification)

Objective-C

[[UIApplication sharedApplication] presentLocalNotificationNow:notification];

En fördel med att använda detta är så att du inte behöver ställa in fireDate och timeZone egenskaperna för ditt UILocalNotification objekt.

Notifikations ljud

Anpassade ljud kan tillhandahållas för aviseringar som genereras av din app. När systemet visar en varning för en lokal avisering eller märker en appikon, spelar den upp detta ljud (så länge användaren inte har inaktiverat aviseringsljud).

Standardvärdet är noll vilket betyder att inget ljud spelas för din avisering.

Om du .caf leverera ett anpassat ljud lägger du till en .caf , .wav eller .aiff fil i din appbunt. Ljud som varar längre än 30 sekunder stöds inte. Om du tillhandahåller ett ljud som inte uppfyller dessa krav kommer standardljudet att spela ( UILocalNotificationDefaultSoundName ).

Objective-C

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

Snabb

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

Registrera och schemalägga lokal avisering i Swift 3.0 (iOS 10)

Registrering

i AppDelegate

import UserNotifications

i didFinishLaunchingWithOptions- metoden,

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

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

}

Skapa och schemalägga meddelande.

    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)

Varhelst denna del av koden utlöses, om du har tillåtit meddelandetillstånd, får du ett meddelande.

För att testa det ordentligt, se till att din ansökan är i bakgrundsläge.

vad som är nytt i UILocalNotification med iOS10

Du kan använda UILocalNotification , gamla API: er fungerar också bra med iOS10, men vi skulle bättre använda API: erna i ramarna för användaraviseringar istället. Det finns också några nya funktioner, du kan bara använda med iOS10 User Notification framework.

Detta händer också med fjärrmeddelande, för mer information: Här .

Nya egenskaper:

  1. Nu kan du antingen presentera varning, ljud eller öka märket medan appen också är i förgrunden med iOS 10
  2. Nu kan du hantera alla händelser på ett ställe när användaren tryckte på (eller skjutit) actionknappen, även om appen redan har dödats.
  3. Stöd 3D-touch istället för glidande gest.
  4. Nu kan du ta bort specifika lokala meddelanden bara med en radkod.
  5. Stöd rik meddelanden med anpassat användargränssnitt.

Det är verkligen lätt för oss att konvertera UILocalNotification API: er till UILocalNotification API: s användaraviseringar, de är verkligen lika.

Jag skriver en demo här för att visa hur man använder nya och gamla API: er samtidigt: iOS10AdaptationTips .

Till exempel,

Med Swift-implementering:

  1. importera UserNotifications
    ///    Notification become independent from UIKit
    import UserNotifications
  1. begära godkännande för localNotification

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

  2. uppdatera applikationsikonens märknummer

    @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"])
    }
    

Mål-C-implementering:

  1. importera UserNotifications
    // Notifications are independent from UIKit
    #import <UserNotifications/UserNotifications.h>
  1. begära godkännande för localNotification

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

  2. uppdatera applikationsikonens märknummer

    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!");
        }
    }];
    

Gå till här för mer information: iOS10AdaptationTips .

#updated

Avslutande av app på grund av okänt undantag 'NSInternalInconsistencyException', orsak: 'tidsintervall måste vara minst 60 om det upprepas'

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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow