回憶起當(dāng)初做推送功能的時(shí)候瘫拣,踩過(guò)一些坑亿絮,也得到了一些經(jīng)驗(yàn)》髡。總歸推送的模塊實(shí)現(xiàn)按如下步驟來(lái)壹无。
1.先確定的推送消息需要跳轉(zhuǎn)的界面。將其寫成單獨(dú)的xib感帅,方便之后present斗锭。
2.像蘋果申請(qǐng)APNS證書并且將其制作成.p12文件,將其傳給極光推送失球。
3.得到appkey岖是,并且按照J(rèn)PUSH中的iOS+SDK+Integration+Guide.pdf將極光推送的框架集成進(jìn)入app代碼。
4.服務(wù)器根據(jù)registrationID來(lái)對(duì)用戶進(jìn)行分類推送实苞,我們需要處理得到的消息豺撑。
5.解析得到的userInfoDic,并跳轉(zhuǎn)到需要顯示消息的頁(yè)面黔牵。
得到消息之后聪轿,主要需要進(jìn)行的操作是如何進(jìn)行跳轉(zhuǎn)。我們需要獲取當(dāng)前顯示的vc界面猾浦。
方法1.
// 取到tabbarcontroller
TabBarViewController *tabBarController = (TabBarViewController*)self.window.rootViewController;
// 取到navigationcontroller
MyNavigationController * nav = (MyNavigationController*)tabBarController.selectedViewController;
//取到nav控制器當(dāng)前顯示的控制器
UIViewController *baseVC = (UIViewController *)nav.visibleViewController;
[baseVC.navigationController pushViewController:XXVC animated:YES];//PUSH過(guò)去
方法2.
- (UIViewController *)getCurrentVC{
UIViewController *result = nil;
UIWindow * window = [[UIApplication sharedApplication] keyWindow];
//app默認(rèn)windowLevel是UIWindowLevelNormal陆错,如果不是,找到UIWindowLevelNormal的
if (window.windowLevel != UIWindowLevelNormal)
{
NSArray *windows = [[UIApplication sharedApplication] windows];
for(UIWindow * tmpWin in windows)
{
if (tmpWin.windowLevel == UIWindowLevelNormal)
{
window = tmpWin;
break;
}
}
}
id nextResponder = nil;
UIViewController *appRootVC=window.rootViewController;
// 如果是present上來(lái)的appRootVC.presentedViewController 不為nil
if (appRootVC.presentedViewController) {
nextResponder = appRootVC.presentedViewController;
}else{
UIView *frontView = [[window subviews] objectAtIndex:0];
nextResponder = [frontView nextResponder];
}
if ([nextResponder isKindOfClass:[UITabBarController class]]){
UITabBarController * tabbar = (UITabBarController *)nextResponder;
UINavigationController * nav = (UINavigationController *)tabbar.viewControllers[tabbar.selectedIndex];
// UINavigationController * nav = tabbar.selectedViewController ; 上下兩種寫法都行
result=nav.childViewControllers.lastObject;
}else if ([nextResponder isKindOfClass:[UINavigationController class]]){
UIViewController * nav = (UIViewController *)nextResponder;
result = nav.childViewControllers.lastObject;
}else{
result = nextResponder;
}
return result;
}
兩個(gè)方法均能獲取當(dāng)前最前顯示的UIViewController金赦。方法一比較簡(jiǎn)便但是有內(nèi)容缺陷音瓷。當(dāng)你的應(yīng)用處于如游客時(shí)沒(méi)有TabBarViewController,當(dāng)?shù)顷懞髉resent到一個(gè)新的TabBarViewController導(dǎo)航控制器夹抗,當(dāng)用戶處于任意一個(gè)RootViewController時(shí)绳慎,使用方法一會(huì)造成crash。
當(dāng)iOS推送給你的時(shí)候:會(huì)主動(dòng)調(diào)用application的代理方法,userInfoDic里就存著遠(yuǎn)程推送的內(nèi)容杏愤。
- (void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo
fetchCompletionHandler:
(void (^)(UIBackgroundFetchResult))completionHandler {
[JPUSHService handleRemoteNotification:userInfo];
userInfoDic = [[NSDictionary alloc]init];
userInfoDic = userInfo;
completionHandler(UIBackgroundFetchResultNewData);
}
技術(shù)外的話:推送功能特別是遠(yuǎn)程push靡砌,并不是即時(shí)接受,甚至很久之后才收到這也是正常的珊楼。所以盡量能夠確定時(shí)間的活動(dòng)乏奥,通過(guò)利用app內(nèi)部的json字段來(lái)注冊(cè)本地推送,達(dá)到定時(shí)的效果亥曹。