推送通知

Posted 任伟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了推送通知相关的知识,希望对你有一定的参考价值。

远程推送
一、开发ios程序的推送功能,iOS端需要做的事情
1.请求苹果获得 deviceToken 
2.得到苹果返回的deviceToken
3.发送diviceToken给公司的服务器
4.监听用户对通知的点击
二、调试iOS 的远程推送功能,必备条件:
1.真机
2.调试推送需要的证书文件
1> aps_development.cer 某台电脑就能调试某个appl的推送服务
2>ios_development.cer  让真机具备调试的能力
3>iphone5_qq.mobileprovision 某台电脑就能利用某台设备调试某个程序
 
3.发布具有推送服务的APP
1>aps_production.cer : 如果发布的App中包含推送服务,那就必须安装这个证书
2>ios_distribution.cer 让某台电脑具备发布程序的能力
3>qq.mobileprovision:某台电脑就能发布某个程序
 
 
二、配置证书并集成
1.登录 Member Center —> Certificates,Identifiers & Profiles —> iOS  Apps  —> Certificates —> Development —> iOS App Development(调试证书)—> Continue —> CSR文件(苹果哪台机器能够拥有调试能力)—> 找到钥匙串(钥匙串访问 —证书助理 — 从证书颁发机构请求证书 — 证书信息 — 用户电子邮箱地址(随便写) — 常用名称(自己名字)— 存储到本地磁盘 — 继续 )
这样就生成了一个调试证书 ios_distribution.cer
  1. 配置App ID 
    iOS  Apps — > Identifilers — > App IDs — > 选择一个ID 或者创建一个ID (就是在Register iOS App ID 旁边的加号 — >App  ID Description Name: XXXX              App ID Suffix(Explicit App ID(推送一定要用这个) —> Bundle ID —>Push Notifications  —>    Continue—> Submit  ) 然后把应用程序的ID 和服务器上的ID 做成一样 )  
   .配置通知证书
   第一种方式: 自己创建 Member Center —> Certificates,Identifiers & Profiles —> iOS  Apps  —> Certificates —> All —>Add iOS Certificate  — > Apple Push Notification service SSL (Sandbox)
   第二种方式: 
  最终生成aps_production.cer
   生成描述文件 iOS  Apps — > Identifilers — > App IDs —> iOS App IDs(在这里面找) ,,如果没有重新添加(按照配置App ID来做)
      有了App ID 之后  —> Edit —> Push Notifications —> Development SSL Certificate (配置证书) — > Create certificate… —>Continue —> Choose file(把刚才创建好的CSR文件拿到) —> Generate —> Download  生成aps_development.cer
 
3.Device(Xcode中有 Window —> Device
 
两个证书都添加完毕,Bundle ID 添加完毕   UIID 也添加过了,这时候就来Provising Profiles —> All  —> Add iOS Provising Profile(添加加号) —> Development —> iOS App Development —> Continue —> Select App ID —> Continue —>Select certificates —> Select All —> Continue —> Select devices  —> Select All —> Continue  —> Name this profile and generate (Profile Name: XXXX) —> generate —> Download (生成描述文件)qq.mobileprovision
 
安装过程就是双击
cer文件可以在钥匙串访问
配置文件可以在Xcode 查看 Xcode —> Accounts —> View Details(这里就可以显示描述文件)
 
Bundle ID要和服务器保持一致
 
General —> Team(自己修改) 
Build Settings —> Code Signing —> Code Signing Identity (可以显示开发者证书)
                                  Provisioning Profile (显示描述文件)不用管
 
极光推送(集成)
官网   —> 产品 —> 极光推送 —> SDK 下载 —>(iOS版本)
创建应用 —> 应用信息(应用名称:XXX)—> iOS开发证书 (在钥匙串中把对应的P12文件导出,导出之后,提示加密(这时候 加密即可),输入本机的密码进行授权)
开发证书密码:就是刚才存放时让加密的密码
 —> 创建应用
这时候有AppKey 和Bundle ID
 
接下来就是使用Xcode创建项目 
 
1.Bundle ID 要正确
2.General —> Team(自己修改)
Build Settings —> Code Signing —> Code Signing Identity (可以显示开发者证书)
                                  Provisioning Profile (显示描述文件)不用管
 
接下来就是集成SDK
。。。。
 
接着找到首页自己的头像 —> 控制台 —> 应用列表-应用—> 推送 —> 发送通知 —> 推送对象(iOS开发环境)— 
设备别名(有文档,可以起别名)
  发送时间(立即)—> 立即发送
 
 
 
 
pragma mark -一.本地通知

#pragma mark 1. 本地通知的原理(了解)


#pragma mark 2. 创建本地通知(掌握)
1. 创建本地通知对象
2. 设置属性
3. 注册通知 , 如果是IOS7 , 这一步写完就OK
4. 如果是iOS8 , 那么还需要授权 (设置用户可以接受那些类型的通知)


#pragma mark 3. 通知的处理1-跳转界面(掌握)
1. 可以实现应用程序的代理方法didReceiveLocalNotification: 获取通知的值, 来进行处理. (didReceiveLocalNotification: 只能处理应用在前台及后台情况)
2. 应该在注册通知时 , 应该设置UserInfo来传值
3. 应该在应用程序启动时调用的代理方法中也实现 通知处理的代码(应该判断一下key是否有值)


#pragma mark 4. 通知的处理2-程序退出(掌握)


#pragma mark 5. 分类的设置(了解)
1. 创建通知时, 设置分类属性
2. 请求权限时, 设置分类参数, 倒着退即可. 注意标志一定要设置正确
3. 实现代理方法进行处理, 处理完成记得调用block即可



#pragma mark - 二. 远程通知

#pragma mark 1. 远程推送通知原理(掌握)


#pragma mark 2. 配置证书(掌握)
1. 配置证书>> development 调试证书
2. 配置APPID --> 指定BundleID 不能使用通配符. 还需要勾选push notification 选项.
3. 配置APNs调试证书 (两种方式, 第一种可以按照步骤1生成, 第二种方式找到APP ID , 然后编辑即可)
4. 配置描述文件(包含了哪个电脑可以调试, 哪个手机可以调试, 哪个程序可以调试)
5. 创建项目时, Xcode7以后最好一次性直接配置OK. (否则, 需要右键xcodeproj包内容 --> 打开project.pbxproj --> 搜索报错的名字, 删除即可)


#pragma mark 3. 远程推送代码实现(掌握)
1. 注册用户权限
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
   
    if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0) {
       
        // iOS8 以后的方式
        //1. 相当于请求授权 -- 注册用户设置
        UIUserNotificationType type = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
       
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:type categories:nil];
       
        [application registerUserNotificationSettings:settings];
       
       
    } else {
        // 1. 注册通知 --> 苹果服务器注册 --> 需要设置类型\
        // iOS7以前就这么两句OK
        UIRemoteNotificationType type = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound  | UIRemoteNotificationTypeAlert;
        [application registerForRemoteNotificationTypes:type];
    }
   
