一. 推送通知流程
1.app应用程序要向设备IOS系统注册通知,第一次会打开一个确认对话框
2.如果用户确认IOS系统会向
APNS服务器建立连接(每隔15分钟进行一次握手,确认是否保持活跃) 表示应用程序需要推送一条消息
3.APNS服务器会向我们的应用程序发送一个token(token对每个应用程序都是唯一的 即表示唯一的应用程序) 这时app应用程序会调用应用程序代理方法接收token
4.应用程序将token发送给WEB服务器 ,这时一旦服务器热点新闻发生了,就会找到APNS服务器
将token与热点新闻内容、SSL证书、private key私钥 发送给APNS服务器
(token与热点新闻内容 SSL证书、private key私钥会合并成一个物理文件 pem文件)
通过token知道要将内容发给那个应用程序 (SSL证书、private key需要验证应用是否是苹果开发者用户因为不是苹果付费开发者将不允许使用推送通知功能)
5.APNS服务器验证通过将感兴趣的内容发送给app应用
二. 推送通知要求、内容以及局限
要求:
1.必须真机模拟器无法推送
2.必须加入开发者计划
3.需要一个provider发起者 服务器
内容:
设备令牌token + 负载Payload(定义的json信息属性列表 最大值为256字节)
字典必须包含一个键名为aps的字典,而aps的字典包含一个或多个属性)
这些属性指定如下动作:提示用户的警告信息
一个提示声音
显示app应用程序的数字(徽章)
局限: 它是不可靠的,比如地铁没有信号 山区信号不好 或者关机
APNS服务器每隔15分钟进行一次握手 建立连接
比如关机的时候可能发送很多通知保存在通知队列,当开机的时候会同时接收
一旦超时将永久消失
三. 推送通知步骤
1.请求CSR文件
打开钥匙串
菜单 钥匙串访问 证书助理 --- 从证书颁发机构请求证书
用户电子邮件地址:
常用名称:
选中 存储到磁盘
--- 继续
如选择 Desktop 并在桌面创建一个文件夹 name:certificate 证书
提交证书
打开 developer.apple.com
点击 ios dev center
点击 log in
登录成功后
可以下载开发文档、视频、最新版本的xcode
点击 右上角 ios developer program 下面的
certificates,Identifiers &Profiles
点击左侧 certificates 会切换到第一个选项卡Development
点击 Request Certificate (请求证书)
点击底部的 选取文件 按钮 找到Desktop/certificate 路径 .csr
点击 submit 会跳转到选项卡Development 显示一条证书记录
点击 download 将下载后的.cer文件剪切到 Desktop/certificate 路径下
注册安装证书
双击打开 .cer文件
打开钥匙串
点击钥匙串左下角窗口中的 证书 查看有对应的证书文件
展开证书 查看里面是否有对应的钥匙串 TestApp 如果有表明证书安装成功
2.导出秘钥
打开钥匙串 在左下角 找到 秘钥 右键 TestApp(专用秘钥) 导出 TestApp (文件格式是.p12)
保存到 Desktop/certificate 路径下
可以用密码保存(密码可以不设置) 在输入MAC机器密码
制作证书
回到 developer.apple.com
点击左侧 Devices 下面的 app IDs 选项卡
注意:
注册app IDs (有2种方式 必须使用第一种填写应用程序名字 而不能使用通配符*)
App id :Push
bundle identifier 输入 com.puke.TestAppPush (不能使用通配符)
点击 submit
提交后会切换回Manage 选项卡 显示刚才提交的设备
点击 右侧 configure
选中复选框 Enable for Apple Push Notification service
点击下面 Development Push SSL Certificate 右侧的 configure
测试使用该证书
点击 continue 选取文件 找到 .cerSigningRequest文件 点击 Generate
点击 continue 点击 download
双击打开下载的 aps_development.cer 推送证书
打开钥匙串 在左下角 找到 证书
Apple Development IOS Push Services :com.puke.TestAppPush
生成provisioning文件
回到 developer.apple.com
点击左侧 provisioning 会切换到第一个选项卡Development
单击 New profile 创建provisionging文件
Profile Name: PushNotification (随便填写)
选中 Certificates 复选框
App ID 选择 Push
点击 select all
点击 submit
提交后会切换回Development 选项卡
查看 status 是否为 Active
点击 download
将下载后的 PushNotification.mobileprovision文件
剪切到 Desktop/certificate 路径下
安装provisioning文件
双击会通过xcode 打开 .mobileprovision文件
查看 status 是否为 绿色 valid profile
project: TestAppPush
注意项目名称要与 bundle identifier : com.puke.TestAppPush (不能使用通配符)
相同
打开 AppDelegate.m
在
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
方法中的 [self.window makeKeyAndVisible]; 下面加入
if ([UIDevice currentDevice].systemVersion.doubleValue <= 8.0) {
// 不是iOS8
UIRemoteNotificationType type = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert;
// 当用户第一次启动程序时就获取deviceToke
// 该方法在iOS8以及过期了
// 只要调用该方法, 系统就会自动发送UDID和当前程序的Bunle ID到苹果的APNs服务器
[application registerForRemoteNotificationTypes:type];
}else
{
// iOS8
UIUserNotificationType type = UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound;
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:type categories:nil];
// 注册通知类型
[application registerUserNotificationSettings:settings];
// 申请试用通知
[application registerForRemoteNotifications];
}
查看 UIApplication.h 316行
加入协议方法
导入课件中的 布谷鸟.caf
运行 真机 设置 通知 查看是否有TestAppPush
查看控制台 获取设备deviceToken 是APNS服务器返回的
home键将程序挂载到后台
使用 PushMeBaby 项目来模拟 provider 服务器
打开 PushMeBaby 项目
加入aps_development.cer 推送证书
打开 PushMeBaby 项目中的 ApplicationDelegate.m
修改 - (id)init 方法中的 35行
// 设备令牌 使用刚才获取的deviceToken deviceToken是从控制台复制过来的
self.deviceToken = @"*** *** *** ***";
// 负载信息payload,key必须是aps alert badge sound是固定写法
// badge数字是几在logo图标上显示的就是几
self.payload = @"{\"aps\":{\"alert\":\"爱好世界和平\",\"badge\":1,\"sound\":\"布谷鸟.caf\",\"newID\":\"4987\", \"other\":\"钓鱼岛是我们中国的\",}}";
// 证书
self.certificate = [[NSBundle mainBundle] pathForResource:@"aps_development" ofType:@"cer"];
// NSLog(@"certificate : %@", self.certificate);
运行
弹出对话框 总是允许
弹出 PushMeBaby 窗口
Payload 负载 就是要推送的内容
点击 Push
效果参看课件中的 效果图.JPG
查看 真机 app 点击通知
查看 TestAppPush 项目的控制台 会显示回调的信息 调用项目中 布谷鸟.caf
现在我们知道应用挂起(home键)在后台可以通过 didReceiveRemoteNotification方法会回调信息
完善TestAppPush实例
打开 TestAppPush AppDelegate.m
将 didReceiveRemoteNotification 方法中的
NSLog(@"userInfo : %@", userInfo); 改为
NSLog(@"userInfo : %@", [[userInfo objectForKey:@"aps"] objectForKey:@"alert"]);
运行 点击 Push
真机 点击通知 查看控制台
在
[application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert];
下面加入
// 当我们的程序没有被启动时,provider(服务器)发送了一条感兴趣的消息,通过launchOptions字典来获取内容
在 [self.window makeKeyAndVisible]; 下面加入
// 这是一个测试label
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 100, 320, 50)];
label.backgroundColor = [UIColor redColor];
label.tag = 101;
label.textColor = [UIColor whiteColor];
[self.window addSubview:label];
[label release];
// 当我们的程序未运行时
NSDictionary *remoteDic = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (remoteDic) {
label.backgroundColor = [UIColor purpleColor];
label.text = [[remoteDic objectForKey:@"aps"] objectForKey:@"alert"];
}
将 didReceiveRemoteNotification 方法改为
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
// NSLog(@"userInfo : %@", [[userInfo objectForKey:@"aps"] objectForKey:@"alert"]);
UILabel *label = (UILabel *)[self.window viewWithTag:101];
label.text = [[userInfo objectForKey:@"aps"] objectForKey:@"other"];
} // 接受到感兴趣的内容(挂起时调用代理方法)
运行
没有推送通知所以label没有内容
点击 Push
label内容会显示 钓鱼岛是我们中国的
双击 home键 关闭 TestAppPush 或者重新运行TestAppPush
badge数字是几在logo图标上显示的就是几
去掉LOGO数字
在 applicationDidBecomeActive 方法中加入
[application setApplicationIconBadgeNumber:0];
运行
点击 Push
进入 TestAppPush home键 返回 就会去掉LOGO上的数字
制作PEM证书
1.app应用程序要向设备IOS系统注册通知,第一次会打开一个确认对话框
2.如果用户确认IOS系统会向
APNS服务器建立连接(每隔15分钟进行一次握手,确认是否保持活跃) 表示应用程序需要推送一条消息
3.APNS服务器会向我们的应用程序发送一个token(token对每个应用程序都是唯一的 即表示唯一的应用程序) 这时app应用程序会调用应用程序代理方法接收token
4.应用程序将token发送给WEB服务器 ,这时一旦服务器热点新闻发生了,就会找到APNS服务器
将token与热点新闻内容、SSL证书、private key私钥 发送给APNS服务器
(token与热点新闻内容 SSL证书、private key私钥会合并成一个物理文件 pem文件)
通过token知道要将内容发给那个应用程序 (SSL证书、private key需要验证应用是否是苹果开发者用户因为不是苹果付费开发者将不允许使用推送通知功能)
5.APNS服务器验证通过将感兴趣的内容发送给app应用
二. 推送通知要求、内容以及局限
要求:
1.必须真机模拟器无法推送
2.必须加入开发者计划
3.需要一个provider发起者 服务器
内容:
设备令牌token + 负载Payload(定义的json信息属性列表 最大值为256字节)
字典必须包含一个键名为aps的字典,而aps的字典包含一个或多个属性)
这些属性指定如下动作:提示用户的警告信息
一个提示声音
显示app应用程序的数字(徽章)
局限: 它是不可靠的,比如地铁没有信号 山区信号不好 或者关机
APNS服务器每隔15分钟进行一次握手 建立连接
比如关机的时候可能发送很多通知保存在通知队列,当开机的时候会同时接收
一旦超时将永久消失
三. 推送通知步骤
1.请求CSR文件
打开钥匙串
菜单 钥匙串访问 证书助理 --- 从证书颁发机构请求证书
用户电子邮件地址:
常用名称:
选中 存储到磁盘
--- 继续
如选择 Desktop 并在桌面创建一个文件夹 name:certificate 证书
提交证书
打开 developer.apple.com
点击 ios dev center
点击 log in
登录成功后
可以下载开发文档、视频、最新版本的xcode
点击 右上角 ios developer program 下面的
certificates,Identifiers &Profiles
点击左侧 certificates 会切换到第一个选项卡Development
点击 Request Certificate (请求证书)
点击底部的 选取文件 按钮 找到Desktop/certificate 路径 .csr
点击 submit 会跳转到选项卡Development 显示一条证书记录
点击 download 将下载后的.cer文件剪切到 Desktop/certificate 路径下
注册安装证书
双击打开 .cer文件
打开钥匙串
点击钥匙串左下角窗口中的 证书 查看有对应的证书文件
展开证书 查看里面是否有对应的钥匙串 TestApp 如果有表明证书安装成功
2.导出秘钥
打开钥匙串 在左下角 找到 秘钥 右键 TestApp(专用秘钥) 导出 TestApp (文件格式是.p12)
保存到 Desktop/certificate 路径下
可以用密码保存(密码可以不设置) 在输入MAC机器密码
制作证书
回到 developer.apple.com
点击左侧 Devices 下面的 app IDs 选项卡
注意:
注册app IDs (有2种方式 必须使用第一种填写应用程序名字 而不能使用通配符*)
App id :Push
bundle identifier 输入 com.puke.TestAppPush (不能使用通配符)
点击 submit
提交后会切换回Manage 选项卡 显示刚才提交的设备
点击 右侧 configure
选中复选框 Enable for Apple Push Notification service
点击下面 Development Push SSL Certificate 右侧的 configure
测试使用该证书
点击 continue 选取文件 找到 .cerSigningRequest文件 点击 Generate
点击 continue 点击 download
双击打开下载的 aps_development.cer 推送证书
打开钥匙串 在左下角 找到 证书
Apple Development IOS Push Services :com.puke.TestAppPush
生成provisioning文件
回到 developer.apple.com
点击左侧 provisioning 会切换到第一个选项卡Development
单击 New profile 创建provisionging文件
Profile Name: PushNotification (随便填写)
选中 Certificates 复选框
App ID 选择 Push
点击 select all
点击 submit
提交后会切换回Development 选项卡
查看 status 是否为 Active
点击 download
将下载后的 PushNotification.mobileprovision文件
剪切到 Desktop/certificate 路径下
安装provisioning文件
双击会通过xcode 打开 .mobileprovision文件
查看 status 是否为 绿色 valid profile
project: TestAppPush
注意项目名称要与 bundle identifier : com.puke.TestAppPush (不能使用通配符)
相同
打开 AppDelegate.m
在
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
方法中的 [self.window makeKeyAndVisible]; 下面加入
if ([UIDevice currentDevice].systemVersion.doubleValue <= 8.0) {
// 不是iOS8
UIRemoteNotificationType type = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert;
// 当用户第一次启动程序时就获取deviceToke
// 该方法在iOS8以及过期了
// 只要调用该方法, 系统就会自动发送UDID和当前程序的Bunle ID到苹果的APNs服务器
[application registerForRemoteNotificationTypes:type];
}else
{
// iOS8
UIUserNotificationType type = UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound;
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:type categories:nil];
// 注册通知类型
[application registerUserNotificationSettings:settings];
// 申请试用通知
[application registerForRemoteNotifications];
}
查看 UIApplication.h 316行
加入协议方法
导入课件中的 布谷鸟.caf
运行 真机 设置 通知 查看是否有TestAppPush
查看控制台 获取设备deviceToken 是APNS服务器返回的
home键将程序挂载到后台
使用 PushMeBaby 项目来模拟 provider 服务器
打开 PushMeBaby 项目
加入aps_development.cer 推送证书
打开 PushMeBaby 项目中的 ApplicationDelegate.m
修改 - (id)init 方法中的 35行
// 设备令牌 使用刚才获取的deviceToken deviceToken是从控制台复制过来的
self.deviceToken = @"*** *** *** ***";
// 负载信息payload,key必须是aps alert badge sound是固定写法
// badge数字是几在logo图标上显示的就是几
self.payload = @"{\"aps\":{\"alert\":\"爱好世界和平\",\"badge\":1,\"sound\":\"布谷鸟.caf\",\"newID\":\"4987\", \"other\":\"钓鱼岛是我们中国的\",}}";
// 证书
self.certificate = [[NSBundle mainBundle] pathForResource:@"aps_development" ofType:@"cer"];
// NSLog(@"certificate : %@", self.certificate);
运行
弹出对话框 总是允许
弹出 PushMeBaby 窗口
Payload 负载 就是要推送的内容
点击 Push
效果参看课件中的 效果图.JPG
查看 真机 app 点击通知
查看 TestAppPush 项目的控制台 会显示回调的信息 调用项目中 布谷鸟.caf
现在我们知道应用挂起(home键)在后台可以通过 didReceiveRemoteNotification方法会回调信息
完善TestAppPush实例
打开 TestAppPush AppDelegate.m
将 didReceiveRemoteNotification 方法中的
NSLog(@"userInfo : %@", userInfo); 改为
NSLog(@"userInfo : %@", [[userInfo objectForKey:@"aps"] objectForKey:@"alert"]);
运行 点击 Push
真机 点击通知 查看控制台
在
[application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert];
下面加入
// 当我们的程序没有被启动时,provider(服务器)发送了一条感兴趣的消息,通过launchOptions字典来获取内容
在 [self.window makeKeyAndVisible]; 下面加入
// 这是一个测试label
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 100, 320, 50)];
label.backgroundColor = [UIColor redColor];
label.tag = 101;
label.textColor = [UIColor whiteColor];
[self.window addSubview:label];
[label release];
// 当我们的程序未运行时
NSDictionary *remoteDic = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (remoteDic) {
label.backgroundColor = [UIColor purpleColor];
label.text = [[remoteDic objectForKey:@"aps"] objectForKey:@"alert"];
}
将 didReceiveRemoteNotification 方法改为
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
// NSLog(@"userInfo : %@", [[userInfo objectForKey:@"aps"] objectForKey:@"alert"]);
UILabel *label = (UILabel *)[self.window viewWithTag:101];
label.text = [[userInfo objectForKey:@"aps"] objectForKey:@"other"];
} // 接受到感兴趣的内容(挂起时调用代理方法)
运行
没有推送通知所以label没有内容
点击 Push
label内容会显示 钓鱼岛是我们中国的
双击 home键 关闭 TestAppPush 或者重新运行TestAppPush
badge数字是几在logo图标上显示的就是几
去掉LOGO数字
在 applicationDidBecomeActive 方法中加入
[application setApplicationIconBadgeNumber:0];
运行
点击 Push
进入 TestAppPush home键 返回 就会去掉LOGO上的数字
制作PEM证书