一.iOS證書指導
在 iOS App 中加入消息推送功能時,必須要在 Apple 的開發者中心網站上申請推送證書,每一個 App 需要申請兩個證書,一個在開發測試環境下使用,另一個用於上線到 AppStore 后的生產環境。
7.1 為你的 App 創建 App ID
iOS 中每個 App 都需要對應一個 App ID,同一個公司可能會使用類似於 com.example.*
這樣通用的 App ID,但是如果要在 App 中加入消息推送功能,那么是不能使用通用 ID 的,需要為之單獨創建一個。
首先登陸 iOS Dev Center ,然后進入 Member Center,然后選擇 Certificates,Identifiers & profiles,如下圖:
然后點擊下圖紅框中的任意條目,進入證書界面,如下圖:
在進入證書界面后,在左邊的Identifiers選擇中選定App IDs,點右上角加號創建Appid,如下圖:
在創建 App ID 的過程中,需要勾選 Push 服務,如下圖:
進入提交頁面,push服務處於configurable狀態,如下圖:
點擊submit后到確認頁面,如下圖:
點擊done后到初始頁面,然后再次選擇自己創建的appid,如下圖:
在下圖中選擇edit按鈕,配置推送的環境,如圖:
然后配置好對應的推送環境,個人版和企業版的開發環境都是選擇創建Development SSL Certificate類型的。個人版和企業版的發布環境。發布環境分以下三種:1. in-house必須是企業開發賬戶(企業內)(299美金) 2.ad-hoc個人賬戶或公司Company賬戶(99美金),但只用於內部測試(總共100個設備).3.上線Appstore只能是個人賬戶或公司Company賬戶(99美金))如下圖:
如果你是為已有的 App 增加消息推送功能,那么打開原有的 App ID,開啟 Push Notification 選項即可。流程跟上面的一樣。
7.2 創建及下載證書
點擊 Create Certificate按鈕后會出現“About Creating a Certificate Signing Request (CSR)”,如下圖:
到了這里,需要停下制作 CSR 文件,制作過程比較簡單,下面是制作的過程。打開 Mac 系統軟件'鑰匙串訪問',選擇 '證書助理' 及 '從證書頒發機構請求證書',制作 CSR 文件,如下圖:
生成證書后,返回到 “About Creating a Certificate Signing Request (CSR)” 的界面,點擊 continue,然后在 “Choose File” 選擇生成的CSR文件,最后點擊 Generate,生成證書。如下圖:
現在證書制作已經完成。下載並雙擊用“鑰匙串訪問” 程序打開后,在左邊一欄,上面選擇登錄,下面選擇證書,然后選擇剛剛打開的證書,切記不要展開它,直接右擊導出p12,如下圖:
將文件保存為 .p12 格式,輸入密碼,如圖所示:
最后進入終端,到證書目錄下,運行以下命令將p12文件轉換為pem證書文件:
openssl pkcs12 -in MyApnsCert.p12 -out MyApnsCert.pem -nodes
提示需要輸入密碼,輸入剛才導出 p12 時的密碼即可。
Provisioning Profile的創建 點擊下圖的+按鈕開始創建profile
選擇profile的環境
選擇創建profile的appid和開發者證書,並選擇設備,最后生成profile
最后下載profile配置到xcode中進行開發測試
最后得到的證書
2.創建工程:
點擊進入新建或已有的工程,將會顯示出應用的基本信息,其中 API key 和 appid 需要在 Demo 中使用,如圖所示:
進入左邊導航欄,選擇“雲推送”功能,首次選擇時,需要進行【推送設置】,如圖所示:
說明(iOS):
開發證書:需上傳推送證書的“開發版本” 的pem文件。
生產證書:需上傳推送證書的“生產版本” 的pem文件。
部署狀態:開發測試期間選擇 【開發狀態】,待 App 上線完成后可更改為【生產狀態】。
這里選 擇了什么狀態就要上傳什么證書要一一對應

3.用百度Demo進行測試 (一般選擇開發測試)
打開下載好的百度推送SDK選擇開發測試Demo:
修改工程設置
選擇相應的Demo分開發Demo和發布Demo打開.xcodeproj 工程,首先需要修改 Bundle Identifier ,修改為在創建證書時所選擇的 Bundle ID,如下圖:
修改下面方法中的apikey的值為自己的apikey,並配置為自己的證書,如下圖:
3.5 運行Demo應用
若以上步驟均無誤,即可對 Demo 進行真機測試(推送通知必須在真機環境下進行測試)。如下圖所示
3.6 Demo客戶端查看消息
打開Demo后,可以綁定、解綁以及添加刪除tag,Demo界面會顯示服務器返回數據。在綁定成功后,使用百度開放服務平台推送消息,進入指定的應用,選擇雲推送,將顯示以下界面,如圖所示:
4.自己創建工程實現百度推送:
第一步:
添加SDK到工程中

