It may be a question in advance but I wonder what to use instead of UILocalNotification
in iOS 10. I am working on an app which has deployment target iOS 8 so will it be ok to use UILocalNotification
?
4 Answers
Yes, you can use UILocalNotification
, old APIs also works fine with iOS 10, but we had better use the APIs in the User Notifications framework instead. There are also some new features, you can only use with iOS 10 User Notifications framework.
This also happens to Remote Notification, for more information: Here.
New Features:
- Now you can either present alert, sound or increase badge while the app is in foreground too with iOS 10
- Now you can handle all event in one place when user tapped (or slided) the action button, even while the app has already been killed.
- Support 3D touch instead of sliding gesture.
- Now you can remove specific local notifications with just one line of code.
- Support Rich Notification with custom UI.
It is really easy for us to convert UILocalNotification
APIs to iOS 10
User Notifications framework APIs, they are really similar.
I wrote a demo here to show how to use new and old APIs at the same time: iOS 10 Adaptation Tips .
For example,
With Swift implementation:
import UserNotifications
/// Notification become independent from UIKit import UserNotifications
request authorization for localNotification
let center = UNUserNotificationCenter.current() center.requestAuthorization(options: [.alert, .sound]) { (granted, error) in // Enable or disable features based on authorization. }
schedule localNotification
update application icon badge number
@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 60 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"]) }
Objective-C implementation:
import UserNotifications
// Notifications are independent from UIKit #import <UserNotifications/UserNotifications.h>
request authorization for localNotification
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; [center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert) completionHandler:^(BOOL granted, NSError * _Nullable error) { if (!error) { NSLog(@"request authorization succeeded!"); [self showAlert]; } }];
schedule localNotification
update application icon badge number
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!"); } }];
updated
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'time interval must be at least 60 if repeating'
let trigger = UNTimeIntervalNotificationTrigger.init(timeInterval: 60, repeats: true)

- 1
- 1

- 8,543
- 9
- 56
- 84
-
You are missing argument name in "center.requestAuthorization([.alert, .sound])", it should be " center.requestAuthorization(options: [.alert, .sound])" – MQoder Sep 20 '16 at 09:52
-
I have this set up in my app exactly as written above. The notification only appeared one time. I ran it again with a different notification and now I dont receive any notifications. Any ideas? – Nate4436271 Oct 19 '16 at 18:37
-
didReceiveLocalNotification has stopped working for me in iOS 10.0 and 10.1 GA. Anyone have it working without migrating to the new notification framework? – Billy Oct 31 '16 at 21:51
-
thanks, but what if you want to support iOS 9 devices as well? – Zennichimaro Jan 20 '17 at 02:18
-
2@Zennichimaro: you can implement both `UILocalNotification` (iOS 9) and `UNNotificationRequest` (iOS 10) in your code. Use this to test which iOS is running: `if (floor(NSFoundationVersionNumber) >= NSFoundationVersionNumber10_0) { \\ run iOS 10 code } else { // run iOS 9 code }` – koen Jan 22 '17 at 15:57
-
Has any tried to get Notifications working in MacOS apps? – Dominique Dec 31 '20 at 14:27
Apple have done it again, the correct implementation is: AppDelegate.swift
if #available(iOS 10.0, *) {
let center = UNUserNotificationCenter.currentNotificationCenter()
center.requestAuthorizationWithOptions([.Alert, .Sound]) { (granted, error) in
// Enable or disable features based on authorization.
}
} else {
// Fallback on earlier versions
}
and don't forget to add
import UserNotifications

- 1,250
- 18
- 15
swift 4
if #available(iOS 10.0, *) {
let center = UNUserNotificationCenter.current()
center.requestAuthorization(options: [.alert, .badge, .sound]) { (granted, error) in
// Enable or disable features based on authorization.
}
} else {
// REGISTER FOR PUSH NOTIFICATIONS
let notifTypes:UIUserNotificationType = [.alert, .badge, .sound]
let settings = UIUserNotificationSettings(types: notifTypes, categories: nil)
application.registerUserNotificationSettings(settings)
application.registerForRemoteNotifications()
application.applicationIconBadgeNumber = 0
}
MARK: - DELEGATES FOR PUSH NOTIFICATIONS
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
let installation = PFInstallation.current()
installation?.setDeviceTokenFrom(deviceToken)
installation?.saveInBackground(block: { (succ, error) in
if error == nil {
print("DEVICE TOKEN REGISTERED!")
} else {
print("\(error!.localizedDescription)")
}
})
}
func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
print("application:didFailToRegisterForRemoteNotificationsWithError: %@", error)
}
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any]) {
print("\(userInfo)")
// PFPush.handle(userInfo)
if application.applicationState == .inactive {
PFAnalytics.trackAppOpenedWithRemoteNotificationPayload(inBackground: userInfo, block: nil)
}
}

- 1,206
- 1
- 12
- 18
Local Notifications for iOS 10 in Objective-C.
If you have been programming for a while I am sure you are familiar with the UILocalNotification
class, and right now with the arrival of iOS 10 you can see that UILocalNotification
has been deprecated. For a detailed implementation visit this blog post.

- 9,289
- 12
- 69
- 108

- 4,137
- 2
- 20
- 17