刚接触iOS推送的童鞋可以看下 iOS集成极光推送(一)。
我们在根据极光官网如果按照教程一步一步的来做的话,应该就能够集成好极光的推送,但是,现在我们还需要完善下推送的细节。
当应用在前台运行的时候,这个时候如果收到了通知,能够收到通知的数据,但是收不到通知的声音。我们要做的是应用在后台时,怎么自定义推送的声音。
这样,就能够自定义推送声音了,是不是很简单呢?^_^
App的角标数量是由后台返回的,通过关键字 badge可以指定。具体角标数量的增加可以让后台计算,客户端只需要显示就可以了。
如果你设置了后台收到推送,那边每次推送,都会调用
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler: (void (^)(UIBackgroundFetchResult))completionHandler
这个方法,userInfo
这个对象里存储了推送的所有的信息,用户,可以根据 userInfo
这个对象里面的数据来跳转到不同的界面。至于,界面是怎么跳转的,我是这么处理的:
- (void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo
fetchCompletionHandler:
(void (^)(UIBackgroundFetchResult))completionHandler {
[JPUSHService handleRemoteNotification:userInfo];
NSLog(@"completionHandler 收到通知:%@", [self logDic:userInfo]);
if ([UIApplication sharedApplication].applicationState != UIApplicationStateActive) {
// 如果当前应用处于后台
UITabBarController *tabBarController = (UITabBarController *)self.rootViewController;
tabBarController.selectedIndex = 2;
}
completionHandler(UIBackgroundFetchResultNewData);
}
主要就是获取当前应用的根视图,然后根据根视图进行跳转。
这个是比较重要的,因为推送消息不可能向全部的用户发送,具体资料可以见 iOS API .
温馨提示,设置标签别名请注意处理call back结果。
只有call back 返回值为0才设置成功,才可以向目标推送。否则服务器API会返回1011错误。所有回调函数都在主线程运行。
提供几个 API 用来设置别名(alias)与标签(tags)。
这几个 API 可以在 App 里任何地方调用。
为安装了应用程序的用户,取个别名来标识。以后给该用户 Push 消息时,就可以用此别名来指定。
每个用户只能指定一个别名。
同一个应用程序内,对不同的用户,建议取不同的别名。这样,尽可能根据别名来唯一确定用户。
举例:在一个用户要登录的游戏中,可能设置别名为 userid。游戏运营时,发现该用户3天没有玩游戏了,则根据userid调用服务器端 API 发通知到客户端提醒用户。
为安装了应用程序的用户,打上标签。其目的主要是方便开发者根据标签,来批量下发 Push消息。
可为每个用户打多个标签。
举例:game,old_page, women
调用此API来同时设置别名与标签,支持回调函数。
+ (void)setTags:(NSSet *)tags alias:(NSString *)alias callbackSelector:(SEL)cbSelector object:(id)theTarget;
-(void)tagsAliasCallback:(int)iResCode tags:(NSSet*)tags alias:(NSString*)alias { NSLog(@"rescode: %d, \ntags: %@, \nalias: %@\n", iResCode, tags , alias); }
调用此 API 在后台同时设置别名与标签,不需要处理设置结果,SDK会自动进行失败重试
需要理解的是,这个接口是覆盖逻辑,而不是增量逻辑。即新的调用会覆盖之前的设置。
在之前调用过后,如果需要再次改变别名与标签,只需要重新调用此 API 即可。
需要注意,该background模式的设置和非background的设置是两种不同的设置,互相不影响,意味着,非background的设置不会终止当前进行的background设置,除非另一个background设置发生。
+ (void)setTags:(NSSet *)tags aliasInbackground:(NSString *)alias;
调用此 API 来同时设置别名与标签,通过block来返回设置别名与标签的结果。
需要理解的是,这个接口是覆盖逻辑,而不是增量逻辑。即新的调用会覆盖之前的设置。
在之前调用过后,如果需要再次改变别名与标签,只需要重新调用此 API 即可。
+ (void)setTags:(NSSet *)tags alias:(NSString *)alias fetchCompletionHandle:(void (^)(int iResCode, NSSet *iTags, NSString *iAlias))completionHandler
上面介绍那么多,看的是不是有点晕,其实我的解决办法就是,在用户登录的时候,将得到的userid设置推送的别名。具体见代码:
WMUserInfoModel *userModel = (WMUserInfoModel *)responseObject;
[JPUSHService setTags:[NSSet setWithObject:[NSString stringWithFormat:@"%@",[NSString stringWithFormat:@"%d",userModel.userId]]] alias:[NSString stringWithFormat:@"%d",userModel.userId] callbackSelector:@selector(tagsAliasCallback:tags:alias:) object:self];
- (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);
}
// log NSSet with UTF8
// if not ,log will be \Uxxx
- (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;
}
这样你把你的userid当成alias 发送给极光服务器就可以了,也不是很复杂。