1. 程式人生 > >iOS極光推送 點選推送訊息跳轉頁面

iOS極光推送 點選推送訊息跳轉頁面

最近在搞極光推送,之前用的百度推送,但是訊息延遲的厲害,就換了極光,換就換吧,無所謂反正我不會,於是就開始看極光推送文件,心裡罵著跟百度的文件詳細程度不能比啊,文件很短一會兒就看完,其實文件的主要程式碼這些推送平臺都一樣,說到這我想吐槽一下,本來以為推送很容易,實際就是容易,但是被後臺和安卓開發人員弄的我一頭霧水,一陣惱火!剛開始後臺返回的是推送訊息是一段JSON資料,其實正確的就應該返回JSON資料,但是後臺推送給我的通知訊息,他妹的就是直接能看到資料結構的內容,什麼{aps:"sb123"}這種型別的,讓我無語的難以形容當時的心情,後來他按照安卓開發人員的要求,把通知訊息,換成了自定義訊息,通知和自定義訊息 完全就是兩碼事,通知訊息是不能改變的,而自定義訊息就不同了,完全由開發人員來搞了,通知可以隨時都能收到訊息,但是自定義訊息就沒那麼隨意了,自定義訊息只有程式執行在前臺的時候才會收到提示,所以我帶著不樂意的心情讓後臺看了iOS的推送文件,讓他自己琢磨去吧,後來還好他看了文件終於上道了,搞定了,好了不廢話了,上程式碼!
這些程式碼不能缺少:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_7_1
    if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
        [APService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge
|UIUserNotificationTypeSound | UIUserNotificationTypeAlert) categories:nil]; } else { [APService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge |UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert) #else categories:nil]; [APService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge
| UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert) #endif categories:nil]; } [APService setupWithOption:launchOptions]; if (launchOptions) { NSDictionary * remoteNotification = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; //這個判斷是在程式沒有執行的情況下收到通知,點選通知跳轉頁面 if (remoteNotification) { NSLog(@"推送訊息==== %@",remoteNotification); [self goToMssageViewControllerWith:remoteNotification]; } } }
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings{
    [application registerForRemoteNotifications];
}
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{
    [APService registerDeviceToken:deviceToken];
    NSLog(@"%@", [NSString stringWithFormat:@"Device Token: %@", deviceToken]);
}

// 當 DeviceToken 獲取失敗時,系統會回撥此方法

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error{
    NSLog(@"DeviceToken 獲取失敗,原因:%@",error);
}
  • 下面的這個方法也很重要,這裡主要處理推送過來的訊息
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
    NSLog(@"尼瑪的推送訊息呢===%@",userInfo);
   // 取得 APNs 標準資訊內容,如果沒需要可以不取
    NSDictionary *aps = [userInfo valueForKey:@"aps"];
    NSString *content = [aps valueForKey:@"alert"]; //推送顯示的內容
    NSInteger badge = [[aps valueForKey:@"badge"] integerValue]; 
    NSString *sound = [aps valueForKey:@"sound"]; //播放的聲音
    // 取得自定義欄位內容,userInfo就是後臺返回的JSON資料,是一個字典
    [APService handleRemoteNotification:userInfo];
    application.applicationIconBadgeNumber = 0;
    [self goToMssageViewControllerWith:userInfo];
    }
- (void)applicationWillEnterForeground:(UIApplication *)application {
    [application setApplicationIconBadgeNumber:0];   //清除角標
    [application cancelAllLocalNotifications];
}
- (void)goToMssageViewControllerWith:(NSDictionary*)msgDic{
    //將欄位存入本地,因為要在你要跳轉的頁面用它來判斷,這裡我只介紹跳轉一個頁面,
    NSUserDefaults*pushJudge = [NSUserDefaults standardUserDefaults];
    [pushJudge setObject:@"push"forKey:@"push"];
    [pushJudge synchronize];
    NSString * targetStr = [msgDic objectForKey:@"target"];
    if ([targetStr isEqualToString:@"notice"]) {
        MessageVC * VC = [[MessageVC alloc]init];
        UINavigationController * Nav = [[UINavigationController alloc]initWithRootViewController:VC];//這裡加導航欄是因為我跳轉的頁面帶導航欄,如果跳轉的頁面不帶導航,那這句話請省去。
        [self.window.rootViewController presentViewController:Nav animated:YES completion:nil];

    }
}
  • 下面介紹要跳轉的頁面MessageVC裡面要做什麼處理,其實裡面的程式碼也很簡單。看程式碼,在viewWillAppear裡面自行建立一個返回按鈕,根據在AppDelegate裡面用NSUserDefaults儲存的欄位做判斷。
