公司在項目使用第三方的推送是百度推送 接下來學(xué)習(xí)一下
百度推送地址
第一章 生成AppKey
1.1 注冊百度賬號
1.2 創(chuàng)建應(yīng)用
Snip20170330_76.png
1.2.1 設(shè)置應(yīng)用名稱
Snip20170330_77.png
1.2.2 應(yīng)用配置
Snip20170330_80.png
1.2.2 應(yīng)用配置完成 得到API KEY
Snip20170330_81.png
第二章 生成推送所需的pem證書
2.1 在開發(fā)者這種找到我們的應(yīng)用對應(yīng)的APPID
Snip20170330_82.png
2.2 選擇證書關(guān)聯(lián)的APPID
Snip20170330_83.png
2.3 選擇電腦鑰匙串辦法的證書
Snip20170330_84.png
2.4 同樣的操作就會生成兩個cer證書痘番,雙擊安裝到我們的鑰匙串中
Snip20170330_85.png
2.5 導(dǎo)出兩個P12文件
2.6 將導(dǎo)出的P12通過命令導(dǎo)出百度需要的pem證書
Snip20170330_86.png
2.7證書與證書校驗
與 APNs 之間是加密的連接耿战,因此需要使用證書來加密連接员魏。每個的推送環(huán)境有自己單獨的推送證書践惑,即開發(fā)證書和生產(chǎn)證書驶赏。
在將證書最終轉(zhuǎn)為 pem 格式后墅茉,可通過與 APNs 連接來測試證書是否有效凡蜻。
開發(fā)環(huán)境:
openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert MyApnsDev.pem
生產(chǎn)環(huán)境:
openssl s_client -connect gateway.push.apple.com:2195 -cert MyApnsPro.pem
當輸入完命令回車后辣之,終端首先會輸出很多相關(guān)信息觅玻。
當連接建立失敗時想际,會直接關(guān)閉。
當連接建立成功時溪厘,終端會停止輸出胡本,并等待你輸入,你可以隨便輸入一些字符后摁回車畸悬,然后連接才會關(guān)閉侧甫。?
2.8 通知的兩種推送環(huán)境
在使用 iOS 遠程推送功能時,有兩種不同的環(huán)境。開發(fā)環(huán)境(Development)以及生產(chǎn)環(huán)境(Production)披粟。
App 當前使用的推送環(huán)境與 Xcode - Build Settings - Code Signing - Provisioning Profile 文件的模式一致咒锻。
2.7 將pem證書上傳到我們百度創(chuàng)建的應(yīng)用中
Snip20170330_87.png
這樣我們前期的配置工作就完成了。由于蘋果APNS是加密過的僻爽,所以我們需要將證書傳遞給百度虫碉,接下來我們在我們項目中將DeviceToken
傳遞給百度,它會綁定生成一個對應(yīng)的channel_ID
.
channel_id : channel_id是用于表示一臺設(shè)備的唯一標識, 在推送消息時,用于指定消息的目標接收設(shè)備.
第三章 創(chuàng)建我們的iOS工程胸梆,集成百度SDK
3.1 下載百度SDK 地址
Snip20170330_88.png
下載后的文件目錄
Snip20170330_89.png
3.2 將紅色的部分拖進項目中去敦捧,test.caf不需要
Snip20170330_90.png
3.3對于Xcode8.0配置
Snip20170330_91.png
Snip20170330_92.png
3.4 在AppDelegate中初始化百度推送
#import "AppDelegate.h"
#import <UserNotifications/UserNotifications.h>
#import "BPush.h"
#import "ViewController.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// iOS10 下需要使用新的 API
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 10.0) {
#ifdef NSFoundationVersionNumber_iOS_9_x_Max
UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter];
[center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert + UNAuthorizationOptionSound + UNAuthorizationOptionBadge)
completionHandler:^(BOOL granted, NSError * _Nullable error) {
// Enable or disable features based on authorization.
if (granted) {
[application registerForRemoteNotifications];
}
}];
#endif
}
else if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) {
UIUserNotificationType myTypes = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:myTypes categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
}else {
UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeSound;
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];
}
#warning 測試 開發(fā)環(huán)境 時需要修改BPushMode為BPushModeDevelopment 需要修改Apikey為自己的Apikey
[BPush registerChannel:launchOptions apiKey:@"M4a6DvXbCnl7rgvLcVeIwSFw" pushMode:BPushModeDevelopment withFirstAction:@"打開" withSecondAction:@"關(guān)閉" withCategory:@"test" useBehaviorTextInput:YES isDebug:YES];
// App 使用戶點擊推送消息啟動
NSDictionary *userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (userInfo) {
[BPush handleNotification:userInfo];
}
// 清除角標
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:1.0];
return YES;
}
#pragma Gegistnotification
// 在iOS8中,還需要添加這個方法碰镜。通過新的ApI 注冊推送服務(wù)
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
{
[application registerForRemoteNotifications];
}
// 當 DeviceToken 獲取失敗時兢卵,系統(tǒng)會調(diào)用此回調(diào)方法
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
NSLog(@"DeviceToken 獲取失敗, 原因是: %@", error);
}
// 當注冊成功時候返回 deviceToken
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
NSLog(@"%@-----", deviceToken);
[BPush registerDeviceToken:deviceToken];
// 綁定Push服務(wù)通道 error_code為0是綁定成功 綁定成功后可以獲取appid,channelid,userid等信息
[BPush bindChannelWithCompleteHandler:^(id result, NSError *error) {
if (result) {
if ([result[@"error_code"] intValue] != 0) {
return ;
}
// 獲取channel_id
NSString *myChange_id = [BPush getChannelId];
// [BPush getAppId];
// [BPush getUserId];
NSLog(@"%@", myChange_id);
[BPush setTag:@"MyTag" withCompleteHandler:^(id result, NSError *error) {
if (result) {
// BPushCallBack中有設(shè)置標簽結(jié)果的反饋,绪颖,error_code 為0時設(shè)置成功會得到設(shè)置結(jié)果秽荤。
NSLog(@"result==================%@", result);
}
}];
}
}];
}
// 當用戶點擊了通知 應(yīng)用在前臺 或者開啟后臺并且應(yīng)用在后臺 是調(diào)用
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
NSLog(@"%@", userInfo);
// 應(yīng)用在前臺 不跳轉(zhuǎn)頁面
if (application.applicationState == UIApplicationStateActive) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"收到一條消息" message:userInfo[@"aps"][@"alert"] delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"確定", nil];
[alert show];
}
// 殺死情況下 直接跳轉(zhuǎn)到頁面
if (application.applicationState == UIApplicationStateInactive) {
/*
SkipViewController *skipCtr = [[SkipViewController alloc] init];
[_tabBarCtr.selectedViewController pushViewController:skipCtr animated: YES];
*/
}
// 應(yīng)用在后臺 當后臺設(shè)置apps字段里的
if(application.applicationState == UIApplicationStateBackground){
ViewController *vc = (ViewController *)self.window.rootViewController;
vc.textView.text = userInfo.description;
}
}
3.5在百度后臺創(chuàng)建發(fā)送通知
Snip20170330_93.png
3.6 查看推送列表
Snip20170330_94.png
第三章 PHP集成百度推送
1.1下載PHP對應(yīng)SDK
Snip20170330_95.png
下載后的SDK目錄
Snip20170330_97.png
將項目拖拽到我們本地的服務(wù)器站點
Snip20170330_98.png
1.2 配置項目
- 修改configure.php中的defaultapiKey及defaultsecurekey,填入在Setp 2中獲得的apikey及secure key.
Snip20170330_99.png
1.2 在hello_for_ios.php 中腳本中發(fā)送一個推送
Snip20170330_102.png
推送消息的格式
第四章 對于證書過期的處理
Snip20170330_103.png
4.1到蘋果開發(fā)者中心,找到對應(yīng)的AppID
Snip20170330_104.png
4.2選擇過期的證書 重新生成對應(yīng)的證書
Snip20170330_105.png