【问题标题】:How to create local notifications?如何创建本地通知?
【发布时间】:2011-05-18 15:20:43
【问题描述】:

如何设置本地通知,以便在我设置的时间,我的应用生成带有自定义消息的通知/警报?

【问题讨论】:

    标签: ios


    【解决方案1】:

    这是适用于我的项目的 LocalNotification 示例代码。

    目标-C:

    AppDelegate 文件中的此代码块:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
        {
            [launchOptions valueForKey:UIApplicationLaunchOptionsLocalNotificationKey];
            // Override point for customization after application launch.
            return YES;
        }
    
        // This code block is invoked when application is in foreground (active-mode) 
     -(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
    
            UIAlertView *notificationAlert = [[UIAlertView alloc] initWithTitle:@"Notification"    message:@"This local notification" 
            delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
    
            [notificationAlert show];
           // NSLog(@"didReceiveLocalNotification");
        }
    

    任何ViewController的.m文件中的此代码块:

    -(IBAction)startLocalNotification {  // Bind this method to UIButton action
        NSLog(@"startLocalNotification");
    
        UILocalNotification *notification = [[UILocalNotification alloc] init];
        notification.fireDate = [NSDate dateWithTimeIntervalSinceNow:7];
        notification.alertBody = @"This is local notification!";
        notification.timeZone = [NSTimeZone defaultTimeZone];
        notification.soundName = UILocalNotificationDefaultSoundName;
        notification.applicationIconBadgeNumber = 10;
    
        [[UIApplication sharedApplication] scheduleLocalNotification:notification];    
    }
    

    当按下绑定startLocalNotification 的按钮时,上面的代码会在7 秒的时间间隔后显示一个AlertView 如果应用程序在后台,那么它会将BadgeNumber 显示为10,并带有默认通知声音。

    此代码适用于 iOS 7.x 及以下版本,但对于 iOS 8,它将在控制台上提示以下错误

    尝试安排带有警报的本地通知,但尚未获得用户显示警报的权限

    这意味着您需要注册本地通知。这可以通过以下方式实现:

    if ([UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings:)]){
    
        [application registerUserNotificationSettings [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound categories:nil]];
    }
    

    您也可以参考blog 获取本地通知。

    斯威夫特:

    您的AppDelegate.swift 文件应如下所示:

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {    
        // Override point for customization after application launch.
        application.registerUserNotificationSettings(UIUserNotificationSettings(forTypes: UIUserNotificationType.Sound | UIUserNotificationType.Badge | UIUserNotificationType.Alert, categories: nil))
    
        return true
    }
    

    您要在其中创建本地通知的 swift 文件(例如 ViewController.swift)应包含以下代码:

    //MARK: - Button functions
    func buttonIsPressed(sender: UIButton) {
        println("buttonIsPressed function called \(UIButton.description())")
    
        var localNotification = UILocalNotification()
        localNotification.fireDate = NSDate(timeIntervalSinceNow: 3)
        localNotification.alertBody = "This is local notification from Swift 2.0"
        localNotification.timeZone = NSTimeZone.localTimeZone()
        localNotification.repeatInterval = NSCalendarUnit.CalendarUnitMinute
        localNotification.userInfo = ["Important":"Data"];
        localNotification.soundName = UILocalNotificationDefaultSoundName
        localNotification.applicationIconBadgeNumber = 5
        localNotification.category = "Message"
    
        UIApplication.sharedApplication().scheduleLocalNotification(localNotification)
    }
    
    
    //MARK: - viewDidLoad
    
    class ViewController: UIViewController {
    
        var objButton : UIButton!
        . . .
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            . . .
    
            objButton = UIButton.buttonWithType(.Custom) as? UIButton
            objButton.frame = CGRectMake(30, 100, 150, 40)
            objButton.setTitle("Click Me", forState: .Normal)
            objButton.setTitle("Button pressed", forState: .Highlighted)
    
            objButton.addTarget(self, action: "buttonIsPressed:", forControlEvents: .TouchDown)
    
            . . .
        }
    
        . . .
    }
    

    您在 iOS 9 及更低版本中使用本地通知的方式在 iOS 10 中完全不同。

    来自 Apple 发行说明的屏幕截图描述了这一点。

    您可以参考apple reference document 获取 UserNotification。

    以下是本地通知的代码:

    目标-C:

    1. App-delegate.h文件中使用@import UserNotifications;

    2. App-delegate 应符合UNUserNotificationCenterDelegate 协议

    3. didFinishLaunchingOptions 中使用以下代码:

      UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
      [center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert)
             completionHandler:^(BOOL granted, NSError * _Nullable error) {
                    if (!error) {
                        NSLog(@"request authorization succeeded!");
                        [self showAlert];
                    }
      }];
      
      -(void)showAlert {
          UIAlertController *objAlertController = [UIAlertController alertControllerWithTitle:@"Alert" message:@"show an alert!" preferredStyle:UIAlertControllerStyleAlert];
      
          UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"OK"
            style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {
              NSLog(@"Ok clicked!");
          }];
      
          [objAlertController addAction:cancelAction];
      
      
          [[[[[UIApplication sharedApplication] windows] objectAtIndex:0] rootViewController] presentViewController:objAlertController animated:YES completion:^{            
          }];
      
      }
      
    4. 现在在任何视图控制器中创建一个按钮,并在 IBAction 中使用以下代码:

      UNMutableNotificationContent *objNotificationContent = [[UNMutableNotificationContent alloc] init];
      
      objNotificationContent.title = [NSString localizedUserNotificationStringForKey:@“Notification!” arguments:nil];
      
      objNotificationContent.body = [NSString localizedUserNotificationStringForKey:@“This is local notification message!“arguments:nil];
      
      objNotificationContent.sound = [UNNotificationSound defaultSound];
      
      // 4. update application icon badge number
      objNotificationContent.badge = @([[UIApplication sharedApplication] applicationIconBadgeNumber] + 1);
      
      // Deliver the notification in five seconds.
      UNTimeIntervalNotificationTrigger *trigger =  [UNTimeIntervalNotificationTrigger                                             triggerWithTimeInterval:10.f repeats:NO];       
      
      UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:@“ten”                                                                            content:objNotificationContent trigger:trigger];
      
      // 3. schedule localNotification
      UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
      
      [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
          if (!error) {
              NSLog(@“Local Notification succeeded“);
          } else {
              NSLog(@“Local Notification failed“);
          }
      }];
      

    斯威夫特 3:

    1. AppDelegate.swift 文件中使用import UserNotifications
    2. Appdelegate 应符合UNUserNotificationCenterDelegate 协议
    3. didFinishLaunchingWithOptions 使用下面的代码

      // Override point for customization after application launch.
      let center = UNUserNotificationCenter.current()
      center.requestAuthorization(options: [.alert, .sound]) { (granted, error) in
          // Enable or disable features based on authorization.
          if error != nil {
              print("Request authorization failed!")
          } else {
              print("Request authorization succeeded!")
              self.showAlert()
          }
      }
      
      
      func showAlert() {
          let objAlert = UIAlertController(title: "Alert", message: "Request authorization succeeded", preferredStyle: UIAlertControllerStyle.alert)
      
          objAlert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil))
          //self.presentViewController(objAlert, animated: true, completion: nil)
      
          UIApplication.shared().keyWindow?.rootViewController?.present(objAlert, animated: true, completion: nil)
      }
      
    4. 现在在任何视图控制器中创建一个按钮,并在 IBAction 中使用以下代码:

      let content = UNMutableNotificationContent()
      content.title = NSString.localizedUserNotificationString(forKey: "Hello!", arguments: nil)
      content.body = NSString.localizedUserNotificationString(forKey: "Hello_message_body", arguments: nil)
      content.sound = UNNotificationSound.default()
      content.categoryIdentifier = "notify-test"
      
      let trigger = UNTimeIntervalNotificationTrigger.init(timeInterval: 5, repeats: false)
      let request = UNNotificationRequest.init(identifier: "notify-test", content: content, trigger: trigger)
      
      let center = UNUserNotificationCenter.current()
      center.add(request)
      

    【讨论】:

    • 我是否需要在按下按钮时运行 funcButtonIsPressed?如果我希望应用程序默认每周发出通知,我应该将其添加到初始 VC 的 viewDidLoad 中吗?
    • 另外,为什么你的 AppDelegate.swift 文件有两次 didFinishLaunchingWithOptions?
    • "import UserNotifications" 在你的 ViewController 中导入这个
    • 很好的例子。请注意,AppDelegate 没有必要遵守UNUserNotificationCenterDelegate,除非您希望它执行一些通知逻辑。此外,根据需要,可以在应用委托之外完成请求授权或发送本地通知。
    【解决方案2】:

    在 appdelegate.m 文件中,在 applicationDidEnterBackground 中写入以下代码以获取本地通知

    - (void)applicationDidEnterBackground:(UIApplication *)application
    {
       UILocalNotification *notification = [[UILocalNotification alloc]init];
       notification.repeatInterval = NSDayCalendarUnit;
       [notification setAlertBody:@"Hello world"];
       [notification setFireDate:[NSDate dateWithTimeIntervalSinceNow:1]];
       [notification setTimeZone:[NSTimeZone  defaultTimeZone]];
       [application setScheduledLocalNotifications:[NSArray arrayWithObject:notification]];
    }
    

    【讨论】:

    【解决方案3】:

    创建本地通知非常简单。只需按照以下步骤操作。

    1. 在 viewDidLoad() 函数中,请求用户允许您的应用显示通知。为此,我们可以使用以下代码。

      UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge], completionHandler: {didAllow, error in
      })
      
    2. 然后你可以创建一个按钮,然后在action函数中你可以编写如下代码来显示一个通知。

      //creating the notification content
      let content = UNMutableNotificationContent()
      
      //adding title, subtitle, body and badge
      content.title = "Hey this is Simplified iOS"
      content.subtitle = "iOS Development is fun"
      content.body = "We are learning about iOS Local Notification"
      content.badge = 1
      
      //getting the notification trigger
      //it will be called after 5 seconds
      let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false)
      
      //getting the notification request
      let request = UNNotificationRequest(identifier: "SimplifiedIOSNotification", content: content, trigger: trigger)
      
      //adding the notification to notification center
      UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)
      
    3. 会显示通知,点击通知按钮后点击主页按钮。当应用程序处于前台时,不会显示通知。但是,如果您使用的是 iPhone X。即使应用程序在前台,您也可以显示通知。为此,您只需添加一个名为 UNUserNotificationCenterDelegate

    4. 的委托

    有关更多详细信息,请访问此博客文章:iOS Local Notification Tutorial

    【讨论】:

      【解决方案4】:

      使用 Swift 5 更新 通常我们使用三种类型的本地通知

      1. 简单的本地通知
      2. 带有操作的本地通知
      3. 带有内容的本地通知

      您可以在其中发送简单的文本通知或操作按钮和附件。

      在您的应用中使用 UserNotifications 包,以下示例 请求通知权限,根据用户操作 AppDelegate 本身准备和发送通知,并使用视图控制器列出不同类型的本地通知测试。

      AppDelegate

      import UIKit
      import UserNotifications
      
      @UIApplicationMain
      class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {
      
          let notificationCenter = UNUserNotificationCenter.current()
          var window: UIWindow?
      
      
          func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
      
              //Confirm Delegete and request for permission
              notificationCenter.delegate = self
              let options: UNAuthorizationOptions = [.alert, .sound, .badge]
              notificationCenter.requestAuthorization(options: options) {
                  (didAllow, error) in
                  if !didAllow {
                      print("User has declined notifications")
                  }
              }
      
              return true
          }
      
          func applicationWillResignActive(_ application: UIApplication) {
          }
          func applicationDidEnterBackground(_ application: UIApplication) {
          }
          func applicationWillEnterForeground(_ application: UIApplication) {
          }
          func applicationWillTerminate(_ application: UIApplication) {
          }
          func applicationDidBecomeActive(_ application: UIApplication) {
              UIApplication.shared.applicationIconBadgeNumber = 0
          }
      
      
          //MARK: Local Notification Methods Starts here
      
          //Prepare New Notificaion with deatils and trigger
          func scheduleNotification(notificationType: String) {
      
              //Compose New Notificaion
              let content = UNMutableNotificationContent()
              let categoryIdentifire = "Delete Notification Type"
              content.sound = UNNotificationSound.default
              content.body = "This is example how to send " + notificationType
              content.badge = 1
              content.categoryIdentifier = categoryIdentifire
      
              //Add attachment for Notification with more content
              if (notificationType == "Local Notification with Content")
              {
                  let imageName = "Apple"
                  guard let imageURL = Bundle.main.url(forResource: imageName, withExtension: "png") else { return }
                  let attachment = try! UNNotificationAttachment(identifier: imageName, url: imageURL, options: .none)
                  content.attachments = [attachment]
              }
      
              let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false)
              let identifier = "Local Notification"
              let request = UNNotificationRequest(identifier: identifier, content: content, trigger: trigger)
      
              notificationCenter.add(request) { (error) in
                  if let error = error {
                      print("Error \(error.localizedDescription)")
                  }
              }
      
              //Add Action button the Notification
              if (notificationType == "Local Notification with Action")
              {
                  let snoozeAction = UNNotificationAction(identifier: "Snooze", title: "Snooze", options: [])
                  let deleteAction = UNNotificationAction(identifier: "DeleteAction", title: "Delete", options: [.destructive])
                  let category = UNNotificationCategory(identifier: categoryIdentifire,
                                                        actions: [snoozeAction, deleteAction],
                                                        intentIdentifiers: [],
                                                        options: [])
                  notificationCenter.setNotificationCategories([category])
              }
          }
      
          //Handle Notification Center Delegate methods
          func userNotificationCenter(_ center: UNUserNotificationCenter,
                                      willPresent notification: UNNotification,
                                      withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
              completionHandler([.alert, .sound])
          }
      
          func userNotificationCenter(_ center: UNUserNotificationCenter,
                                      didReceive response: UNNotificationResponse,
                                      withCompletionHandler completionHandler: @escaping () -> Void) {
              if response.notification.request.identifier == "Local Notification" {
                  print("Handling notifications with the Local Notification Identifier")
              }
              completionHandler()
          }
      }
      

      ViewController

      import UIKit
      
      class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
      
          var appDelegate = UIApplication.shared.delegate as? AppDelegate
          let notifications = ["Simple Local Notification",
                               "Local Notification with Action",
                               "Local Notification with Content",]
      
          override func viewDidLoad() {
              super.viewDidLoad()
          }
      
          // MARK: - Table view data source
      
           func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
              return notifications.count
          }
      
           func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
              let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
              cell.textLabel?.text = notifications[indexPath.row]
              return cell
          }
      
           func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
              let notificationType = notifications[indexPath.row]
              let alert = UIAlertController(title: "",
                                            message: "After 5 seconds " + notificationType + " will appear",
                                            preferredStyle: .alert)
              let okAction = UIAlertAction(title: "Okay, I will wait", style: .default) { (action) in
                  self.appDelegate?.scheduleNotification(notificationType: notificationType)
              }
              alert.addAction(okAction)
              present(alert, animated: true, completion: nil)
          }
      }
      

      【讨论】:

      • 令人印象深刻!好教程
      【解决方案5】:
      - (void)applicationDidEnterBackground:(UIApplication *)application
      {
         UILocalNotification *notification = [[UILocalNotification alloc]init];
         notification.repeatInterval = NSDayCalendarUnit;
         [notification setAlertBody:@"Hello world"];
         [notification setFireDate:[NSDate dateWithTimeIntervalSinceNow:1]];
         [notification setTimeZone:[NSTimeZone  defaultTimeZone]];
         [application setScheduledLocalNotifications:[NSArray arrayWithObject:notification]];
      }
      

      这是可行的,但在 iOS 8.0 及更高版本中,您的应用程序必须使用 -[UIApplication registerUserNotificationSettings:] 注册用户通知,然后才能安排和呈现 UILocalNotifications,不要忘记这一点。

      【讨论】:

      • -[UIApplication registerUserNotificationSettings:] 将覆盖推送通知设置。所以如果使用推送可操作通知请小心。
      【解决方案6】:

      iOS 8 及以上用户,请在 App delegate 中包含此功能以使其正常工作。

      - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
      {
          if ([UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings:)])
          {
              [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound categories:nil]];
          }
      
          return YES;
      }
      

      然后添加这行代码会有所帮助,

      - (void)applicationDidEnterBackground:(UIApplication *)application
      {
          UILocalNotification *notification = [[UILocalNotification alloc]init];
          notification.repeatInterval = NSDayCalendarUnit;
          [notification setAlertBody:@"Hello world"];
          [notification setFireDate:[NSDate dateWithTimeIntervalSinceNow:1]];
          [notification setTimeZone:[NSTimeZone  defaultTimeZone]];
          [application setScheduledLocalNotifications:[NSArray arrayWithObject:notification]];
      
      }
      

      【讨论】:

        【解决方案7】:
        -(void)kundanselect
        {
            NSMutableArray *allControllers = [[NSMutableArray alloc] initWithArray:self.navigationController.viewControllers];
            NSArray *allControllersCopy = [allControllers copy];
            if ([[allControllersCopy lastObject] isKindOfClass: [kundanViewController class]]) 
            {
                [[NSNotificationCenter defaultCenter]postNotificationName:@"kundanViewControllerHide"object:nil userInfo:nil];
            }
            else
            {
                [[NSUserDefaults standardUserDefaults] setInteger:4 forKey:@"selected"];
                [self performSegueWithIdentifier:@"kundansegue" sender:self];
            }
        }
        

        [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(ApparelsViewControllerHide) name:@"ApparelsViewControllerHide" object:nil];

        【讨论】:

          【解决方案8】:

          我假设您已请求授权并注册您的应用以获取通知。

          这是创建本地通知的代码

          @available(iOS 10.0, *)
              func send_Noti()
              {
                  //Create content for your notification 
                  let content = UNMutableNotificationContent()
                  content.title = "Test"
                  content.body = "This is to test triggering of notification"
          
                  //Use it to define trigger condition
                  var date = DateComponents()
                  date.calendar = Calendar.current
                  date.weekday = 5 //5 means Friday
                  date.hour = 14 //Hour of the day
                  date.minute = 10 //Minute at which it should be sent
          
          
                  let trigger = UNCalendarNotificationTrigger(dateMatching: date, repeats: true)
                  let uuid = UUID().uuidString
                  let req = UNNotificationRequest(identifier: uuid, content: content, trigger: trigger)
          
                  let notificationCenter = UNUserNotificationCenter.current()
                  notificationCenter.add(req) { (error) in
                      print(error)
                  }
              }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-09-25
            • 2020-02-13
            • 2015-05-27
            • 2014-01-14
            • 2016-06-04
            • 2017-08-19
            • 2022-01-03
            相关资源
            最近更新 更多