iOS定向推送和订阅号推送
订阅号推送
类似于这样
BOSS小秘书.png
是这样一个需求,不经过后台,就是你收到一条消息,然后可以收到消息内容,并展示,然后还要显示历史消息,我刚开始接到这个需求的时候,也懵逼了。想了半天,选择用极光了,不过极光iOS不支持富媒体推送,就用的普通推送,上传的时候有点不完美,纯手动。
-
我们要先集成极光推送。点这里
具体细节就不说了,按照文档集成就行了。 -
首先在极光推送里面要填写key value
-
这个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里面接收的时候就可以直接用了。极光接收推送内容的几种情况,下面会提到。
-
这样有个疑问,推送的话我要用极光怎么推呢?
- 在这里设置Tag,就是你刚才上传的UserId,在用户下完订单,你拿着UserId在这里就可以推送了,如果要传递OrderId的话就在可选设置里面添加就行了。
结语
有木有很简单。另外大家有什么关于极光推送的问题可以一起探讨哦,最近一直在做推送,趁热能想起来。信不信,不出一周,这些代码都是别人写的了。