iOS
UILocalNotification
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"):
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
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:
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:
- Nu kan du antingen presentera varning, ljud eller öka märket medan appen också är i förgrunden med iOS 10
- 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.
- Stöd 3D-touch istället för glidande gest.
- Nu kan du ta bort specifika lokala meddelanden bara med en radkod.
- 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:
- importera UserNotifications
/// Notification become independent from UIKit
import UserNotifications
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. }
schema localNotification
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:
- importera UserNotifications
// Notifications are independent from UIKit
#import <UserNotifications/UserNotifications.h>
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]; } }];
schema localNotification
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)