-(void)viewWillAppear:(BOOL)animated{
    [self.navigationController setNavigationBarHidden:NO animated:YES];
    [super viewWillAppear:YES];
    NSUserDefaults*pushJudge = [NSUserDefaults standardUserDefaults];
    if([[pushJudge objectForKey:@"push"]isEqualToString:@"push"]) {
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"[email protected]"] style:UIBarButtonItemStylePlain target:self action:@selector(rebackToRootViewAction)];
    }else{
        self.navigationItem.leftBarButtonItem=nil;
    }
}
- (void)rebackToRootViewAction {
    NSUserDefaults * pushJudge = [NSUserDefaults standardUserDefaults];
    [pushJudge setObject:@""forKey:@"push"];
    [pushJudge synchronize];//記得立即同步
    [self dismissViewControllerAnimated:YES completion:nil];
}

這樣就搞定了。下面貼出後臺返回的欄位,我是根據這些地段判斷跳轉不同的頁面。


螢幕快照 2015-11-24 下午8.50.02.png


下圖是後臺給的介面文件


螢幕快照 2015-11-24 下午9.35.55.png


上述程式碼可能會有點亂,如有疑問請留言
看了一下太程式碼太亂下面上截圖


螢幕快照 2015-11-24 下午9.39.05.png
螢幕快照 2015-11-24 下午9.40.08.png
螢幕快照 2015-11-24 下午8.58.11.png
螢幕快照 2015-11-24 下午9.40.43.png

上面5個圖裡面的程式碼都在AppDelegate.m裡面

下面一個圖是在MessageVC裡面,就是你要跳轉的那個頁面


螢幕快照 2015-11-24 下午9.42.27.png

其實這樣做是很nice的,上面寫的有時候會出現bug,可以去試一下



文/我就叫CC怎麼了(簡書作者)
原文連結:http://www.jianshu.com/p/eaf07c4372a8
著作權歸作者所有,轉載請聯絡作者獲得授權,並標註“簡書作者”。

相關推薦

存快取並頁面併到頁面取快取

之前頁面的              html: <image bindtap='ontTapdetails' data-item_data='{{

iOS極光 訊息頁面

最近在搞極光推送,之前用的百度推送,但是訊息延遲的厲害,就換了極光,換就換吧,無所謂反正我不會,於是就開始看極光推送文件,心裡罵著跟百度的文件詳細程度不能比啊,文件很短一會兒就看完,其實文件的主要程式碼這些推送平臺都一樣,說到這我想吐槽一下,本來以為推送很容易,實際就是容易

