也许这是提前的问题,但我想知道在iOS 10中可以用什么替代UILocalNotification
。我正在开发一个目标系统为iOS 8的应用程序,那么使用UILocalNotification
是否可以呢?
也许这是提前的问题,但我想知道在iOS 10中可以用什么替代UILocalNotification
。我正在开发一个目标系统为iOS 8的应用程序,那么使用UILocalNotification
是否可以呢?
是的,你可以使用 UILocalNotification
,旧的API在iOS 10上也可以正常工作,但最好改用User Notifications框架中的API。此外,还有一些新功能,只能在iOS 10 User Notifications框架中使用。
远程通知也是如此,更多信息请参见:这里。
新功能:
我们很容易将UILocalNotification
API转换为iOS 10 User Notifications 框架的API,它们非常相似。
我在这里编写了一个演示,展示如何同时使用新旧API:iOS 10适配技巧。
例如,
使用Swift实现:
import UserNotifications
/// Notification become independent from UIKit
import UserNotifications
请求本地通知的授权
let center = UNUserNotificationCenter.current()
center.requestAuthorization(options: [.alert, .sound]) { (granted, error) in
// Enable or disable features based on authorization.
}
安排本地通知
更新应用程序图标徽章数量
@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实现:
导入UserNotifications
// Notifications are independent from UIKit
#import <UserNotifications/UserNotifications.h>
请求本地通知的授权
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
[center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert)
completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (!error) {
NSLog(@"request authorization succeeded!");
[self showAlert];
}
}];
安排本地通知
更新应用程序图标徽章数字
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!");
}
}];
应用程序因未捕获的异常“NSInternalInconsistencyException”而终止,原因是“如果重复,则时间间隔必须至少为60”
let trigger = UNTimeIntervalNotificationTrigger.init(timeInterval: 60, repeats: true)
苹果又做到了,正确的实现方式是: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
}
import UserNotifications
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: - 用于推送通知的代理
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)
}
}
Objective-C中的iOS 10本地通知。
如果您已经编程一段时间,我相信您很熟悉UILocalNotification
类,现在随着iOS 10的到来,您会发现UILocalNotification
已被弃用。有关详细实现,请访问此博客文章。
UILocalNotification
(iOS 9)和UNNotificationRequest
(iOS 10)。使用以下代码来测试当前运行的iOS版本:if (floor(NSFoundationVersionNumber) >= NSFoundationVersionNumber10_0) { \\ 运行 iOS 10 代码 } else { // 运行 iOS 9 代码 }
- koen