刚接触iOS推送的童鞋可以看下 iOS集成极光推送(一)。
我们在根据极光官网如果按照教程一步一步的来做的话,应该就能够集成好极光的推送,但是,现在我们还需要完善下推送的细节。
- 推送的声音怎么自定义;
- App在收到推送后怎么改变自己的角标数量;
- 收到推送后怎么跳转到指定的页面;
- 怎么给指定的APP发送推送。
1. 推送的声音自定义
当应用在前台运行的时候,这个时候如果收到了通知,能够收到通知的数据,但是收不到通知的声音。我们要做的是应用在后台时,怎么自定义推送的声音。
- 将声音文件拖动到本地项目中,记得勾选 Add to targets 选项。如图所示:
发送时后台指定声音文件名字,这里通过 JPush Portal 上模拟操作,如图所示:
这样,就能够自定义推送声音了,是不是很简单呢?^_^
2. App在收到推送后改变自己的角标数量
App的角标数量是由后台返回的,通过关键字 badge可以指定。具体角标数量的增加可以让后台计算,客户端只需要显示就可以了。
3. 收到推送后跳转到指定的页面
如果你设置了后台收到推送,那边每次推送,都会调用
- (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);
}
主要就是获取当前应用的根视图,然后根据根视图进行跳转。
4. 给指定的APP发送推送消息
这个是比较重要的,因为推送消息不可能向全部的用户发送,具体资料可以见 iOS API .
标签与别名API(iOS)
功能说明
温馨提示,设置标签别名请注意处理call back结果。
只有call back 返回值为0才设置成功,才可以向目标推送。否则服务器API会返回1011错误。所有回调函数都在主线程运行。
提供几个 API 用来设置别名(alias)与标签(tags)。
这几个 API 可以在 App 里任何地方调用。
别名alias
为安装了应用程序的用户,取个别名来标识。以后给该用户 Push 消息时,就可以用此别名来指定。
每个用户只能指定一个别名。
同一个应用程序内,对不同的用户,建议取不同的别名。这样,尽可能根据别名来唯一确定用户。
举例:在一个用户要登录的游戏中,可能设置别名为 userid。游戏运营时,发现该用户3天没有玩游戏了,则根据userid调用服务器端 API 发通知到客户端提醒用户。
标签tag
为安装了应用程序的用户,打上标签。其目的主要是方便开发者根据标签,来批量下发 Push消息。
可为每个用户打多个标签。
举例:game,old_page, women
Method - setTagsWithAlias (with Callback)
调用此API来同时设置别名与标签,支持回调函数。
接口定义
+ (void)setTags:(NSSet *)tags alias:(NSString *)alias callbackSelector:(SEL)cbSelector object:(id)theTarget;
参数说明
alias
- nil此次调用不设置此值
- 空字符串表示取消之前的设置
- 每次调用设置有效的别名,覆盖之前的设置。
- 有效的别名组成:字母(区分大小写)、数字、下划线、汉字
- 限制:alias命名长度限制为40字节。
tags
- nil 此次调用不设置此值
- 空集合([NSSet set]) 表示取消之前的设置。
- 集合成员类型要求为NSString类型
- 每次调用至少设置一个tag,覆盖之前的设置,不是新增。
- 有效的标签组成:字母(区分大小写)、数字、下划线、汉字。
- 限制:每个 tag 命名长度限制为 40 字节,最多支持设置 100 个 tag,但总长度不得超过1K字节。(判断长度需采用UTF-8编码)
- 单个设备最多支持设置 100 个 tag。App 全局 tag 数量无限制。
callbackSelector
- nil 此次调用不需要 Callback。
- 用于回调返回对应的参数 alias, tags。并返回对应的状态码:0为成功,其他返回码请参考错误码定义。
- 回调函数请参考SDK 实现。
theTarget
- 参数值为实现了callbackSelector的实例对象。
- nil 此次调用不需要 Callback。
-(void)tagsAliasCallback:(int)iResCode
tags:(NSSet*)tags
alias:(NSString*)alias
{
NSLog(@"rescode: %d, \ntags: %@, \nalias: %@\n", iResCode, tags , alias);
}
Method - setTagsWithAlias (background)
调用此 API 在后台同时设置别名与标签,不需要处理设置结果,SDK会自动进行失败重试
需要理解的是,这个接口是覆盖逻辑,而不是增量逻辑。即新的调用会覆盖之前的设置。
在之前调用过后,如果需要再次改变别名与标签,只需要重新调用此 API 即可。
需要注意,该background模式的设置和非background的设置是两种不同的设置,互相不影响,意味着,非background的设置不会终止当前进行的background设置,除非另一个background设置发生。
接口定义
+ (void)setTags:(NSSet *)tags aliasInbackground:(NSString *)alias;
Method - setTagsWithAlias (with block)
调用此 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 发送给极光服务器就可以了,也不是很复杂。