//    //接收程序退出后, 点击通知时的处理
//    if (launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]) {
//       
//        UILabel *label = [UILabel new];
//        label.frame = CGRectMake(0, 0, 320, 320);
//        label.backgroundColor = [UIColor redColor];
//        [self.window.rootViewController.view addSubview:label];
//    }
//   
    return YES;
}
 
2. 请求到了用户权限的时候会调用的方法中注册通知
#pragma mark 请求到了用户权限的时候会调用的方法
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
{
    NSLog(@"notificationSettings: %@",notificationSettings);
   
    //2. 注册通知
    [application registerForRemoteNotifications];
}
3. 如果想要获取Token , 实现代理方法didRegisterForRemoteNotificationsWithDeviceToken:, 拿到Token之后, 应该发送给自家的服务器保存.
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    NSLog(@"deviceToken: %@",deviceToken);
}
4. 实现接收到通知时的处理方法: didReceiveRemoteNotification. 在这里处理用户数据
    1> 在前台时, 界面没有任何提示, 所以看情况判断, 是否需要区分激活状态.
    2> 在后台时, 点击通知才会调用此代理方法
#pragma mark 收到消息时调用的方法
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    // 判断应用是否在前台
    if (application.applicationState == UIApplicationStateActive) {
        // 自行处理逻辑
    } else {
        NSLog(@"userInfo: %@", userInfo);
       
        NSString *alertStr = userInfo[@"aps"][@"alert"];
       
        UILabel *label = [UILabel new];
        label.frame = CGRectMake(0, 0, 320, 320);
        label.text = alertStr;
        label.backgroundColor = [UIColor redColor];
        [self.window.rootViewController.view addSubview:label];
    }
   
   
}
#pragma mark iOS7 增加了多任务处理的能力 iOS4以前没有任何的多任务 iOS5~6伪多任务
//iOS7以后 两个方法是替代的关系, 如果实现了下面的方法, 那么上面的方法不会执行
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    NSLog(@"userInfo: %@", userInfo);
   
    //执行完毕需要调用block
    completionHandler(UIBackgroundFetchResultNewData);
   
}
5. 还需要实现应用程序启动的时候调用的方法 : 需要判断应用程序的远程通知Key是否有值, 如果有值, 那么应该做处理launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]


#pragma mark - 三. 极光推送

#pragma mark 1. 第三方推送SDK-极光推送的了解

#pragma mark 2. 极光推送的集成与调试(掌握)
 
技术分享

以上是关于推送通知的主要内容,如果未能解决你的问题,请参考以下文章

显示最后一个通知推送,我需要显示所有通知推送

已经拥有静默推送通知后的正常推送通知权限

PWA 的推送通知或 Web 推送通知

Apple 推送通知或 Firebase 推送通知? [关闭]

Xamarin iOS - 推送通知 - 区分点击的推送通知与到达

停止计划的推送通知在反应本机推送通知中