iOS 集成极光推送(二)

刚接触iOS推送的童鞋可以看下 iOS集成极光推送(一)。

我们在根据极光官网如果按照教程一步一步的来做的话,应该就能够集成好极光的推送,但是,现在我们还需要完善下推送的细节。

  • 推送的声音怎么自定义
  • App在收到推送后怎么改变自己的角标数量
  • 收到推送后怎么跳转到指定的页面
  • 怎么给指定的APP发送推送

1. 推送的声音自定义

当应用在前台运行的时候,这个时候如果收到了通知,能够收到通知的数据,但是收不到通知的声音。我们要做的是应用在后台时,怎么自定义推送的声音。

  • 将声音文件拖动到本地项目中,记得勾选 Add to targets 选项。如图所示:

iOS 集成极光推送(二)_第1张图片

  • 发送时后台指定声音文件名字,这里通过 JPush Portal 上模拟操作,如图所示:

    iOS 集成极光推送(二)_第2张图片

这样,就能够自定义推送声音了,是不是很简单呢?^_^

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 发送给极光服务器就可以了,也不是很复杂。

你可能感兴趣的:(ios,极光推送)