美文网首页iOS分享世界iOS地图iOS直播视频
极光推送点击消息栏跳转到指定页面、设置标签或别名

极光推送点击消息栏跳转到指定页面、设置标签或别名

作者: 若锦 | 来源:发表于2016-11-07 17:57 被阅读5279次

    上周,完成app新版本的开发。自从进入这版app的开发就没来更新过文章了,接下来会陆陆续续写一下在这过程中遇到的问题及一些总结。今天,就先说说消息推送吧。

    推送,大家都不陌生,没有推送功能的app估计是少数。当然,对于推送介绍的文章也非常多也很仔细,但是真正开发过程中,还是会遇到各种问题,接下来会和大家谈谈集成推送的方法及我在开发中遇到的问题,但愿能给你们开发中遇到类似的问题时提供一种思路。

    在推送过程我遇到的问题主要有:
    1.在点击消息栏进入指定页面后,页面的点击事件不响应
    2.点击消息栏进入指定页面后,页面的导航栏问题

    其实这两个问题,归根结底是因为跳转时选择的控制器不对。比如当我点击消息栏时,希望跳转到A页面,A中没有导航栏。我开始用的是[self.window.rootViewController presentViewController:A animated:YES completion:nil],这时候跳转到A页面后,A页面中控件的点击事件不起作用了,后面发现,是因为层级图不对。而且用present的话,没有导航栏,所以当你跳转到指定页面A时,如果A页面的点击事件还有跳转到新页面B的功能,那么这个当你通过A push出来的B页面是没有导航栏的,而实际上我们希望的B是有导航栏的。

    最后换成了pushViewController的方法。这个方法的关键是,你得找到当前的的VC,比如A页面是通过tabbar的第一个item中的VC的navpush出来的,那么这时候,只要找到tabbar第一个Item对应的nav中VC,然后用这个VC的 nav
    push出A页面,问题就可以解决了。

    接下来,说说该如何集成极光推送、如何处理收到通知时的页面跳转问题,以及如何设置标签和别名。

    一、处理收到通知时页面跳转问题。
    1.你需要到极光推送的平台上申请appkey,申请的过程中需要上传开发环境和正式环境的消息推送证书,所以如果你的app还没有消息推送证书,那么你需要到苹果的开发者账号中申请消息推送证书。如果对这个步骤不是很了解的话,可以参照iOS 证书 设置指南

    2.申请好极光推送的appkey后,将下载的SDK拖到自己的工程中,添加相应的framework,配置好相关信息。也可参照官方文档
    iOS SDK 集成指南

    3.在 AppDelegate.m引入

    #import "JPUSHService.h"
    #ifdef NSFoundationVersionNumber_iOS_9_x_Max
    #import <UserNotifications/UserNotifications.h>
    #endif```
     
    在` - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions`中注册极光推送
    
    • (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

      self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
      self.window.backgroundColor = [UIColor whiteColor];
      [self initRootViewController];

    if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) {
        //iOS10以上
        JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init];
        entity.types = UNAuthorizationOptionAlert|UNAuthorizationOptionBadge|UNAuthorizationOptionSound;
        [JPUSHService registerForRemoteNotificationConfig:entity delegate:self];
    }else if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
        //iOS8以上可以添加自定义categories
        [JPUSHService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge |
                                                          UIUserNotificationTypeSound |
                                                          UIUserNotificationTypeAlert)
                                              categories:nil];
    }
    else {
        //iOS8以下categories 必须为nil
        [JPUSHService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge |
                                                          UIRemoteNotificationTypeSound |
                                                          UIRemoteNotificationTypeAlert)
                                              categories:nil];
    }
    BOOL isProduction = NO;// NO为开发环境,YES为生产环境
    
    //Required(2.1.5版本的SDK新增的注册方法,改成可上报IDFA,如果没有使用IDFA直接传nil
    [JPUSHService setupWithOption:launchOptions appKey:@"你的极光推送appkey"
                          channel:nil
                 apsForProduction:isProduction
            advertisingIdentifier:nil];
    
    //2.1.9版本新增获取registration id block接口。可以获取registrationID
    [JPUSHService registrationIDCompletionHandler:^(int resCode, NSString *registrationID) {
        if(resCode == 0){
            NSLog(@"registrationID获取成功:%@",registrationID);
            
        }
        else{
            NSLog(@"registrationID获取失败,code:%d",resCode);
        }
    }];
    
    
    return YES;
    

    }

    
    注册deviceToken
    

    pragma mark--注册devicetoken

    • (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {

      [JPUSHService registerDeviceToken:deviceToken];
      }

    收到通知时的处理 ,这里需要注意一下,iOS10收到通知时的方法和iOS10以前的不一样  
    
    • (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
      [JPUSHService handleRemoteNotification:userInfo];

      completionHandler(UIBackgroundFetchResultNewData);

      if (_application.applicationState == UIApplicationStateActive) {
      //程序运行时收到通知,先弹出消息框

        [self getPushMessageAtStateActive:userInfo];
      

      }

      else{
      //程序已经关闭或者在后台运行
      [self pushToViewControllerWhenClickPushMessageWith:userInfo];

      }

      [application setApplicationIconBadgeNumber:0];

      [JPUSHService handleRemoteNotification:userInfo];

      completionHandler(UIBackgroundFetchResultNewData);
      }

    ifdef NSFoundationVersionNumber_iOS_9_x_Max

    pragma mark- JPUSHRegisterDelegate

    -(void)jpushNotificationCenter:(UNUserNotificationCenter *)center
    willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler {

    NSDictionary * userInfo = notification.request.content.userInfo;
    UNNotificationRequest *request = notification.request; // 收到推送的请求
    UNNotificationContent *content = request.content; // 收到推送的消息内容
    
    
    if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
        [JPUSHService handleRemoteNotification:userInfo];
        
        
        if (_application.applicationState == UIApplicationStateActive) {
            //程序运行时收到通知,先弹出消息框
          
            [self getPushMessageAtStateActive:userInfo];
            
        }
    
        else{
         
            [self pushToViewControllerWhenClickPushMessageWith:userInfo];
        }
        
    }
    // 需要执行这个方法,选择是否提醒用户,有Badge、Sound、Alert三种类型可以设置
    completionHandler(UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert);
    

    }
    //
    -(void)jpushNotificationCenter:(UNUserNotificationCenter *)center
    didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {
    NSDictionary * userInfo = response.notification.request.content.userInfo;
    [[NSUserDefaults standardUserDefaults] setObject:@"Inactive" forKey:@"applicationState"];

    if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
        [JPUSHService handleRemoteNotification:userInfo];
        
        
        if (_application.applicationState == UIApplicationStateActive) {
            //程序运行时收到通知,先弹出消息框
            [self getPushMessageAtStateActive:userInfo];
            
            [[NSNotificationCenter defaultCenter] postNotificationName:@"ApplicationState" object:@"0"];
            
        }
        
        else{
            
            [self pushToViewControllerWhenClickPushMessageWith:userInfo];
        }
        
    }
    completionHandler();  // 系统要求执行这个方法
    

    }

    endif

    如果在程序运行时收到通知,这时消息栏不会显示通知,所以如果想让用户收到通知的话,应该是给用户一个弹框提醒,告诉用户有消息通知,当用户点击提示框中的确认查看按钮时,跳转到指定的页面
    

    pragma mark -- 程序运行时收到通知

    -(void)getPushMessageAtStateActive:(NSDictionary *)pushMessageDic{

        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@""
                                                                                 message:[[pushMessageDic objectForKey:@"aps"]objectForKey:@"alert"]
                                                                          preferredStyle:UIAlertControllerStyleAlert];
        
        UIAlertAction *confirmAction = [UIAlertAction actionWithTitle:@"查看"
                                                              style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
                                                                  
                                                                  [self pushToViewControllerWhenClickPushMessageWith:pushMessageDic];
                                                              }];
        
        UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消"
                                                               style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
                                                                   
                                                               }];
    
        [alertController addAction:confirmAction];
        [alertController addAction:cancelAction];
        [self.window.rootViewController presentViewController:alertController animated:YES completion:nil];
    

    }

    跳转到指定页面的方法。跳转到指定页面的话,可能会需要某些参数,这时可以根后台商定,根据参数跳转到相应的页面,同时也让后台把你需要的参数返回来。比如我和后台商定根据“pageType”这个参数确定跳转的页面。如果是跳转到次级页面,这里重要的是要找到正确的viewcontroller,用controller的nav进行push新页面。比如我的DetailViewController是用tabar的第一个item中的FirstViewController的nav进行push出来的,那么,当我点击通知消息想到跳转到DetailViewController,只要找到FirstViewController就可以了。
    

    -(void)pushToViewControllerWhenClickPushMessageWith:(NSDictionary*)msgDic{

    NSUserDefaults*pushJudge = [NSUserDefaults standardUserDefaults];
    
            if ([[msgDic objectForKey:@"pageType"] integerValue]==0){
    

    // 跳转到第一个tabbarItem,这时直接设置 UITabBarController的selectedIndex属性就可以

             self.tabController.selectedIndex = 0;
                
            }else if ([[msgDic objectForKey:@"pageType"] integerValue]==1){
                
                //跳转到第二个tabbarItem
          
                self.tabController.selectedIndex = 1;
              
                
            }else if ([[msgDic objectForKey:@"pageType"] integerValue]==2){
                //跳转到第三个tabbarItem
                
    
                self.tabController.selectedIndex = 2;
                
            }else if ([[msgDic objectForKey:@"pageType"] integerValue]==3){
                //详情,这是从跳转到第一个tabbarItem跳转过去的,所以我们可以先让tabController.selectedIndex =0;然后找到VC的nav。
                
                self.tabController.selectedIndex =0;
                DetailViewController * VC = [[DetailViewController alloc]init];
                [VC setHidesBottomBarWhenPushed:YES];
            //因为我用了三方全屏侧滑手势,所以要找的是第一个tabbarController中的viewController的JTNavigationController ,接着再找JTNavigationController 里面的jt_viewControllers.lastObject,这样就可以找到FirstViewController了,然后跳转的时候就和正常的跳转一样了
                JTNavigationController *nav=(JTNavigationController *)self.tabController.viewControllers[0];
                UIViewController *vc=(UIViewController*)nav.jt_viewControllers.lastObject;
                
                [vc.navigationController pushViewController:VC animated:NO];
                
            }else {
    
            }
    

    }

    
    二、如何设置标签或者别名
    消息推送,有时候只想推送给指定的人或者指定的版本,那么这时候我们就需要对设备设置标签或者别名了,这样推送的时候可以根据标签或者别名推送给指定的用户
    
    
    • (void)viewDidLoad {
      [super viewDidLoad];
      self.view.backgroundColor = [UIColor whiteColor];

      //标签
      __autoreleasing NSMutableSet *tags = [NSMutableSet set];
      //设置了IOS_ALL的标签,当推送时选了IOS_ALL这标签,那么只要装了这个app并且允许消息推送的用户就都能收到通知
      [self setTags:&tags addTag:@"IOS_ALL"];

      NSString *version = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];
      //根据版本号设置了IOSXX的标签,当推送时选了IOS2.1这标签,那么只要装了这个app并且允许消息推送的2.1版本的用户就都能收到通知

      [self setTags:&tags addTag:[NSString stringWithFormat:@"IOS%@",version]];

      if (_isLogin==YES) {
      //根据版本号设置了LoginUesr的标签,当推送时选了LoginUesr这标签,那么只要装了这个app并且允许消息推送的所有登录用户就都能收到通知
      [self setTags:&tags addTag:@"LoginUesr"];
      }else{

      }

      //别名,根据用户的UID去设置别名,那么可以指定的推送给某些用户
      __autoreleasing NSString *alias ;

      if (_userUID!= nil) {
      alias =[NSString stringWithFormat:@"%@",_userUID];

    }
    [self analyseInput:&alias tags:&tags];
    
    [JPUSHService setTags:tags alias:alias callbackSelector:@selector(tagsAliasCallback:tags:alias:) object:self];
    

    }

    • (void)tagsAliasCallback:(int)iResCode
      tags:(NSSet *)tags
      alias:(NSString *)alias {
      NSString *callbackString =
      [NSString stringWithFormat:@"%d, \ntags: %@, \nalias: %@\n", iResCode,
      [self logSet:tags], alias];

      NSLog(@"TagsAlias回调:%@", callbackString);
      }

    • (NSString *)logSet:(NSSet *)dic {
      if (![dic count]) {
      return nil;
      }
      NSString *tempStr1 =
      [[dic description] stringByReplacingOccurrencesOfString:@"\u"
      withString:@"\U"];
      NSString *tempStr2 =
      [tempStr1 stringByReplacingOccurrencesOfString:@""" withString:@"\""];
      NSString *tempStr3 =
      [[@""" stringByAppendingString:tempStr2] stringByAppendingString:@"""];
      NSData *tempData = [tempStr3 dataUsingEncoding:NSUTF8StringEncoding];
      NSString *str =
      [NSPropertyListSerialization propertyListFromData:tempData
      mutabilityOption:NSPropertyListImmutable
      format:NULL
      errorDescription:NULL];
      return str;
      }

    pragma mark--设置推送的标签及别名

    • (void)setTags:(NSMutableSet **)tags addTag:(NSString *)tag {

      [*tags addObject:tag];
      }

    • (void)analyseInput:(NSString **)alias tags:(NSSet *)tags {
      // alias analyse
      if (![
      alias length]) {
      // ignore alias
      alias = nil;
      }
      // tags analyse
      if (![
      tags count]) {
      tags = nil;
      } else {
      __block int emptyStringCount = 0;
      [
      tags enumerateObjectsUsingBlock:^(NSString *tag, BOOL *stop) {
      if ([tag isEqualToString:@""]) {
      emptyStringCount++;
      } else {
      emptyStringCount = 0;
      stop = YES;
      }
      }];
      if (emptyStringCount == [
      tags count]) {
      *tags = nil;
      }
      }
      }

    当用户退出登录的时候可以重置别名,不然设备还是会收到通知
    

    [JPUSHService setAlias:@"" callbackSelector:@selector(tagsAliasCallback:tags:alias:) object:self];

    
    以上就是对于极光推送的简单介绍,如有问题欢迎指出或留言。

    相关文章

      网友评论

      • 6abebcb9be6a:使用第三方抽屉效果找不到当前控制器怎么办?
        若锦:@icelovery 啊,那你这个抽屉效果咋跳转的呢,你看看能不能遍历所有的vc,然后找到你需要的vc。
      • 梵高的老巫婆:第一次做集成 请问下 _application.applicationState 是什么意思啊 我写出来提示不识别
        梵高的老巫婆:@若锦 好的 多谢
        若锦:@梵高的老巫婆 这是我用一个变量取了didFinishLaunching中的application,写的不太规范。用[UIApplication sharedApplication].applicationState== UIApplicationStateActive也是可以的,目的只是获取到应用的运行状态:joy:
      • wellyoung:if (_application.applicationState == UIApplicationStateActive) 里面的_application 是哪来的
        若锦:@wellyoung 这是我用一个变量去了didFinishLaunching中的application,用[UIApplication sharedApplication].applicationState== UIApplicationStateActive也是可以的,目的只是获取到应用的运行状态:joy:
      • CoderChou:self. tabController 这个属性,哪来的,自己声明的?如果是自己声明的和当前tabcontroller,应该不是同一个吧
        CoderChou:@若锦 明白了
        若锦:@CoderChou 是的,这是appDelegate里面自己声明的属性,就是底部的tab呢,你说的和当前不是同一个是什么意思:joy:
      • 墨狂之逸才:iOS8-10是怎么判断用户是否授权消息推送,网上好多资料都过期了,因为要显示系统的消息推送权限是否打开,没有还要提示用户去”设置“界面打开
        若锦:@墨狂之逸才 用UNUserNotificationCenter去判断吧,如果granted == false,表示用户未开启通知。
        [[UNUserNotificationCenter currentNotificationCenter] setDelegate:self];
        UNUserNotificationCenter *center=[UNUserNotificationCenter currentNotificationCenter];
        [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert|UNAuthorizationOptionBadge|UNAuthorizationOptionSound) completionHandler:^(BOOL granted, NSError * _Nullable error) {
        if (granted==YES) {
        //开启
        }else{
        //关闭
        }
        }];
        OC中是这样的,swift中应该也有与此对应的方法 :smile:
        墨狂之逸才:我是swift写的,
        @Available(iOS, introduced: 8.0, deprecated: 10.0, message: "Use UserNotifications Framework's UNAuthorizationOptions")
        public struct UIUserNotificationType : OptionSet {

        public init(rawValue: UInt)


        public static var badge: UIUserNotificationType { get } // the application may badge its icon upon a notification being received

        public static var sound: UIUserNotificationType { get } // the application may play a sound upon a notification being received

        public static var alert: UIUserNotificationType { get } // the application may display an alert upon a notification being received
        }
        /*
        typedef enum UNAuthorizationOptions : NSUInteger {
        UNAuthorizationOptionBadge = (1 << 0),
        UNAuthorizationOptionSound = (1 << 1),
        UNAuthorizationOptionAlert = (1 << 2),
        UNAuthorizationOptionCarPlay = (1 << 3)
        } UNAuthorizationOptions;
        */
        遇到两个问题,第一swift中UIUserNotificationType没有none枚举
        第二:哪个方法判断iOS10?
        若锦:@墨狂之逸才 [[UIApplication sharedApplication] currentUserNotificationSettings].types这个方法也不好用么?
      • 琪一可:好棒啊 珍大神 :grin:
      • 顺其自然JX:感觉不用传pageType这个参数,,,,可以在tabbarCotroller里面接受消息, UINavigationController*nav =(UINavigationController*) self.selectedViewController;
        UIViewController*controller = nav.visibleViewController;就可以获得当前显示的controller,如果推送的界面就是这个Controller那么显示,,,不是的话,,,,push
      • goodthing:你好.我问下. alias 返回来的是(null).你代码里面的那个_userUID是怎么获取的?
        若锦:@ruwin_God 那得看你的需求了,比如你以用户的id作为别名去推送的话,那么你应该是在登录成功后将用户的id设置成别名;如果你是用app的版本号作为标签,那么可以在程序启动的时候就打上版本号的标签。
        goodthing:嗯嗯,谢谢你。再问个问题,这个Alias和Tag在哪儿写呢?我的代码换台设备依然登陆同一账号后。以Tag或Alias推送竟然收不到通知。这是怎么一回事不知道…
        若锦:@ruwin_God 这个是登录成功后后台返回的一个用户的id,你们登录成功后应该也会返回用户的相关信息吧,你可以取一个能唯一识别用户身份的信息作为你的别名
      • 那片阳光已醉:你好,我在走这个方法的时候-(void)pushToViewControllerWhenClickPushMessageWith:(NSDictionary*)msgDic{} 直接走了- (void)dealloc{}方法,而不走viewdidload这个方法,这是什么梗!!
        那片阳光已醉: @若锦 嗯 是的 ,不过已经发现原因了,我之前跟控制器没找到,现在找到了😀
        若锦:@那片阳光已醉 啊?这个我也不知道是什么梗:smile:你现在是跳转失败了呗?
      • Joe_lisa:-(void)pushToViewControllerWhenClickPushMessageWith:(NSDictionary*)msgDic{ } 我这部分是自己写的,但是就是在前台有消息的,如何显示消息,自己一直很模糊,可以有两种方案,第一种就是显示角标, 第二种就是弹出警告框,实现查看消息,你的应该属于第二种,

        #pragma mark -- 程序运行时收到通知
        -(void)getPushMessageAtStateActive:(NSDictionary *)pushMessageDic{} 我用你的方法,在前台时,不走那个方法, 但是当我点击要显示的界面,断点,那个方法,就开始走了
        若锦:@Joe_lisa 既然弹框已经出现了,那么如果你在弹框的确定按钮中写了相应的方法,这个方法是会走的,你在仔细看看你的弹框确定按钮的对应事件,同时你也可以打印一下收到的消息,看看是不是你没对好要跳转的页面 :smile: 你的断点加给的谁?跳转事件是确认按钮触发的,你点击要跳转的页面时按理说是不会触发跳转事件的呀,或者方便的话把你的弹框确定按钮的对应事件代码发上来看看
      • Joe_lisa:极光推送,实现通知跳转后,而点击下面其他菜单就没有反应了
        若锦:@Joe_lisa 如果你用的present,那么你的返回事件中应该判断一下,用present的应该是用dismiss的方法返回,push出来的页面才能用pop的方法返回。你说的下面的菜单栏是指taabar么?
        Joe_lisa:@若锦 跳转到指定的页面后,一会多出现下面的菜单,一会能上下啦比较乱,,并且返回不了,
        若锦:@Joe_lisa 是说跳转到的页面点击没有反应么,如果是这样的话,你可以看看文中说的,要是你用present的方法跳转页面而点击事件没反应的话,应该是层级图不对 :smile:
      • Joe_lisa:我刚刚做完两个标签tag的推送,
      • Joe_lisa:如果推送,跳转到不同页面,根据名字判断,怎么判断?
        -(void)pushToViewControllerWhenClickPushMessageWith:(NSDictionary*)msgDic{
        若锦:@Joe_lisa 嗯,既然给了跳转的名字的话不就可以知道要去哪个页面了么
        Joe_lisa:@若锦 知道,我们app 是改版的,现在才用极光做推送,后台不想再加东西进去,要我根据跳转的名字判断跳转到不同页面, :blush:
        若锦:@Joe_lisa 可以让后台在返回的数据中加上跳转类型的字段,根据这个字段跳转到相应的页面:smile:
      • Mg明明就是你::heart_eyes:nice,非常有用
      • Lol刀妹:哟,程序媛:stuck_out_tongue_winking_eye:
        若锦:@无夜之星辰 哈哈,是的 :smile:
      • 红太狼的小灰帽丶:TagsAlias回调是0的话是正确还是不正确?
        若锦:@红太狼的小灰帽丶 对的,写在你的退出登录的点击事件里就可以了
        红太狼的小灰帽丶:@若锦 您好 大美女 我又来了 用户退出登录重置别名 这个是写在哪里呢 是用户点击退出之后的点击事件里面嘛
        若锦:@笑笑有晴天丶 嗯,这个应该是正确的。或者你也可以打印一下回调过来的tags和alias,如果回调过来的值是你设置的值,那自然是正确的 :smile:
      • 思念那年慕云:我想实现接收极光推送提示,和不接收极光推送提示,要移除推送嘛?还是有屏蔽的方法呢?
        若锦:@思念那年慕云 嗯,那你可以考虑一下我之前说的那两个方案。在极光推送的API中,好像没有看到移除推送的接口,所以你可以直接引导用户设置系统的通知开关 :smiley:
        思念那年慕云: @若锦 我指的是第一次启动允许收到推送了,在app有个开关可以控制收还是不收到后台发的通知。
        若锦:@思念那年慕云 推送都是第一次安装的时候会有一个系统弹框,询问是否允许通知,如果允许那么才会收到通知。你说的提示是想说每次开启程序都提示用户是否接收通知么?
      • 思念那年慕云:如果是有个消息推送开关呢,怎么实现屏蔽和打开。
        思念那年慕云:@墨狂之逸才 环信的话是有消息推送开和关的。
        墨狂之逸才:设置页面有一栏,是判断用户是否允许消息推送权限的,iOS以上是怎么判断的?
        若锦:@思念那年慕云 虽然我没有做过,但是我觉得可以从这两个方向去解决:1.服务器端禁止推送。把开关的状态传给服务器,服务器根据该状态判断是否要进行推送。2.客户端自己处理。用户使用该开关时直接将页面跳转到系统的设置页面,让用户自己选择开启或者关闭。 :smile:

      本文标题:极光推送点击消息栏跳转到指定页面、设置标签或别名

      本文链接:https://www.haomeiwen.com/subject/wscwuttx.html