極光——帶(BroadCastReceive中訊息

使用極光推送 1、極光推送頻驟可參考極光官網配置進行配置需註冊。 到極光官網下載SDK解壓jpush-android-arm, jpush-android-(cpu-type)-2.x.x.zip 整合壓縮包內容 AndroidManifest_andr

ios開發:怎麼實現一個按鈕,到一個新的介面,並回退到上一介面

iOS三種檢視切換的原理各不相同:UITabBarController:以平行的方式管理檢視,各個檢視之間往往關係並不大,每個加入到UITabBarController的檢視都會進行初始化即使當前不顯示在介面上,相對比較佔用記憶體。UINavigationControlle

小程式輪播圖到tab導航介面

需求:小程式點選輪播圖跳轉到tab導航介面,效果如下所示 點選輪播圖的圖片,跳轉到我的介面上 先實現以下的程式碼,在以下的基礎上,開始實現需求 微信小程式底部導航欄https://www.jianshu.com/p/89a63dc99839 微信小程式輪播

微信小程式多次navigator無反應

今天在弄微信小程式的時候使用到navigator元件實現跳轉出現了一個問題就是我點選我設定的button然後用navigator巢狀進去,當沒點選一次button就可以跳轉到相應的介面,當我重複四次的時候問題出現了,不管我怎麼點選也不會跳轉,最後還是通過百度找到了解決方案。 【程式碼展示】

collectionView必須兩次才

  今天遇到一個很奇怪的現象:collectionView必須點選兩次才能跳轉。具體看程式碼: -(void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *

涉及多個Fragment,其中一個fragment中的“登入”按鈕,到“登入”介面時,出現程式閃退現象

問題說明:我想實現從當前fragment_me中點選一下登入按鈕,跳轉到登入介面,所以我在MeFragment.java裡的onCreate()方法中為TextView控制元件新增監聽事件。但在實際執行中,我點選“Me”之後,會出現閃退現象。 錯誤:空指標異常 出現閃

a標籤超連結 javascript:void(0),超連結不,不響應

讓超連結點選後不跳轉,可以用href = "#",但是這個#就會錨點到頁面最上邊     點選連結後不跳轉可以設定成     1.<a href="javascript:void(0);" >javascript:void(0);</a>     2

eclipse ctrl+滑鼠左鍵並類名不到class類而是到jar包設定

目標: eclipse ctrl+滑鼠左鍵點選類名不跳轉到class類而是跳轉到jar包設定 問題描述:剛一開始我點選【ctrl+滑鼠左鍵】選擇某個類名:com.apache.testClass  會自動跳轉到類:test.jar中,但是不知道為何突然,每次點的時候  

Android實現ListView顯示資訊,每個item,到相應介面

介面如下:(做這個目的僅僅是為了學習一點小知識,因為自己才剛開始) 實現的方法比較簡單,就是定義一個ListView,然後設定監聽,ListView對每個條目的監聽是setOnItemClickListener。 onItemClick(AdapterView&

第三方App關注公眾號,到微信公眾號的實現方法.

現在越來越多的App都要求關注公眾號,實現跳轉到微信公眾號介面,或者已經關注的人,直接進來微信公眾號中聊天! 在之前可以通過以下方式實現跳轉:// Intent i = new Intent(Intent.ACTION_VIEW); //

recyclerview的item(eventbus)傳值

**第一步,匯入依賴,如: /*recyclerview依賴*/ compile 'com.android.support:recyclerview-v7:26.1.0' /*fresco載入圖片*/ compile 'com.f

notification並帶資料到具體頁面

public int notify(MPushMessage message, Intent clickIT) { if (message == null || clickIT == null) return -1; Integer nid = messag

android 分享的連結到應用程式

我們時常會遇到這種需求,點選一個連結跳轉到我們的應用程式當中。 (點選一個連結跳轉到一個下載apk的html,這是沒有安裝這個apk的情況,如果安裝了可以直接跳轉到我們的apk應用當中) 如果需要帶入資料過去只需在連結的網址上加入引數即可例如: <a href="ht

UITableViewCell兩次才解決辦法

今天寫專案的時候出現一個很奇怪的現象,就是每次點選cell的時候需要點選兩次,才能進入。比如  :要先點選一下10000000這個cell,再點選0999990099這個cell才會進入,但是在tableView:(UITableView *)tableView didS

使用YYText-文字藍色文字實現超連結

NSString *text = @"唐寅,生於成化六年二月初四,卒於嘉靖二年十二月二日,字伯虎,後改字子畏,號六如居士、桃花庵主、魯國唐生、逃禪仙吏等,明代畫家、書法家、詩人。"; NSMutableAttributedString *one = [[NSMutableA

ListView 很短的時間內連續同一個item會兩次

我得解決方案是自定義一個方法 public abstract class NoDoubleItemClickListener implements OnItemClickListener { public static final int MIN_CLICK_DE

a標籤不連結

a標籤已經設定href的情況下不做跳轉動作,直接給a標籤新增一個點選事件就行了。 html程式碼: <div id="hf"> <a href="www.google.cn">

wampserver 一切正常,開啟localhost專案資料夾失敗

在www資料夾下建立myPhpTest資料夾,新建一個test.php檔案,開啟localhost一切正常,點選myPhpTest資料夾想檢視裡面的php檔案時跳轉失敗如下: 解決辦法:找到w