iOS
UILocalNotification
Szukaj…
Wprowadzenie
Lokalne powiadomienia pozwalają Twojej aplikacji powiadamiać użytkownika o treściach, które nie wymagają użycia serwera.
W przeciwieństwie do zdalnych powiadomień uruchamianych z serwera powiadomienia lokalne są planowane i uruchamiane w aplikacji. Powiadomienia są generalnie ukierunkowane na zwiększenie interakcji użytkownika z aplikacją, zachęcając lub kusząc użytkownika do otwarcia i interakcji z aplikacją.
UILocalNotification jest przestarzałe w iOS 10. Zamiast tego użyj struktury UserNotifications.
Uwagi
Nie należy mylić UILocalNotification z powiadomieniami push. UILocalNotification jest uruchamiane przez twoje urządzenie, a po zaplanowaniu jest kopiowane do systemu.
Spinki do mankietów:
Planowanie lokalnego powiadomienia
Upewnij się, że widzisz Rejestracja lokalnych powiadomień , aby to zadziałało:
Szybki
let notification = UILocalNotification()
notification.alertBody = "Hello, local notifications!"
notification.fireDate = NSDate().dateByAddingTimeInterval(10) // 10 seconds after now
UIApplication.sharedApplication().scheduleLocalNotification(notification)
Cel C
UILocalNotification *notification = [[UILocalNotification alloc] init];
notification.alertBody = @"Hello, local notifications!";
notification.fireDate = [NSDate dateWithTimeIntervalSinceNow:10]; // 10 seconds after now
[[UIApplication sharedApplication] scheduleLocalNotification:notification];
Aby zobaczyć powiadomienie w Symulatorze iOS, wpisz ^⌘H
(control-Command-H), aby wrócić do domu, a następnie wpisz ⌘L
(Command-L), aby zablokować urządzenie. Poczekaj kilka sekund, a pojawi się powiadomienie (ten wygląd będzie się różnić w zależności od typu powiadomienia omówionego w „Rejestrowaniu powiadomień lokalnych”):
Swipe w sprawie zgłaszania wrócić do aplikacji (Zauważ, że jeśli to się nazywa pierwszego kontrolera widoku za viewDidLoad
, viewWillAppear
, viewDidAppear
itp, zgłoszenie zostanie ponownie zaplanowane).
Rejestracja lokalnych powiadomień
Aby przedstawić użytkownikowi lokalne powiadomienia, musisz zarejestrować swoją aplikację na urządzeniu:
Szybki
let settings = UIUserNotificationSettings(forTypes: [.Badge, .Sound, .Alert], categories: nil)
UIApplication.sharedApplication().registerUserNotificationSettings(settings)
Cel C
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert) categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
Spowoduje to wyświetlenie alertu przy pierwszym wywołaniu:
Niezależnie od tego, co wybierze użytkownik, alert nie pojawi się ponownie, a zmiany będą musiały zostać zainicjowane przez użytkownika w Ustawieniach.
W odpowiedzi na otrzymane lokalne powiadomienie
WAŻNE: Ta metoda delegowania jest wywoływana tylko na pierwszym planie.
Szybki
func application(application: UIApplication, didReceiveLocalNotification notification: UILocalNotification) {
}
Cel C
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
}
Ta metoda jest zasadniczo nadpisywana w AppDelegate, która jest zgodna z protokołem UIApplicationDelegate.
Zarządzanie lokalnymi powiadomieniami za pomocą UUID
Często trzeba będzie móc zarządzać powiadomieniami, śledząc je i anulując.
Śledź powiadomienie
Możesz przypisać UUID (uniwersalnie unikalny identyfikator) do powiadomienia, abyś mógł go śledzić:
Szybki
let notification = UILocalNotification()
let uuid = NSUUID().uuidString
notification.userInfo = ["UUID": uuid]
UIApplication.shared.scheduleLocalNotification(notification)
Cel C
UILocalNotification *notification = [[UILocalNotification alloc] init];
NSString *uuid = [[NSUUID UUID] UUIDString];
notification.userInfo = @{ @"UUID": uuid };
[[UIApplication sharedApplication] scheduleLocalNotification:notification];
Anuluj powiadomienie
Aby anulować powiadomienie, najpierw otrzymujemy listę wszystkich powiadomień, a następnie znajdujemy to z pasującym UUID. Wreszcie anulujemy to.
Szybki
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)
}
Cel 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;
}
}
Prawdopodobnie zechcesz przechowywać wszystkie te UUID w Core Data lub Realm.
Natychmiastowe przedstawienie lokalnego powiadomienia
Jeśli chcesz natychmiast wyświetlić lokalne powiadomienie, zadzwoń:
Szybki 3
UIApplication.shared.presentLocalNotificationNow(notification)
Swift 2
UIApplication.sharedApplication().presentLocalNotificationNow(notification)
Cel C
[[UIApplication sharedApplication] presentLocalNotificationNow:notification];
Zaletą korzystania z tego jest taki, że nie będzie musiał ustawić fireDate
i timeZone
właściwości swojej UILocalNotification
obiektu.
Dźwięk powiadomienia
Do powiadomień generowanych przez aplikację mogą być dostarczane niestandardowe dźwięki. Gdy system wyświetla ostrzeżenie o lokalnym powiadomieniu lub rozpoznaje ikonę aplikacji, odtwarza ten dźwięk (o ile użytkownik nie wyłączył dźwięków powiadomień).
Wartość domyślna to zero, co oznacza, że w powiadomieniu nie odtwarzany jest żaden dźwięk.
Aby dostarczyć niestandardowy dźwięk, dodaj do pakietu aplikacji plik .caf
, .wav
lub .aiff
. Dźwięki trwające dłużej niż 30 sekund nie są obsługiwane. Dostarczenie dźwięku niespełniającego tych wymagań spowoduje odtwarzanie dźwięku domyślnego ( UILocalNotificationDefaultSoundName
).
Cel C
UILocalNotification *notification = [UILocalNotification new];
notification.soundName = @"nameOfSoundInBundle.wav"; // Use UILocalNotificationDefaultSoundName for the default alert sound
Szybki
let notification = UILocalNotification()
notification.soundName = "nameOfSoundInBundle.wav"
Zarejestruj się i zaplanuj lokalne powiadomienia w Swift 3.0 (iOS 10)
Rejestracja
w AppDelegate
import UserNotifications
w metodzie didFinishLaunchingWithOptions
UNUserNotificationCenter.current().requestAuthorization(options: [.alert,.sound,.badge]) { (granted, error) in
// Here you can check Request is Granted or not.
}
Utwórz i zaplanuj powiadomienie.
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)
Gdziekolwiek ta część kodu zostanie uruchomiona, jeśli zezwoliłeś na Powiadomienie, otrzymasz powiadomienie.
Aby przetestować go poprawnie, upewnij się, że aplikacja działa w trybie tła.
co nowego w UILocalNotification z iOS10
Możesz użyć UILocalNotification
, stare interfejsy API również działają dobrze z iOS10, ale zamiast tego lepiej było używać interfejsów API w ramach powiadomień użytkowników. Istnieją również nowe funkcje, z których można korzystać tylko w systemie powiadomień użytkowników iOS10.
Dzieje się tak również ze zdalnym powiadomieniem, aby uzyskać więcej informacji: tutaj .
Nowe funkcje:
- Teraz możesz wyświetlać alert, dźwięk lub zwiększyć odznakę, gdy aplikacja jest na pierwszym planie, także w systemie iOS 10
- Teraz możesz obsłużyć wszystkie zdarzenia w jednym miejscu, gdy użytkownik stuknie (lub przesunie) przycisk akcji, nawet gdy aplikacja została już zabita.
- Obsługuje dotyk 3D zamiast przesuwanego gestu.
- Teraz możesz usunąć określone lokalne powiadomienie tylko za pomocą jednego kodu wiersza.
- Obsługuje zaawansowane powiadomienia z niestandardowym interfejsem użytkownika.
To jest naprawdę łatwe dla nas, aby przekształcić UILocalNotification
API do iOS10 użytkownika API Powiadomienia ramowych, są bardzo podobne.
Piszę tutaj Demo, aby pokazać, jak korzystać z nowych i starych interfejsów API jednocześnie: iOS10AdaptationTips .
Na przykład,
Dzięki implementacji Swift:
- import UserNotifications
/// Notification become independent from UIKit
import UserNotifications
zażądać autoryzacji dla localNotification
let center = UNUserNotificationCenter.current() center.requestAuthorization(options: [.alert, .sound]) { (granted, error) in // Enable or disable features based on authorization. }
harmonogram lokalnych powiadomień
zaktualizuj numer identyfikacyjny ikony aplikacji
@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"]) }
Realizacja celu C:
- import UserNotifications
// Notifications are independent from UIKit
#import <UserNotifications/UserNotifications.h>
zażądać autoryzacji dla localNotification
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; [center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert) completionHandler:^(BOOL granted, NSError * _Nullable error) { if (!error) { NSLog(@"request authorization succeeded!"); [self showAlert]; } }];
harmonogram lokalnych powiadomień
zaktualizuj numer identyfikacyjny ikony aplikacji
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!"); } }];
Przejdź tutaj, aby uzyskać więcej informacji: iOS10AdaptationTips .
#aktualizowane
Zamykanie aplikacji z powodu nieprzechwyconego wyjątku „NSInternalInconsistencyException”, powód: „odstęp czasu musi wynosić co najmniej 60, jeśli powtarza się”
let trigger = UNTimeIntervalNotificationTrigger.init(timeInterval: 60, repeats: true)