#推送通知
IOS推送通知有两种:
1、本地推送通知(Local Notification)
2、远程推送通知(Remote Notification)

推送消息传输路径: Provider-APNs-Client App

iOS app本地发送通知到系统通知栏 本地推送通知_服务器

推送通知的呈现效果:
1.在屏幕顶部显示的一条横幅
2.在屏幕中间弹出一个UIAlertView
3.在锁屏界面显示一块横幅
4.跟新app图标的数字
5.播放音效

##本地推送
本地推送是由iOS下的NotificationManage进行统一管理的,将封装好的本地Notification对象加入到系统的Notification管理中,不需要服务器支持(无需联网)就能发出的推送通知。

创建本地推送并设置相关属性

UILocalNotification *localNote = [[UILocalNotification alloc]init];
    
    //设置通知发出的时间
    localNote.fireDate = [NSDate dateWithTimeIntervalSinceNow:2.0];
    //设置通知的内容
    localNote.alertBody = @"你好!";
    //设置锁屏界面的文字
    localNote.alertAction = @"您有一条新消息,请查收";
    //设置锁屏界面alertAction是否有效
    localNote.hasAction = YES;
    //设置通过点击通知打开APP的时候的启动图片
    localNote.alertLaunchImage = @"1";
    //设置应用程序图标右上角的数字
    localNote.applicationIconBadgeNumber = 1;
    //设置通知之后的属性
    localNote.userInfo = @{@"name" : @"张三", @"toName" : @"李四"};

当用户点击本地推送通知的时候,会自动打开app,有两种情况:
1、app没有关闭,只是一直隐藏在后台

// 如果是应用程序在前台,依然会收到通知,但是收到通知之后不应该跳转
    if (application.applicationState == UIApplicationStateActive) return;
    
    if (application.applicationState == UIApplicationStateInactive) {
        // 当应用在后台收到本地通知时执行的跳转代码
        [self jumpToSession];
    }

2、app已经关闭

//ios8.0以后要使用本地通知,需要得到用户的许可.
    [application setApplicationIconBadgeNumber:0];
    
    if (IS_iOS8) {
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound categories:nil];
        [application registerUserNotificationSettings:settings];
    }
    
    // 如果是正常启动应用程序,那么launchOptions参数是null
    if (launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]) {
        
        // 当app关闭状态收到本地通知时执行的跳转代码
        // [self jumpToSession];
        UILabel *View = [[UILabel alloc] init];
        View.backgroundColor = [UIColor redColor];
        View.frame = CGRectMake(0, 100, 300, 400);
        View.numberOfLines = 0;
        View.text = [NSString stringWithFormat:@"%@", launchOptions];
        [self.window.rootViewController.view addSubview:View];
    }

//取消本地通知 [[UIApplication sharedApplication] cancelLocalNotification:notification]; notification.applicationIconBadgeNumber = 0;

//取消通知后将程序图标右上角的数字清除
[UIApplication sharedApplication].applicationIconBadgeNumber = 0;

##远程推送
远程推送也就是APNs(Apple Push Notification Services),需要服务器的支持并且处于长连接的状态,是从远程服务器推送给客户端的通知(需要联网)。

远程推送有一下几个重要步骤:

###1、创建推送证书 ####创建APP ID

(1)登录苹果开发者中心,注册登录

(2)如图点击右上角的+号

iOS app本地发送通知到系统通知栏 本地推送通知_移动开发_02


(3)自定义name,选择通配符APP ID,填写后缀,BundleID填写好后一定要记牢,后面会用到

iOS app本地发送通知到系统通知栏 本地推送通知_移动开发_03


注意:必须创建完整的appID,不能带有*

####请求文件

(1)打开钥匙串

(2)

iOS app本地发送通知到系统通知栏 本地推送通知_iOS app本地发送通知到系统通知栏_04


(3)输入邮箱及常用名后点击存储到磁盘

iOS app本地发送通知到系统通知栏 本地推送通知_运维_05


(4)点击继续 ,请求文件创建完成

iOS app本地发送通知到系统通知栏 本地推送通知_iOS app本地发送通知到系统通知栏_06

####创建开发证书(用于真机调试)、发布证书

开发证书

(1)选择Development,选择右上角的+号

iOS app本地发送通知到系统通知栏 本地推送通知_移动开发_07


(2)选择IOS APP Development(用于真机调试使用)点击continue

iOS app本地发送通知到系统通知栏 本地推送通知_服务器_08


(3)选择刚刚创建的APP ID (4) 点击Choose File ,选择刚刚生成的请求文件

iOS app本地发送通知到系统通知栏 本地推送通知_cocoapods_09


(5) 创建完成,点击done

iOS app本地发送通知到系统通知栏 本地推送通知_移动开发_10


(6)再在development中添加,选择 Apple Push Notification service SSL(在开发环境测试时使用)

iOS app本地发送通知到系统通知栏 本地推送通知_移动开发_11


(7)其余步骤和上面相同,创建成功后选择Down,下载开发证书

**生产证书 ** (1)选择Production,点击右上角+号

iOS app本地发送通知到系统通知栏 本地推送通知_移动开发_12


