推送通知
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
- 配置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;
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];
- (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);
{
NSLog(@"deviceToken: %@",deviceToken);
}
4. 实现接收到通知时的处理方法: didReceiveRemoteNotification. 在这里处理用户数据
1> 在前台时, 界面没有任何提示, 所以看情况判断, 是否需要区分激活状态.
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];
}
- (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);
//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 - 三. 极光推送
#pragma mark 1. 第三方推送SDK-极光推送的了解
#pragma mark 2. 极光推送的集成与调试(掌握)
以上是关于推送通知的主要内容,如果未能解决你的问题,请参考以下文章
Apple 推送通知或 Firebase 推送通知? [关闭]