objective-c - iOS 推送来时有时点击app图标也会跳转 我已经贴了代码 希望大家能帮忙解决真的烦扰我很久了
迷茫
迷茫 2017-04-17 16:53:21
[iOS讨论组]

我用的是个推的SDK
1、我先说我想达到的目的以及问题:

a、在前台不能点击通知栏跳转且通知栏不显示通知信息 
b、在后台(程序未杀死)通知栏显示通知信息且点击通知栏的信息会跳转到某个controller,但是点击app图标不会跳转
(这是出问题的地方,就是我有的时候来通知了 点击app图标进入应用,是正常的不会跳转,但偶尔也会跳转)
c、程序杀死后通知栏显示通知信息且点击通知栏的信息会跳转到某个controller,但是点击app图标不会跳转

2、如下是我的代码(也可以私聊我):

  • (BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions {
    // 当被杀死状态收到本地通知时执行的跳转代码
    if (launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]) {

       //跳转到一个controller

    }

}

  • (void)applicationDidEnterBackground:(UIApplication *)application {
    _is_background = YES;
    }

  • (void)applicationDidBecomeActive:(UIApplication *)application {
    _is_background = NO;
    }

  • (void)GexinSdkDidReceivePayload:(NSString )payloadId fromApplication:(NSString )appId
    {

       // [4]: 收到个推消息
       NSData *payload = [_gexinPusher retrivePayloadById:payloadId];
       NSString *payloadMsg = nil;
       if (payload) {
           payloadMsg = [[NSString alloc] initWithBytes:payload.bytes
                                                 length:payload.length
                                               encoding:NSUTF8StringEncoding];
       }
        NSLog(@"payloadId%@",payloadId);
       NSDictionary *userinfo = [Utility jsonStringToObject:payloadMsg];
    
       UILocalNotification *notification=[[UILocalNotification alloc] init];
       // 在后台时接收信息通知  前台并不接收(程序并未死)
       if (notification!=nil && _is_background == YES) {
           notification.timeZone=[NSTimeZone defaultTimeZone];
               notification.alertBody= [NSString stringWithFormat:@"你收到的消息是:“%@”",userinfo];
               notification.userInfo = @{@"info":payloadMsg};
               [[UIApplication sharedApplication]   scheduleLocalNotification:notification];
       
       }

    }

// 点击本地通知栏的跳转

  • (void)application:(UIApplication )application didReceiveLocalNotification:(UILocalNotification )notification{

        NSDictionary *userinfo = [Utility jsonStringToObject:notification.userInfo];
        // 执行跳转到controller的代码

    }

3、我认为有问题的是不是这一句 if (notification!=nil && _is_background == YES) 判断 因为有的时候通知来了 而这个从后台切换到前台的 _is_background变量还未变成NO 也就是通知收到的速度 比 - (void)applicationDidEnterBackground:(UIApplication *)application {

 _is_showNotificationBar = NO;

}
执行的快

4、是不是我这种做法本身就有错误,我网上查了很多资料,第一次做,大部分都是千篇一律的,所以想问问是不是有更好的实现方式 希望指正

5、真的希望能解决,感谢

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(1)
伊谢尔伦

先说说楼主的三个目的,首先a,c这两个目的本来就是系统默认的行为。

  • a.iOS系统不像安卓,程序在前台的时候,即使有通知,也不会出现通知栏。

  • c.当程序在后台时,接受到的远程通知都是通过APNs来发送到手机的,而接收到远程通知时,直接点击程序图标是不会做任何处理的。

以前我用过一次个推,所以我试着回答一下楼主你说的那个问题出现的原因,我没有自己敲代码来证实,不过通过分析代码上的逻辑应该是这样的。

个推推送的消息分为本地消息和远程推送消息。本地消息就是通过个推的SDK与其服务器维持一个长连接,然后通过代理方法来收到本地消息,当你应用程序在后台时,个推是会把本地消息先保存在他服务器上的,但是这个又不是每次都会。远程推送消息则是个推把消息送给APNs,然后下发到手机上。

所以,楼主程序出现的问题就出现在本地消息上,也就是(void)GexinSdkDidReceivePayload:(NSString )payloadId fromApplication:(NSString )appId这个代理方法。 你进入程序后,个推把在队列中的本地消息发给你,所以走了这个代理方法,然后你又注册了一个本地通知,在本地通知的代理方法(void)application:(UIApplication )application didReceiveLocalNotification:(UILocalNotification )notification进行了跳转,因此造成的楼主的问题。你可以把这个代理方法删除,就不会出现问题了。

至于点击通知栏的跳转,你只需用远程通知的回调方法即可,具体方法我就不贴了。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号