2011-05-18 79 views

回答

50

在appdelegate.m文件写入applicationDidEnterBackground的follwing代码来获取本地通知

- (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

THX。帮助我:D – Vladimir 2014-04-28 07:01:54

+9

当您使用setScheduledLocalNotifications安排一个通知时:不必要。有一个 scheduleLocalNotification方法需要一个参数 - 要安排的通知。 https://developer.apple.com/library/ios/DOCUMENTATION/UIKit/Reference/UIApplication_Class/index.html#//apple_ref/occ/instm/UIApplication/scheduleLocalNotification: – 2014-09-25 15:28:31

72

这里是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];  
} 

上面的代码显示在按下绑定的按钮时按7秒的时间间隔后的AlertView 0如果应用程序在后台,则它会将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 
} 

雨燕文件(比如说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发行说明下方的屏幕抓取描述了这一点。

Screenshot

您可以参考apple reference document为UserNotification。

下面是本地通知代码:

目的-C:

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

  2. 的App-代表应符合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 fil e,利用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) 
    
+1

我是否需要将funcButtonIsPressed运行于按钮按下?如果我希望应用程序默认每周发送一次该通知,我应该将它添加到最初的VC的viewDidLoad中吗? – 2016-02-24 01:08:25

+1

另外,为什么你的AppDelegate.swift文件有两次didFinishLaunchingWithOptions? – 2016-02-24 10:32:49

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

1
- (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及更高版本,您的应用程序必须能够安排和目前UILocalNotifications之前使用-[UIApplication registerUserNotificationSettings:]用户注册通知,不要忘记这一点。

+0

- [UIApplication registerUserNotificationSettings:]将覆盖推送通知设置。所以请小心使用推送可执行通知。 – 2016-07-11 09:07:42

0

iOS 8用户及以上,请包括在应用程序委托,使其工作。

- (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]]; 

} 
1

创建本地通知是很容易的。只要按照这些步骤。

  1. On viewDidLoad()函数询问用户您的应用程序想要显示通知的权限。为此我们可以使用下面的代码。

    UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge], completionHandler: {didAllow, error in 
    }) 
    
  2. 然后你就可以创建一个按钮,然后在操作功能,你可以写下面的代码显示通知。

    //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

欲了解更多详情,请访问该博客文章代表:iOS Local Notification Tutorial

+0

是否有可能每天都用太平洋时间重复通知并重复,直到应用程序打开? – 2018-02-23 05:00:48

相关问题