如何在 iOS 10 (objective-c) 中安排本地通知

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/39941778/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-03 21:38:57  来源:igfitidea点击:

How to schedule a local notification in iOS 10 (objective-c)

objective-cios10usernotifications

提问by Developer

I'd like to schedule local notifications using iOS 10. I'd like to know how to do this. I've looked all around the web, but I keep finding clues only for registering and handeling the notifications. Not for the scheduling of a local notification.

我想使用 iOS 10 安排本地通知。我想知道如何执行此操作。我已经环顾了整个网络,但我一直在寻找仅用于注册和处理通知的线索。不适用于本地通知的调度。

So, does anyone know how to do this?

那么,有谁知道如何做到这一点?

回答by Jamshed Alam

  1. Try it. Its deprecated but working code. Use it for Before iOS 10.0 :

    //Get all previous noti..
     NSLog(@"scheduled notifications: --%@----", [[UIApplication sharedApplication] scheduledLocalNotifications]);
    
     NSDate *now = [NSDate date];
     now = [now dateByAddingTimeInterval:60*60*24*7]; //7 for 7th day of the week.
     NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    
    [calendar setTimeZone:[NSTimeZone localTimeZone]];
     NSDateComponents *components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit|NSHourCalendarUnit|NSMinuteCalendarUnit|NSSecondCalendarUnit|NSTimeZoneCalendarUnit fromDate:now];
    
    
     NSDate *SetAlarmAt = [calendar dateFromComponents:components];
    
    
     UILocalNotification *localNotification = [[UILocalNotification alloc] init];
    
     localNotification.fireDate = SetAlarmAt;
    
    
     NSLog(@"FIRE DATE --%@----",[SetAlarmAt description]);
    
     localNotification.alertBody =@"Alert";
    
     localNotification.alertAction = [NSString stringWithFormat:@"My test for Weekly alarm"];
    
     localNotification.userInfo = @{
                               @"alarmID":[NSString stringWithFormat:@"123"],
                               @"SOUND_TYPE":[NSString stringWithFormat:@"hello.mp3"]
                               };
    
      localNotification.repeatInterval=0; //[NSCalendar currentCalendar];
    
    
      [[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
    
    1. For iOS 10.0 and later: Now try with UserNotifications framework: Add the framework, and import like #import . In Appdelegate Didfinishluanch method.

      UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
          [center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert)
                    completionHandler:^(BOOL granted, NSError * _Nullable error) {
                        if (!error) {
                            NSLog(@"request succeeded!");
                            [self testAlrt];
                        }
                    }];
      
  1. 尝试一下。它已弃用但有效的代码。在 iOS 10.0 之前使用它:

    //Get all previous noti..
     NSLog(@"scheduled notifications: --%@----", [[UIApplication sharedApplication] scheduledLocalNotifications]);
    
     NSDate *now = [NSDate date];
     now = [now dateByAddingTimeInterval:60*60*24*7]; //7 for 7th day of the week.
     NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    
    [calendar setTimeZone:[NSTimeZone localTimeZone]];
     NSDateComponents *components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit|NSHourCalendarUnit|NSMinuteCalendarUnit|NSSecondCalendarUnit|NSTimeZoneCalendarUnit fromDate:now];
    
    
     NSDate *SetAlarmAt = [calendar dateFromComponents:components];
    
    
     UILocalNotification *localNotification = [[UILocalNotification alloc] init];
    
     localNotification.fireDate = SetAlarmAt;
    
    
     NSLog(@"FIRE DATE --%@----",[SetAlarmAt description]);
    
     localNotification.alertBody =@"Alert";
    
     localNotification.alertAction = [NSString stringWithFormat:@"My test for Weekly alarm"];
    
     localNotification.userInfo = @{
                               @"alarmID":[NSString stringWithFormat:@"123"],
                               @"SOUND_TYPE":[NSString stringWithFormat:@"hello.mp3"]
                               };
    
      localNotification.repeatInterval=0; //[NSCalendar currentCalendar];
    
    
      [[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
    
    1. 对于 iOS 10.0 及更高版本:现在尝试使用 UserNotifications 框架:添加框架,然后像 #import 一样导入。在 Appdelegate Didfinishluanch 方法中。

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

In your ibaction or method, write it and test:

在您的 ibaction 或方法中,编写并测试:

 NSDate *now = [NSDate date];

// NSLog(@"NSDate--before:%@",now);

now = [now dateByAddingTimeInterval:60*60*24*7];

NSLog(@"NSDate:%@",now);

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

[calendar setTimeZone:[NSTimeZone localTimeZone]];

NSDateComponents *components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit|NSHourCalendarUnit|NSMinuteCalendarUnit|NSSecondCalendarUnit|NSTimeZoneCalendarUnit fromDate:now];

NSDate *todaySehri = [calendar dateFromComponents:components]; //unused



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


UNCalendarNotificationTrigger *trigger = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:components 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");
    }
}];

回答by Jamshed Alam

Follow the step: 1. Import UserNotifications.framework and go to your AppDelegate class.

请按照以下步骤操作: 1. 导入 UserNotifications.framework 并转到您的 AppDelegate 类。

In .h

在.h

#import <UserNotifications/UserNotifications.h>
@interface AppDelegate : UIResponder          <UIApplicationDelegate,UNUserNotificationCenterDelegate>

@end
  1. Register for push :

    #define SYSTEM_VERSION_GRATERTHAN_OR_EQUALTO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending) 
    
  1. 注册推送:

    #define SYSTEM_VERSION_GRATERTHAN_OR_EQUALTO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending) 
    

Now add this in did finish launching :

现在添加这个确实完成启动:

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
   [self registerForRemoteNotifications];
return YES;
}

 - (void)registerForRemoteNotifications {
  if(SYSTEM_VERSION_GRATERTHAN_OR_EQUALTO(@"10.0")){
    UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    center.delegate = self;
    [center requestAuthorizationWithOptions:(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error){
         if(!error){
             [[UIApplication sharedApplication] registerForRemoteNotifications];
         }
     }];  
}
else {
    // Code for old versions
}
}
  1. Delegate methods for UserNotifications :

      //Called when a notification is delivered to a foreground app.
    
     -(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler{
    NSLog(@"User Info : %@",notification.request.content.userInfo);
    completionHandler(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge);
    }
    
     //Called to let your app know which action was selected by the user for a given notification.
     -(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler{
     NSLog(@"User Info : %@",response.notification.request.content.userInfo);
      completionHandler();
      }
    
  2. Push Notifications Entitlements : From project target's Capabilities tab and add Push Notifications Entitlements. enter image description here

  3. Add push and mobile certificate properly. Hope this is everything you need!

  1. UserNotifications 的委托方法:

      //Called when a notification is delivered to a foreground app.
    
     -(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler{
    NSLog(@"User Info : %@",notification.request.content.userInfo);
    completionHandler(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge);
    }
    
     //Called to let your app know which action was selected by the user for a given notification.
     -(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler{
     NSLog(@"User Info : %@",response.notification.request.content.userInfo);
      completionHandler();
      }
    
  2. 推送通知权利:从项目目标的功能选项卡并添加推送通知权利。 在此处输入图片说明

  3. 正确添加推送和移动证书。希望这是您需要的一切!

For more info: http://ashishkakkad.com/2016/09/push-notifications-in-ios-10-objective-c/

欲了解更多信息:http: //ashishkakkad.com/2016/09/push-notifications-in-ios-10-objective-c/