29

所以我一直在尝试向新的 UNUserNotificationCenter 添加通知,但我似乎没有得到它。

我的视图控制器有一个动作:

@IBAction func sendPressed(_ sender: AnyObject) {
    let content = UNMutableNotificationContent()

    content.title = "Hello"
    content.body = "What up?"
    content.sound = UNNotificationSound.default()

    // Deliver the notification in five seconds.
    let trigger = UNTimeIntervalNotificationTrigger.init(timeInterval: 5, repeats: false)
    let request = UNNotificationRequest.init(identifier: "FiveSecond", content: content, trigger: trigger)

    // Schedule the notification.
    let center = UNUserNotificationCenter.current()
    center.add(request) { (error) in
        print(error)
    }
    print("should have been added")
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    let center = UNUserNotificationCenter.current()
    center.requestAuthorization([.alert, .sound]) { (granted, error) in
    }
}

而且我Notification Content Extension在项目中也有一个,但它似乎根本没有被触发,我缺少什么想法吗?我正在尝试用户文档中的示例,但它并没有告诉我更多信息,或者我错过了它。

这里:https ://developer.apple.com/reference/usernotifications/unmutablenotificationcontent

另外: https ://developer.apple.com/reference/usernotificationsui https://developer.apple.com/reference/usernotifications

编辑:

所以把应用程序放在后台就可以了。

4

5 回答 5

30

您需要注册通知...我试过了,这很有效。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.
        let center = UNUserNotificationCenter.current()
        center.requestAuthorization([.alert, .sound]) { (granted, error) in
            // Enable or disable features based on authorization.
        }
        return true
    }

编辑:从 iOS 10 开始,您无需将应用置于后台即可显示通知。

使用以下回调将通知配置为在前台显示。

func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void)

是一个示例项目。

于 2016-06-14T09:24:14.317 回答
17

使用 Objective-C 实现:

我在这里写了一个演示项目: iOS10AdaptationTips

  1. 导入用户通知

    ///Notification become independent from Foundation
    @import UserNotifications;
    
  2. 请求对 localNotification 的授权

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

    请求授权: 在此处输入图像描述

  3. 安排本地通知

  4. 更新应用程序图标徽章编号

        //        //Deliver the notification at 08:30 everyday
        //        NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
        //        dateComponents.hour = 8;
        //        dateComponents.minute = 30;
        //        UNCalendarNotificationTrigger *trigger = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:dateComponents repeats:YES];
    
        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 = @([[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!");
            }
        }];
    

那么它将如下所示:

在后台: 在此处输入图像描述 锁定屏幕:
在此处输入图像描述

在此处输入图像描述 如果在iOS9的锁屏上 Repeat默认只显示一个 而不是显示多个:在此处输入图像描述 并且还自动支持3D Touch 在此处输入图像描述

我在这里写了一个Demo: iOS10AdaptationTips

于 2016-06-15T09:06:15.487 回答
1

我解决了我的问题如下(Firebase,Swift 3):

在您的 AppDelegate 上找到此方法:

func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {

找到这一行:

completionHandler()

结束集:

completionHandler([.alert,.sound,.badge])

如果您没有将演示选项传递给 completionHandler 方法,则不会触发通知。

于 2016-12-24T10:21:57.603 回答
1

这里有几个步骤:

  1. 确保您有权限。如果没有,请使用UNUserNotificationCenter.current().requestAuthorization来获取。或者,如果您想多次显示请求弹出窗口,请按照答案。

  2. 如果要显示通知前景,则必须将UNUserNotificationCenterDelegate分配到某处。

  3. 给我看代码

    @IBAction func sendPressed(_ sender: AnyObject) {
        let content = UNMutableNotificationContent()
        content.title = "Hello"
        content.body = "What up?"
        content.sound = UNNotificationSound.default()
    
        let trigger = UNTimeIntervalNotificationTrigger.init(timeInterval: 5, repeats: false)
        let request = UNNotificationRequest.init(identifier: "FiveSecond", content: content, trigger: trigger)
    
        let center = UNUserNotificationCenter.current()
        center.add(request) { (error) in
            print(error)
        }
    }
    
    override func viewDidLoad(_ animated: Bool) {
        super.viewDidLoad(animated)
    
        // Assign the delegate
        UNUserNotificationCenter.current().delegate = self
    
        // Ask the permission
        let center = UNUserNotificationCenter.current()
        center.requestAuthorization([.alert, .sound]) { (granted, error) in
            if granted {
                // do something
            }
        }
    }
    // Remember to add UNUserNotificationCenterDelegate to your view controller
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        print("Got the msg...")
        completionHandler([.badge, .sound, .alert])
    }
    
于 2018-07-05T14:57:01.980 回答
0

我已经为 Swift 3 做了一个实现,这可能会有所帮助,你可以在这里查看:https ://stackoverflow.com/a/45381380/2296630

于 2017-07-30T16:52:52.683 回答