(2)App Store and Ad Hoc是将生产证书上传到App Store中,点击continue

iOS app本地发送通知到系统通知栏 本地推送通知_cocoapods_13


(3)选择请求文件

iOS app本地发送通知到系统通知栏 本地推送通知_cocoapods_14


(4)创建成功

(5)生产环境下发送推送

iOS app本地发送通知到系统通知栏 本地推送通知_cocoapods_15


(6)其余步骤同上,创建成功后,下载发布证书

**导出证书 ** (1)在钥匙串中找到Apple Development证书,右击

iOS app本地发送通知到系统通知栏 本地推送通知_cocoapods_16


(2)选择导出

iOS app本地发送通知到系统通知栏 本地推送通知_移动开发_17


(3)

iOS app本地发送通知到系统通知栏 本地推送通知_cocoapods_18


(4)设置密码为空

iOS app本地发送通知到系统通知栏 本地推送通知_cocoapods_19


(5)点击允许,成功生成.p12文件

iOS app本地发送通知到系统通知栏 本地推送通知_移动开发_20


(6)导出Apple Push Service证书步骤同上 ####生成配置文件

(1)在苹果开发者平台中选择Provisioning Profiles中的all,点击右上角+号

iOS app本地发送通知到系统通知栏 本地推送通知_移动开发_21


(2)创建Development证书的配置文件

iOS app本地发送通知到系统通知栏 本地推送通知_移动开发_22


(3)选择最开始创建的APP ID

iOS app本地发送通知到系统通知栏 本地推送通知_服务器_23


(4)创建Distribution的配置文件(测试打包生产环境下)

iOS app本地发送通知到系统通知栏 本地推送通知_cocoapods_24


(5)其他步骤同上 ####安装证书 (1)注册登录极光推送

iOS app本地发送通知到系统通知栏 本地推送通知_服务器_25


(2)点击创建应用

iOS app本地发送通知到系统通知栏 本地推送通知_服务器_26


(3)将导出的开发证书和生产证书上传

iOS app本地发送通知到系统通知栏 本地推送通知_移动开发_27


(4)上传成功后如图

iOS app本地发送通知到系统通知栏 本地推送通知_cocoapods_28


###使用CocoaPods导入第三方库 (JPUSHService) ###3、获取deviceToken (用户标识)

App 必须要向 APNs 请求注册以实现推送功能,在请求成功后,APNs 会返回一个设备的标识符即 DeviceToken 给 App,服务器在推送通知的时候需要指定推送通知目的设备的 DeviceToken。在 iOS 8 以及之后,注册推送服务主要分为四个步骤:

  • 使用 registerUserNotificationSettings:注册应用程序想要支持的推送类型
  • 通过调用 registerForRemoteNotifications方法向 APNs 注册推送功能
  • 请求成功时,系统会在应用程序委托方法中返回 DeviceToken,请求失败时,也会在对应的委托方法中给出请求失败的原因。
  • 将 DeviceToken 上传到服务器,服务器在推送时使用。

iOS app本地发送通知到系统通知栏 本地推送通知_服务器_29


(1)客户端向苹果服务APNS,发送设备的UDID和Bundle Identifier.

(2)经苹果服务器加密生成一个deviceToken

(3)将当前用户的deviceToken,发送给自己应用的服务器

(4)自己的服务器,将得到的deviceToken,进行保存

在AppDelegate.m文件中写以下代码,注册推送通知

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    
    //注册推送
    if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
        //可以添加自定义categories
        [JPUSHService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge |
                                                          UIUserNotificationTypeSound |
                                                          UIUserNotificationTypeAlert)
                                              categories:nil];
    }

    //Required
    // init Push(2.1.5版本的SDK新增的注册方法,改成可上报IDFA,如果没有使用IDFA直接传nil  )
    // 如需继续使用pushConfig.plist文件声明appKey等配置内容,请依旧使用[JPUSHService setupWithOption:launchOptions]方式初始化。
    [JPUSHService setupWithOption:launchOptions appKey:AppKey channel:nil apsForProduction:NO];
    
    //清除图标右上角的数字
    [UIApplication sharedApplication].applicationIconBadgeNumber = 0;

    return YES;
}

注意:appKey一定要和极光创建的应用appKey一致

利用回调的方式获取deviceToken。

- (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    
    //把deviceToken上报到极光服务器
    [JPUSHService registerDeviceToken:deviceToken];
}

接收苹果服务器传回的设备唯一标识deviceToken,苹果服务器响应之后, 就会调用这个方法, 把deviceToken 传给我们 ###4、配置X-Code

(1)这里的Bundle Identifier 与先前证书中的BundleID要一致

iOS app本地发送通知到系统通知栏 本地推送通知_服务器_30


(2)打开消息推送

iOS app本地发送通知到系统通知栏 本地推送通知_iOS app本地发送通知到系统通知栏_31


(3)在info.plist文件中添加App Transport Security Settings,并将Allow Arbitrary Loads的value该为YES

iOS app本地发送通知到系统通知栏 本地推送通知_iOS app本地发送通知到系统通知栏_32