iOS定向推送和订阅号推送

订阅号推送

类似于这样


iOS定向推送和订阅号推送_第1张图片
BOSS小秘书.png

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

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

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

iOS定向推送和订阅号推送_第2张图片
极光推送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里面接收的时候就可以直接用了。极光接收推送内容的几种情况,下面会提到。

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

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

结语

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

你可能感兴趣的:(iOS定向推送和订阅号推送)