添加到SDK到工程中的步驟如下:
• 將libBPush.a和BPush.h添加到自己的工程下,添加時需要注意勾選當前Target
2.添加依賴庫:
• SDK需要以下庫:Foundation.framework、CoreTelephony.framework、libz.dylib、SystemConfiguration.framework,請在工程中添加。
3.開啟Remote notifications:
客戶端設置開啟Remote notifications,需要在Xcode 中修改應用的 Capabilities 開啟Remote notifications,(紅框內的必須要做哦)請參考下圖:
ios7之后如果像上面一樣設置好了,並且服務端aps字段中添加content-available字段為1的話,了那么收到遠程通知后,應用在后台的話會在下面的方法中接受到遠程通知,對應程序中的代碼是(注意,iOS7之后沒有開啟后台的話也可以通過點擊通知調起下面的方法只是不能在后台狀態下運行一段代碼):
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
4.寫代碼:
AppDelegate.m中
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
ViewController *vc = [[ViewControlleralloc]init];
UINavigationController *nav = [[UINavigationControlleralloc]initWithRootViewController:vc];
self.window.rootViewController = nav;
// iOS8下需要使用新的 API
if ([[[UIDevicecurrentDevice]systemVersion]floatValue] >=8.0) {
UIUserNotificationType myTypes =UIUserNotificationTypeBadge |UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
UIUserNotificationSettings *settings = [UIUserNotificationSettingssettingsForTypes:myTypescategories:nil];
[[UIApplicationsharedApplication]registerUserNotificationSettings:settings];
}else {
UIRemoteNotificationType myTypes =UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeSound;
[[UIApplicationsharedApplication]registerForRemoteNotificationTypes:myTypes];
}
[BPushregisterChannel:launchOptionsapiKey:@"0KLGrI7nYN3WOcHDTYGwobn3"pushMode:BPushModeDevelopmentwithFirstAction:nilwithSecondAction:nilwithCategory:nilisDebug:YES];
// App是用戶點擊推送消息啟動
NSDictionary *userInfo = [launchOptionsobjectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (userInfo) {
NSLog(@"從消息啟動:%@",userInfo);
[BPushhandleNotification:userInfo];
}
#if TARGET_IPHONE_SIMULATOR
Byte dt[32] = {0xc6,0x1e,0x5a,0x13,0x2d,0x04,0x83,0x82,0x12,0x4c,0x26,0xcd,0x0c,0x16,0xf6,0x7c,0x74,0x78,0xb3,0x5f,0x6b,0x37,0x0a,0x42,0x4f,0xe7,0x97,0xdc,0x9f,0x3a,0x54,0x10};
[selfapplication:applicationdidRegisterForRemoteNotificationsWithDeviceToken:[NSDatadataWithBytes:dtlength:32]];
#endif
//角標清0
[[UIApplicationsharedApplication]setApplicationIconBadgeNumber:0];
returnYES;
}
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
{
[application registerForRemoteNotifications];
}
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
NSLog(@"接收本地通知啦!!!");
[BPushshowLocalNotificationAtFront:notificationidentifierKey:nil];
}
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
NSLog(@"DeviceToken獲取失敗,原因:%@",error);
}
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
NSLog(@"test:%@",deviceToken);
[BPushregisterDeviceToken:deviceToken];
[BPushbindChannelWithCompleteHandler:^(id result,NSError *error) {
//需要在綁定成功后進行 settag listtag deletetag unbind操作否則會失敗
if (result) {
[BPushsetTag:@"Mytag"withCompleteHandler:^(id result,NSError *error) {
if (result) {
NSLog(@"設置tag成功");
}
}];
}
}];
}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
// App收到推送的通知
[BPushhandleNotification:userInfo];
NSLog(@"********** ios7.0之前 **********");
//應用在前台或者后台開啟狀態下,不跳轉頁面,讓用戶選擇。
if (application.applicationState ==UIApplicationStateActive || application.applicationState ==UIApplicationStateBackground) {
NSLog(@"acitve or background");
UIAlertView *alertView =[[UIAlertViewalloc]initWithTitle:@"收到一條消息"message:userInfo[@"aps"][@"alert"]delegate:selfcancelButtonTitle:@"取消"otherButtonTitles:@"確定",nil];
[alertView show];
}
NSLog(@"%@",userInfo);
}
5.真機測試:由於推送功能在模擬器上無法調試,所以只能在真機上進行測試
可以根據打印日志里面的
"channel_id" 實現單播(對指定的手機發送通知)
確定發送,手機收到通知:
當發送廣播時,所有的設備都可以收到通知 :
手機收到通知: