在很多項目開發中,大家都做過推送!例如:極光推送、信鴿推送、個推等等一系列的推送。我們使用的都是集成過後的SDK,其原理都是相同的。
這裡我們來做一下百度推送。
登錄百度雲推送:http://push.baidu.com/fc。填寫相關資料、審核。
審核通過後下載SDK,創建應用(上傳相應的推送證書格式看要求到出),默認創建的應用是,開發者測試的,上線後要改成生產的。
1)所使用的SDK很簡單。(裡面有個測試音頻text.caf)
2)相應的庫是否導入
3)證書要帶推送功能
1)啟動時寫的
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//***********************關於如何設置badge角標加1的方法***********************
/*
服務端推送的badge是幾就會顯示幾,你只需要跟服務端同步消息數目,然後讓服務端自己,該推送幾,就推送幾,比如你應用打開的時候,或者進入後台的時候跟服務端同步,這個點,需要你們自己去設計,應用沒有消息的時候,服務端推送了1,當應用打開時候,告訴服務端,app沒點擊通知,那下次應用推送2,依次類推。
*/
// iOS8 下需要使用新的 API
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 測試 開發環境 時需要修改BPushMode為BPushModeDevelopment 需要修改Apikey為自己的Apikey
// 在 App 啟動時注冊百度雲推送服務,需要提供 Apikey
[BPush registerChannel:launchOptions apiKey:@"Apikey改成自己的" pushMode:BPushModeDevelopment withFirstAction:nil withSecondAction:nil withCategory:nil isDebug:YES];
// App 是用戶點擊推送消息啟動
NSDictionary *userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (userInfo) {
NSLog(@"從消息啟動:%@",userInfo);
[BPush handleNotification:userInfo];
}
//角標清0
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
}
2)點擊推送消息
// 此方法是 用戶點擊了通知,應用在前台 或者開啟後台並且應用在後台 時調起
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
completionHandler(UIBackgroundFetchResultNewData);
NSLog(@"********** iOS7.0之後 background **********");
// 應用在前台 或者後台開啟狀態下,不跳轉頁面,讓用戶選擇。
if (application.applicationState == UIApplicationStateActive || application.applicationState == UIApplicationStateBackground) {
NSLog(@"acitve or background");
UIAlertView *alertView =[[UIAlertView alloc]initWithTitle:@"收到一條消息" message:userInfo[@"aps"][@"alert"] delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"確定", nil];
[alertView show];
}
else//殺死狀態下,直接跳轉到跳轉頁面。
{
//這裡實現頁面跳轉
}
}
3)注冊推送服務
// 在 iOS8 系統中,還需要添加這個方法。通過新的 API 注冊推送服務
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
{
[application registerForRemoteNotifications];
}
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
NSLog(@"test:%@",deviceToken);
[BPush registerDeviceToken:deviceToken];
[BPush bindChannelWithCompleteHandler:^(id result, NSError *error) {
// 需要在綁定成功後進行 settag listtag deletetag unbind 操作否則會失敗
if (result) {
[BPush setTag:@"Mytag" withCompleteHandler:^(id result, NSError *error) {
if (result) {
NSLog(@"設置tag成功");
}
}];
}
}];
}
// 當 DeviceToken 獲取失敗時,系統會回調此方法
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
NSLog(@"DeviceToken 獲取失敗,原因:%@",error);
}
4)收到推送消息時
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
// App 收到推送的通知
[BPush handleNotification:userInfo];
NSLog(@"********** ios7.0之前 **********");
// 應用在前台 或者後台開啟狀態下,不跳轉頁面,讓用戶選擇。
if (application.applicationState == UIApplicationStateActive || application.applicationState == UIApplicationStateBackground) {
NSLog(@"acitve or background");
UIAlertView *alertView =[[UIAlertView alloc]initWithTitle:@"收到一條消息" message:userInfo[@"aps"][@"alert"] delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"確定", nil];
[alertView show];
}
else//殺死狀態下,直接跳轉到跳轉頁面。
{
}
}
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
NSLog(@"接收本地通知啦!!!");
[BPush showLocalNotificationAtFront:notification identifierKey:nil];
}
說說我的思路和做法:本地存一個參數1或者0 ,例如:status用於存放狀態。加一個按鈕,點擊關閉狀態status存放0,同時UIUserNotificationType設置為:UIUserNotificationTypeNone UIRemoteNotificationType設置為:UIRemoteNotificationTypeNone 反之設置回聲音、徽章、彈窗提醒。
其他的跳轉頁面等操作可以預判所存放狀態status.