iOS定向推送和订阅号推送

作者: 小二同學 | 来源:发表于2016-11-18 16:29 被阅读659次

    订阅号推送

    类似于这样


    BOSS小秘书.png

    是这样一个需求,不经过后台,就是你收到一条消息,然后可以收到消息内容,并展示,然后还要显示历史消息,我刚开始接到这个需求的时候,也懵逼了。想了半天,选择用极光了,不过极光iOS不支持富媒体推送,就用的普通推送,上传的时候有点不完美,纯手动。

    • 我们要先集成极光推送。点这里
      具体细节就不说了,按照文档集成就行了。

    • 首先在极光推送里面要填写key value

    极光推送key value.png
    • 这个key value 字段要和安卓他们商量好,要使用一样的字段。

    • 然后到APP里面取接收,APP里面有几种情况,APP在前台收到通知和APP在后台收到通知。

    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
    

    不管APP在前台和在后台,收到通知点击消息,都会走这个方法。

    application.applicationState == UIApplicationStateActive
    
    • 所以我们要判断,当APP在前台的话,要给一个弹框。

    • 这样还有一个问题,就是通知都是一次的,要怎么存下来历史消息呢?

    • 先定义一个数组去取得本地存的消息,然后再把推送过来的字典加进数组,最后再把这个数组保存下来,每次推送过来的新消息,就能保存下来了

    //定义空数组
        self.PushArray = [NSMutableArray arrayWithCapacity:0];
        
        //先取
        NSUserDefaults * user = [NSUserDefaults standardUserDefaults];
        self.PushArray = [user mutableArrayValueForKey:@"PushArray"];
        [self.PushArray addObject:userInfo];
        
        
        if (self.PushArray.count!=0){
        NSUserDefaults * user1 = [NSUserDefaults standardUserDefaults];
        [user1 setObject:self.PushArray forKey:@"PushArray"];
        [user1 synchronize];
            
            [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
        }
        
        if (application.applicationState == UIApplicationStateActive) {
            NSLog(@"active");
            //程序当前正处于前台
            
            UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"您有一条新消息"
                                                                message:nil
                                                               delegate:self
                                                      cancelButtonTitle:@"取消"
                                                      otherButtonTitles:@"点击查看",nil];
            [alertView show];
        }
        else if(application.applicationState == UIApplicationStateInactive)
        {
    //        NSLog(@"inactive");
            [[NSNotificationCenter defaultCenter]postNotificationName:@"JPsh" object:nil];
            
        }
    
    • 然后定义跳转页面

    • 在那个小秘书页面里面直接就可以把这个数组取出来,封装Model,就和咱们解析的数据一样了。最后,赋值,搞定。

    • 是不是点击订阅号页面,那个tableview始终都会定位在最后一行呢?而咱们新建的tableview一开始创建都在第一行,这样进入小秘书的时候就看不到最新数据。

    [self.tabelView setContentOffset:CGPointMake(0, self.dataArray.count*300*ScaleNumberHeight) animated:YES];
    
    • 这样写,在创建tableview的时候把tableview的contentoffset设置为数组个数*cell高度,这样就完美解决了一开始tableview定位在最后一行。

    • 收工,搞定。

    定向推送

    就是当APP提交订单,立即就会收到一个推送消息。跨APP也能使用。

    • 关键的一步到了,就是在我们APP登陆成功的时候,要向极光发送我们的UserId,把UserId赋值给tag,利用tag进行定向推送。
    [self jPushwithTags:[NSString stringWithFormat:@"%d",user.userId]];
    
    • 然后
    //极光推送设置标签tags 
    - (void)jPushwithTags:(NSString *)Tags
    {
        
        __autoreleasing NSMutableSet *tags = [NSMutableSet set];
        
        //重新赋值标签
        [[NSUserDefaults standardUserDefaults] setObject:Tags forKey:@"JPushTags"];
        
        //得到别名
        NSString * alias =  [[NSUserDefaults standardUserDefaults] objectForKey:@"JPushAlias"];
        
        
        [tags addObject:Tags];
        
        [JPUSHService setTags:tags alias:alias callbackSelector:@selector(tagsAliasCallback:tags:alias:) object:self];
        
    }
    #pragma  mark ------极光推送------
    - (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;
    }
    
    
    - (void)setTags:(NSMutableSet **)tags addTag:(NSString *)tag {
        //  if ([tag isEqualToString:@""]) {
        // }
        [*tags addObject:tag];
    }
    
    • 这样UserId就传完了

    • 然后在Appdelegate.m里面接收的时候就可以直接用了。极光接收推送内容的几种情况,下面会提到。

    • 这样有个疑问,推送的话我要用极光怎么推呢?

    极光定向推送.png
    • 在这里设置Tag,就是你刚才上传的UserId,在用户下完订单,你拿着UserId在这里就可以推送了,如果要传递OrderId的话就在可选设置里面添加就行了。

    结语

    有木有很简单。另外大家有什么关于极光推送的问题可以一起探讨哦,最近一直在做推送,趁热能想起来。信不信,不出一周,这些代码都是别人写的了。

    相关文章

      网友评论

      • 匿名的他:最近也在搞极光推送,但是遇到一个问题,app被杀死后,收到推送消息,不点击通知栏的推送消息,点app图标启动,如何获取到刚才收到的推送消息呢?PS:没有经过后台,有点懵逼
        狼叔妹:@978e7829c0ce 可以看看这篇文章 http://www.jianshu.com/p/fa17ffa7262e
        狼叔妹:@匿名的他 设置在后台模式下耶可以接收到消息就可以
      • 醉在清风:可以的
        小二同學:@醉在清风 :kissing_heart:
      • Thebloodelves:apns绑定的是手机不是用户,建议用websocked等技术绑定用户进行推送
        Thebloodelves:@小二同學 :smile:
        小二同學:@Thebloodelves 好的,学习了

      本文标题:iOS定向推送和订阅号推送

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