您的位置:首页 > 移动开发 > IOS开发

iOS推送消息

2016-01-31 00:00 246 查看
摘要: 推送最多只能起到一个提醒的作用, 并不适合依赖推送去完成一些重要的功能

最近公司的项目中, 从产品设计上来讲, 推送这部分的功能做的还是很不合理的.

在当前的项目中, 用户的很多操作都依赖推送消息来完成, 通过推送消息来触发一些事件, 然后app做一些操作, 但是有个很严重的问题就是, 服务器发送的推送消息, 并不能100%的被用户收到, 就算用户收到了推送消息, 我们的程序也并不一定能够收到并处理这条推送消息, 这就使得app一些重要的操作无法被触发, 导致用户体验会很不好.

推送消息在一个app中的地位. 我认为推送在app中的地位是不能太重要的, 因为并不是100%能够被收到并处理的. 推送适合做的是, 比如推送一条新的公告, 给用户推送新的产品, 或者给用户推荐什么东西, 推送最多只能起到一个提醒的作用, 并不适合依赖推送去完成一些重要的功能.

对于对推送消息的处理, 我是这么做的, 在AppDelegate中的代理方法中接收推送消息, 然后以通知的方式向推送消息的处理类发送一个定向的通知. 在Appdelegate中, 在创建应用的时候, 先创建一个推送消息的处理类, 并持有这个类. 在推送消息初始化时候添加推送消息的监听通知, dealloc中移除通知, 在接收到通知后, 对通知消息做相应的判断, 并作不同的处理.

- (instancetype)init
{
if (self = [super init]) {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleRemoteNotification:) name:@"LittleBeeRemoteNotification" object:nil];
}
return self;
}

- (void)handleRemoteNotification:(NSNotification *)noti
{
NSLog(@"noti = %@", noti);
NSDictionary *userInfo = noti.userInfo;
NSString *type = [userInfo objectForKey:@"type"];

UIApplicationState applicationState = [UIApplication sharedApplication].applicationState;

if ([type isEqualToString:@"ac01"]) {
//如果是从后台进入的, 则直接打开公告页面
if (applicationState == UIApplicationStateInactive) {
[self openNoticeWithNoticeId:[userInfo objectForKey:@"id"]];
}
else if (applicationState == UIApplicationStateActive){
[[NSNotificationCenter defaultCenter] postNotificationName:@"niticeApplicationStateActive" object:nil];
}
}
else if ([type isEqualToString:@"ac02"]){
[self requestOrderDetailsWithOrderId:[userInfo objectForKey:@"id"] operationType:@"ac02"];
}
else if ([type isEqualToString:@"ac03"]){
[self requestOrderDetailsWithOrderId:[userInfo objectForKey:@"id"] operationType:@"ac03"];
}
else if ([type isEqualToString:@"ac04"]){

}
else if ([type isEqualToString:@"ac05"]){

}
}

通过AppDelegate拿到当前正在展示的navi

AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
UINavigationController *navi = [appDelegate.tabbar selectedViewController];

AppDelegate中的代理方法中收到通知消息并发送通知

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
NSLog(@"application:didReceiveRemoteNotification:");
// Required,For systems with less than or equal to iOS6
[JPUSHService handleRemoteNotification:userInfo];
[[NSNotificationCenter defaultCenter] postNotificationName:@"LittleBeeRemoteNotification" object:_pushMshHandle userInfo:userInfo];
}

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

NSLog(@"application:didReceiveRemoteNotification:fetchCompletionHandler:");
// IOS 7 Support Required
[JPUSHService handleRemoteNotification:userInfo];
completionHandler(UIBackgroundFetchResultNewData);

[[NSNotificationCenter defaultCenter] postNotificationName:@"LittleBeeRemoteNotification" object:_pushMshHandle userInfo:userInfo];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: