苹果系统的本地推送

现在开发远程推送一般都是第三方极光推送,这里介绍苹果原生本地推送方法 前台/后台/退出

在appDelegate中接收推送的方法

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    //1. 判断是否有通知需要处理->程序启动时调用的方法,也就是程序之前被关闭了
    if (launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]) {

        //2. 获取本地通知
        UILocalNotification *notification = launchOptions[UIApplicationLaunchOptionsLocalNotificationKey];

        //3. 实现界面跳转
        [self switchTabBarWithNotification:notification];

        //程序被关闭后不能得知是否接收到任何消息
//        UILabel *label = [UILabel new];
//        label.text = [NSString stringWithFormat:@"%@", launchOptions];
//        label.frame = CGRectMake(0, 0, 375, 300);
//        label.numberOfLines = 0;
//        [self.window.rootViewController.view addSubview:label];
    }

  // 设置分类
    UIMutableUserNotificationCategory *category = [UIMutableUserNotificationCategory new];
    category.identifier = @"category";

    // 设置一个前台按钮
    UIMutableUserNotificationAction *action1 = [UIMutableUserNotificationAction new];
    action1.identifier = @"foreground";
    action1.activationMode = UIUserNotificationActivationModeForeground;
    action1.title = @"前台";

    // 设置一个后台按钮
    UIMutableUserNotificationAction *action2 = [UIMutableUserNotificationAction new];
    action2.identifier = @"background";
    action2.activationMode = UIUserNotificationActivationModeBackground;
    action2.title = @"后台";

    // 设置通知出现的下拉处理按钮
    [category setActions:@[action1, action2] forContext:UIUserNotificationActionContextDefault];

    NSSet *categorySet = [NSSet setWithObjects:category, nil];

    // 设置需要请求的权限
    UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:categorySet];

    // 注册用户权限设置
    [[UIApplication sharedApplication] registerUserNotificationSettings:setting];


    return YES;
}
#pragma mark -这是处理UIMutableUserNotificationAction 的方法,根据ID
- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forLocalNotification:(UILocalNotification *)notification completionHandler:(void (^)())completionHandler
{
    if ([identifier isEqualToString:@"foreground"]) {
        NSLog(@"前台运行中");
    } else if ([identifier isEqualToString:@"background"]) {
        NSLog(@"后台运行中");
    }
    completionHandler();
}
#pragma mark 当应用程序收到本地通知点击的时候调用
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
    //实现界面跳转
    [self switchTabBarWithNotification:notification];

}

- (void)switchTabBarWithNotification:(UILocalNotification *)notification
{
    //1. 判断当前程序的状态
    if ([UIApplication sharedApplication].applicationState == UIApplicationStateActive) {
        return;
    }

    //2. 获取根控制器
    UITabBarController *tabBarC =  (UITabBarController *)self.window.rootViewController;

    //3. 获取索引信息
    NSInteger index = [notification.userInfo[@"tabBarIndex"] integerValue];

    //4. 切换
    tabBarC.selectedIndex = index;
}

在控制器里创建推送,并发送推送的过程

- (void)touches
{

    //1. 创建本地通知
    UILocalNotification *notifi = [UILocalNotification new];

    //2. 设置属性
    //2.1 设置发送时间
    notifi.fireDate = [NSDate dateWithTimeIntervalSinceNow:5];

    //2.2 设置发送内容
    notifi.alertBody = @"呵呵";

    //2.3 设置声音
    // 只有真机才有声音.  如果真机是静音状态, 会变成震动提示
    notifi.soundName = UILocalNotificationDefaultSoundName;

    //2.4 设置角标
    notifi.applicationIconBadgeNumber = 10;

    //2.5 设置点击通知时要显示的启动图
    notifi.alertLaunchImage = @"UILaunchImageFile";

    #pragma mark 不常用属性
    //2.6 重复间隔 --> 最小为分钟 --> 如果设置了重复, 通知发送后不会从调度池中移除
    notifi.repeatInterval = NSCalendarUnitMinute;

    //2.7 重复时参考的日历
    // 中国农历: NSCalendarIdentifierChinese
    //notifi.repeatCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:@"NSCalendarIdentifierChinese"];

    // 根据用户设置自动更新 --> 这个属性一般不用设置, 跟随系统日历
    //notifi.repeatCalendar = [NSCalendar autoupdatingCurrentCalendar];

    //3. 添加到调度池中
    [[UIApplication sharedApplication] scheduleLocalNotification:notifi];

    //4. 移除调度池中的通知

    // 取消当前应用注册过的通知
    //[[UIApplication sharedApplication] cancelAllLocalNotifications];

    // 取消指定的通知
    //[[UIApplication sharedApplication] cancelLocalNotification:notifi];

    // 获取通知
    NSArray *notifis = [[UIApplication sharedApplication] scheduledLocalNotifications];
    NSLog(@"notifi: %@",notifis);
 //记住iOS8以后一定要在登录代理方法中验证权限

分享就到这里啦~~极光推送很简单,下载推送包,按照他们官网的步骤设置即可

你可能感兴趣的:(应用,苹果,本地推送)