首页 文章

如何在iOS中创建本地通知?

提问于
浏览
97

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

6 回答

  • 87

    以下是适用于我的项目的LocalNotification的示例代码 .

    Objective-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];    
    }
    

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

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

    尝试使用警报安排本地通知,但尚未收到用户显示警报的权限

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

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

    您也可以参考blog进行本地通知 .

    Swift:

    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)
    
            . . .
        }
    
        . . .
    }
    

    The way you use to work with Local Notification in iOS 9 and below is completely different in iOS 10.

    苹果发布说明下面的屏幕抓取描述了这一点 .

    Screenshot

    您可以参考apple reference document进行UserNotification .

    以下是本地通知的代码:

    Objective-C:

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

    • App-delegate应符合 UNUserNotificationCenterDelegate 协议

    • 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:^{            
        }];
    
    }
    
    • 现在在任何视图控制器中创建一个按钮,在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“);
        }
    }];
    

    Swift 3:

    • AppDelegate.swift 文件中使用 import UserNotifications

    • Appdelegate应符合 UNUserNotificationCenterDelegate 协议

    • 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)
    }
    
    • 现在在任何视图控制器中创建一个按钮,在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)
    
  • 51

    在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]];
    }
    
  • 1

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

    • 在viewDidLoad()函数中,询问用户是否允许您的应用显示通知 . 为此,我们可以使用以下代码 .
    UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge], completionHandler: {didAllow, error in
    })
    
    • 然后您可以创建一个按钮,然后在操作功能中,您可以编写以下代码来显示通知 .
    //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)
    
    • 将显示通知,点击通知按钮后点击主页按钮 . 当应用程序处于前台时,不会显示通知 . 但是,如果您使用的是iPhone X.即使应用程序位于前台,您也可以显示通知 . 为此你只需要添加一个名为 UNUserNotificationCenterDelegate 的委托

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

  • 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]];
    }
    

    这是有效的,您的应用程序必须使用 -[UIApplication registerUserNotificationSettings:] 注册用户通知才能安排和呈现UILocalNotifications,不要忘记这一点 .

  • 0

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

    - (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]];
    
    }
    
  • 0
    -(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];

相关问题