以前做過推送, 但只是那種最基本的廣播推送(向所有安裝appde設備通知)椭更, 列播組播這種對指定用戶推送消息還沒做過, 最近剛好有個項目蛾魄,向指定用戶推送物流信息虑瀑、物品狀態(tài)等等。于是前幾天就和也沒做過推送的后臺干起來了褐隆,詳情如下:
我用的是友盟推送复亏, 配置證書這一環(huán)節(jié)直接跳過了准验,這個網(wǎng)上有講的。給大家講一點常識痛侍,友盟推送分生產(chǎn)環(huán)境和開發(fā)環(huán)境。用手機刷上去的就是開發(fā)環(huán)境魔市, 發(fā)布到蘋果商店就是生產(chǎn)環(huán)境主届,沒發(fā)布前怎么模擬呢, 用普通賬號打的ad hoc 包待德, 用企業(yè)賬號打的ad hoc 包或者enterprise包都可以測試生產(chǎn)環(huán)境君丁。
** 開發(fā)環(huán)境下, 你把APP刪掉将宪,重新調試上來绘闷,就會生成一個新的device_token了橡庞!下面的幾個步驟是自己的理解結合網(wǎng)上的資料寫出的想法,大牛們輕的吐槽…… **
1印蔗、傳device_token的時機
后臺向指定用戶做推送扒最,那么必須知道某個用戶的device_token,那么怎么獲取token呢,APP啟動后會在appdelegate的didRegisterForRemoteNotificationsWithDeviceToken方法里返回device_token信息:
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
[UMessage registerDeviceToken:deviceToken];
NSString * token = [[[[deviceToken description] stringByReplacingOccurrencesOfString: @"<" withString: @""]
stringByReplacingOccurrencesOfString: @">" withString: @""]
stringByReplacingOccurrencesOfString: @" " withString: @""];
}
但是后臺向指定用戶推送华嘹, 就必須把uid(用戶ID)和token關聯(lián)起來吧趣,我這里的做法時, 用戶登錄的時候就上傳token信息除呵, 退出登錄的時候再菊, 就清除用戶綁定的token信息, 這樣確保后臺會向用戶最后一次登錄的設備號做推送(只是自己的理解颜曾,當然了纠拔,iOS設備收到推送后,還要判斷用戶是否登錄而且登錄的是不是你要推送的用戶)泛豪。
2稠诲、 收到通知時app的狀態(tài)
收到通知的時候APP的狀態(tài)可能是未啟動、前臺活躍(任何界面)诡曙、后臺等三種臀叙。
未啟動時,點擊通知欄啟動App, 會在didFinishLaunchingWithOptions方法里收到通知內容价卤。
-
剩下兩種會在didReceiveRemoteNotification方法里收到通內容劝萤。
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{ _userInfo = userInfo; //關閉友盟對話框 [UMessage setAutoAlert:NO]; [UMessage didReceiveRemoteNotification:userInfo]; NSLog(@"_______________友盟系統(tǒng)方法 userInfo %@",userInfo); if(userInfo)// 調用appdelegate的分類處理業(yè)務邏輯 [self dealWithMyMessagePush:userInfo]; }
** 代碼里面刪減了一些和推送不相關的代碼,我的項目架構是tab+nav **
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ self.window.rootViewController = [[FDIMGBarController alloc] init]; // 分類 [self UMengShareMethodAndCount:launchOptions]; // 類別 [self FD_updateAppVersion]; NSDictionary* userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; if(userInfo){//推送信息 self.userInfo = userInfo;//[userInfo copy] } return YES; }
未啟動時收到通知慎璧,就判斷字典userInfo是否為空床嫌, 不為空是說明有通知消息。我這里的做法是把她復制給AppDelegate的某個屬性胸私, 在首頁控制器取到AppDelegate的這個值厌处,判斷是否為空,不為空就進行下一步操作岁疼。
-
用戶在前臺或后臺收到消息的時候阔涉, 我會彈出一個彈出框提醒用戶,是否前往我的消息界面捷绒。
5瑰排、 未啟動時首頁控制器邏輯處理
在viewDidLoad方法里:
AppDelegate * app = (AppDelegate *)[UIApplication sharedApplication].delegate;
//pushName 是我給后天約定的通知必傳值,所以我可以根據(jù)他是否為空來判斷是否有通知
NSString * pushName = [[app.userInfo objectForKey:@"aps"] objectForKey:@"alert"];
if(![SYFCustomCLASS SYFIsEmptyOrNull:pushName])
[self getPushInfo:app.userInfo];
如果有通知的話:
-(void)getPushInfo:(NSDictionary *)dict{
if(!IsLogin){// 判斷用戶是否登錄
LoginViewController * loginVC = [[LoginViewController alloc] initWithNibName:@"LoginViewController" bundle:nil];
//通知必返回要通知用戶的uid, 判斷登錄的用戶是不是你要通知的用戶
loginVC.push_uid = dict[@"uid"];
FDNavigationController * loginNav = [[FDNavigationController alloc] initWithRootViewController:loginVC];
[self presentViewController:loginNav animated:YES completion:^{}];
}else
{// 這就文章標題說的某一界面
MyUserMessageVC * messageVC = [[MyUserMessageVC alloc] initWithNibName:@"MyUserMessageVC" bundle:nil];
[self.navigationController pushViewController:messageVC animated:YES];
}
}
當用戶的登錄成功的時候疙驾,在上傳device_token的接口方法里凶伙, 需要判斷登錄用戶的uid是不是你要通知的用戶。如果不是你要通知的用戶它碎,dismiss就好了函荣,結束显押;如果是就要跳轉到我的消息界面。
if(![self.push_uid isEqualToString:currentuid])
[self dismissViewControllerAnimated:YES completion:NULL];
else{
[self dismissViewControllerAnimated:YES completion:^{
AppDelegate * app = (AppDelegate *)[UIApplication sharedApplication].delegate;
//AppDelegate的分類
[app testLoginerUidCorret];
}];
方法如下:
- (void)testLoginerUidCorret{
// 取到tabbarcontroller
FDIMGBarController *tabBarController = ( FDIMGBarController*)self.window.rootViewController;
// 取到navigationcontroller
FDNavigationController * nav = (FDNavigationController *)tabBarController.selectedViewController;
//取到nav控制器當前顯示的控制器
UIViewController * baseVC = (UIViewController *)nav.visibleViewController;
//如果是當前控制器是我的消息控制器的話傻挂,刷新數(shù)據(jù)即可
if([baseVC isKindOfClass:[MyUserMessageVC class]])
{
MyUserMessageVC * vc = (MyUserMessageVC *)baseVC;
[vc reloadMessageData];
return;
}
// 否則乘碑,跳轉到我的消息
MyUserMessageVC * messageVC = [[MyUserMessageVC alloc] initWithNibName:@"MyUserMessageVC" bundle:nil];
[nav pushViewController:messageVC animated:YES];
}
6、應用在前臺或后臺的邏輯處理
邏輯和未啟動時很多情況都是類似金拒,彈出提醒框兽肤, 點擊立即前往時,判斷用戶是否登錄绪抛,如果用戶登錄资铡,直接跳轉到我的消息界面;沒有登錄請參考上面邏輯幢码。
** 由于第一次做推送某一頁面笤休,寫的不好處,請大家多多交流指點症副,有疑問或更好的想法的可以和我說店雅。 **