iOS API

标签与别名 API (iOS)

功能说明

温馨提示,设置标签别名请注意处理call back结果。

只有call back 返回值为 0 才设置成功,才可以向目标推送。否则服务器 API 会返回1011错误。所有回调函数都在主线程运行。


提供几个相关 API 用来操作别名(alias)与标签(tags)。

这几个 API 可以在 App 里任何地方调用。

别名 alias

为安装了应用程序的用户,取个别名来标识。以后给该用户 Push 消息时,就可以用此别名来指定。
每个用户只能指定一个别名。

同一个应用程序内,对不同的用户,建议取不同的别名。这样,尽可能根据别名来唯一确定用户。

系统不限定一个别名只能指定一个用户。如果一个别名被指定到了多个用户,当给指定这个别名发消息时,服务器端API会同时给这多个用户发送消息。

举例:在一个用户要登录的游戏中,可能设置别名为 userid。游戏运营时,发现该用户 3 天没有玩游戏了,则根据 userid 调用服务器端API发通知到客户端提醒用户。

标签 tag

为安装了应用程序的用户,打上标签。其目的主要是方便开发者根据标签,来批量下发 Push 消息。

可为每个用户打多个标签。

举例: game, old_page, women

Method - addTags:completion:seq:

调用此 API 来增加标签,在block中返回结果

Note:这个接口是增加逻辑,而不是覆盖逻辑

支持的版本

开始支持的版本:3.0.6

接口定义

+ (void)addTags:(NSSet<NSString *> *)tags
 completion:(JPUSHTagsOperationCompletion)completion
        seq:(NSInteger)seq;

参数说明

  • tags

    • 不能设置nil或者空集合([NSSet set])
    • 集合成员类型要求为NSString类型
    • 每次调用至少设置一个 tag
    • 有效的标签组成:字母(区分大小写)、数字、下划线、汉字。
    • 限制:每个 tag 命名长度限制为 40 字节,最多支持设置 1000 个 tag,但总长度不得超过5K字节。(判断长度需采用UTF-8编码)
    • 单个设备最多支持设置 1000 个 tag。App 全局 tag 数量无限制
  • completion

    • 用于回调返回对应的参数tags。并返回对应的状态码:0为成功,其他返回码请参考错误码定义。seq为调用时传入的会话序列号
  • seq

    • 请求时传入的序列号,会在回调时原样返回

Method - setTags:completion:seq:

调用此 API 来设置标签,在block中返回结果

Note:这个接口是覆盖逻辑,而不是增加逻辑,调用此接口会覆盖之前设置的全部标签

支持的版本

开始支持的版本:3.0.6

接口定义

+ (void)setTags:(NSSet<NSString *> *)tags
 completion:(JPUSHTagsOperationCompletion)completion
        seq:(NSInteger)seq;

参数说明

  • tags

    • 不能设置nil或者空集合([NSSet set])
    • 集合成员类型要求为NSString类型
    • 每次调用至少设置一个 tag
    • 有效的标签组成:字母(区分大小写)、数字、下划线、汉字。
    • 限制:每个 tag 命名长度限制为 40 字节,最多支持设置 1000 个 tag,但总长度不得超过5K字节。(判断长度需采用UTF-8编码)
    • 单个设备最多支持设置 1000 个 tag。App 全局 tag 数量无限制
  • completion

    • 用于回调返回对应的参数tags。并返回对应的状态码:0为成功,其他返回码请参考错误码定义。seq为调用时传入的会话序列号
  • seq

    • 请求时传入的序列号,会在回调时原样返回

Method - deleteTags:completion:seq:

调用此 API 来删除标签,在block中返回结果

支持的版本

开始支持的版本:3.0.6

接口定义

+ (void)deleteTags:(NSSet<NSString *> *)tags
 completion:(JPUSHTagsOperationCompletion)completion
        seq:(NSInteger)seq;

参数说明

  • tags

    • 不能设置nil或者空集合([NSSet set])
    • 集合成员类型要求为NSString类型
    • 每次调用至少删除一个 tag
    • 有效的标签组成:字母(区分大小写)、数字、下划线、汉字
    • 限制:每个 tag 命名长度限制为 40 字节,最多支持删除 1000 个 tag,但总长度不得超过5K字节。(判断长度需采用UTF-8编码)
  • completion

    • 回调返回对应的参数tags。并返回对应的状态码:0为成功,其他返回码请参考错误码定义。seq为调用时传入的会话序列号
  • seq

    • 请求时传入的序列号,会在回调时原样返回

Method - clearTags:completion:seq:

调用此 API 来清除所有标签,在block中返回结果

支持的版本

开始支持的版本:3.0.6

接口定义

+ (void)clearTags:(JPUSHTagsOperationCompletion)completion
        seq:(NSInteger)seq;

参数说明

  • completion

    • 回调返回的tags为nil。返回对应的状态码:0为成功,其他返回码请参考错误码定义。seq为调用时传入的会话序列号
  • seq

    • 请求时传入的序列号,会在回调时原样返回

Method - getAllTags:completion:seq:

调用此 API 来获取所有标签,在block中返回结果

支持的版本

开始支持的版本:3.0.6

接口定义

+ (void)getAllTags:(JPUSHTagsOperationCompletion)completion
        seq:(NSInteger)seq;

参数说明

  • completion

    • 回调返回的tags为查询结果。返回对应的状态码:0为成功,其他返回码请参考错误码定义。seq为调用时传入的会话序列号
  • seq

    • 请求时传入的序列号,会在回调时原样返回

Method - validTag:completion:seq:

调用此 API 来验证目标tag是否已经设置

支持的版本

开始支持的版本:3.0.6

接口定义

+ (void)validTag:(NSString *)tag
 completion:(JPUSHTagValidOperationCompletion)completion
        seq:(NSInteger)seq;

参数说明

  • tag

    • 不能设置nil或者空字符串
    • 有效的标签组成:字母(区分大小写)、数字、下划线、汉字。
    • 限制:每个 tag 命名长度限制为 40 字节(判断长度需采用UTF-8编码)
  • completion

    • 回调返回对应的参数tag。并返回对应的状态码:0为成功,其他返回码请参考错误码定义。seq为调用时传入的会话序列号
    • 在回调中查看isBind属性查看是否已经设置,YES为已经设置
  • seq

    • 请求时传入的序列号,会在回调时原样返回

Tags Block

typedef void (^JPUSHTagsOperationCompletion)(NSInteger iResCode, NSSet *iTags, NSInteger seq);
typedef void (^JPUSHTagValidOperationCompletion)(NSInteger iResCode, NSSet *iTags, NSInteger seq, BOOL isBind);

Method - setAlias:completion:seq:

调用此 API 来设置别名

支持的版本

开始支持的版本:3.0.6

接口定义

+ (void)setAlias:(NSString *)alias
  completion:(JPUSHAliasOperationCompletion)completion
         seq:(NSInteger)seq;

参数说明

  • alias

    • 不能设置nil或者空字符串@""
    • 每次调用设置有效的别名,覆盖之前的设置。
    • 有效的别名组成:字母(区分大小写)、数字、下划线、汉字。
    • 限制:alias 命名长度限制为 40 字节。(判断长度需采用UTF-8编码)
  • completion

    • 回调返回对应的参数alias。并返回对应的状态码:0为成功,其他返回码请参考错误码定义。seq为调用时传入的会话序列号
  • seq

    • 请求时传入的序列号,会在回调时原样返回

Method - deleteAlias:completion:seq:

调用此 API 来删除别名,在block中返回结果

支持的版本

开始支持的版本:3.0.6

接口定义

+ (void)deleteAlias:(JPUSHAliasOperationCompletion)completion
            seq:(NSInteger)seq;

参数说明

  • completion

    • 回调返回的tags为nil。返回对应的状态码:0为成功,其他返回码请参考错误码定义。seq为调用时传入的会话序列号
  • seq

    • 请求时传入的序列号,会在回调时原样返回

Method - getAlias:completion:seq:

调用此 API 来查询当前别名,在block中返回结果

支持的版本

开始支持的版本:3.0.6

接口定义

+ (void)getAlias:(JPUSHAliasOperationCompletion)completion
         seq:(NSInteger)seq;

参数说明

  • completion

    • 回调返回的tags为查询结果。返回对应的状态码:0为成功,其他返回码请参考错误码定义。seq为调用时传入的会话序列号
  • seq

    • 请求时传入的序列号,会在回调时原样返回

Alias Block

typedef void (^JPUSHAliasOperationCompletion)(NSInteger iResCode, NSString *iAlias, NSInteger seq);

Method - setTagsWithAlias (with Callback)

调用此 API 来同时设置别名与标签,支持回调函数。

需要理解的是,这个接口是覆盖逻辑,而不是增量逻辑。即新的调用会覆盖之前的设置。

在之前调用过后,如果需要再次改变别名与标签,只需要重新调用此 API 即可。

支持的版本

开始支持的版本:1.4.0

接口定义

+ (void)setTags:(NSSet *)tags alias:(NSString *)alias callbackSelector:(SEL)cbSelector object:(id)theTarget;

参数说明

  • alias

    • nil 此次调用不设置此值。
    • 空字符串 (@"")表示取消之前的设置。
    • 每次调用设置有效的别名,覆盖之前的设置。
    • 有效的别名组成:字母(区分大小写)、数字、下划线、汉字。
    • 限制:alias 命名长度限制为 40 字节。(判断长度需采用UTF-8编码)
  • tags

    • nil 此次调用不设置此值。
    • 空集合([NSSet set])表示取消之前的设置。
    • 集合成员类型要求为NSString类型
    • 每次调用至少设置一个 tag,覆盖之前的设置,不是新增。
    • 有效的标签组成:字母(区分大小写)、数字、下划线、汉字。
    • 限制:每个 tag 命名长度限制为 40 字节,最多支持设置 1000 个 tag,但总长度不得超过7K字节。(判断长度需采用UTF-8编码)
    • 单个设备最多支持设置 1000 个 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设置发生。

支持的版本

开始支持的版本:2.1.0

接口定义

+ (void)setTags:(NSSet *)tags aliasInbackground:(NSString *)alias;

参数说明

  • alias

    • nil 此次调用不设置此值。
    • 空字符串 (@"")表示取消之前的设置。
    • 每次调用设置有效的别名,覆盖之前的设置。
    • 有效的别名组成:字母(区分大小写)、数字、下划线、汉字。
    • 限制:alias 命名长度限制为 40 字节。(判断长度需采用UTF-8编码)
  • tags

    • nil 此次调用不设置此值。
    • 空集合([NSSet set])表示取消之前的设置。
    • 集合成员类型要求为NSString类型
    • 每次调用至少设置一个 tag,覆盖之前的设置,不是新增。
    • 有效的标签组成:字母(区分大小写)、数字、下划线、汉字。
    • 限制:每个 tag 命名长度限制为 40 字节,最多支持设置 1000 个 tag,但总长度不得超过7K字节。(判断长度需采用UTF-8编码)
    • 单个设备最多支持设置 1000 个 tag。App 全局 tag 数量无限制。
[JPUSHService setTags:tags aliasInbackground:alias];

Method - setTagsWithAlias (with block)

调用此 API 来同时设置别名与标签,通过block来返回设置别名与标签的结果。

需要理解的是,这个接口是覆盖逻辑,而不是增量逻辑。即新的调用会覆盖之前的设置。

在之前调用过后,如果需要再次改变别名与标签,只需要重新调用此 API 即可。

支持的版本

开始支持的版本:2.1.0

接口定义

+ (void)setTags:(NSSet *)tags alias:(NSString *)alias fetchCompletionHandle:(void (^)(int iResCode, NSSet *iTags, NSString *iAlias))completionHandler

参数说明

  • alias

    • nil 此次调用不设置此值。
    • 空字符串 (@"")表示取消之前的设置。
    • 每次调用设置有效的别名,覆盖之前的设置。
    • 有效的别名组成:字母(区分大小写)、数字、下划线、汉字、。
    • 限制:alias 命名长度限制为 40 字节。(判断长度需采用UTF-8编码)
  • tags

    • nil 此次调用不设置此值。
    • 空集合([NSSet set])表示取消之前的设置。
    • 集合成员类型要求为NSString类型
    • 每次调用至少设置一个 tag,覆盖之前的设置,不是新增。
    • 有效的标签组成:字母(区分大小写)、数字、下划线、汉字。
    • 限制:每个 tag 命名长度限制为 40 字节,最多支持设置 1000 个 tag,但总长度不得超过7K字节。(判断长度需采用UTF-8编码)
    • 单个设备最多支持设置 1000 个 tag。App 全局 tag 数量无限制。
  • (void (^)(int iResCode, NSSet iTags, NSString iAlias))completionHandler

    • completionHandler用于处理设置返回结果
    • iResCode返回的结果状态码
    • iTags和iAlias返回设置的tag和alias
[JPUSHService setTags:tags alias:alias fetchCompletionHandle:^(int iResCode, NSSet *iTags, NSString *iAlias){
 NSLog(@"rescode: %d, \ntags: %@, \nalias: %@\n", iResCode, iTags, iAlias);
}];

Method - setTags

调用此 API 来设置标签,支持回调函数。

该方法是 setTagsWithAlias (with Callback) 的简化版本,用于只变更标签的情况。

使用建议

如果待设置的 alias / tags 是动态的,有可能在调用 setTagsWithAlias 时因为 alias / tags 无效而整调用失败。

调用此方法只设置 tags,可以排除可能的无效的 alias 对本次调用的影响。

支持的版本

开始支持的版本:1.4.0

接口定义

+ (void)setTags:(NSSet *)tags callbackSelector:(SEL)cbSelector object:(id)theTarget;

参数说明

  • tags

    • nil 此次调用不设置此值。
    • 空集合([NSSet set])表示取消之前的设置。
    • 每次调用至少设置一个 tag,覆盖之前的设置,不是新增。
    • 有效的标签组成:字母(区分大小写)、数字、下划线、汉字。
    • 限制:每个 tag 命名长度限制为 40 字节,最多支持设置 1000 个tag,但总长度不得超过7K字节。(判断长度需采用UTF-8编码)
    • 单个设备最多支持设置 1000 个 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 - setAlias

调用此 API 来设置别名,支持回调函数。

该方法是 setTagsWithAlias (with Callback) 的简化版本,用于只变更别名的情况。

支持的版本

开始支持的版本:1.4.0

接口定义

    + (void)setAlias:(NSString *)alias callbackSelector:(SEL)cbSelector object:(id)theTarget;

参数说明

  • alias
    • 空字符串 (@"")表示取消之前的设置。
    • 每次调用设置有效的别名,覆盖之前的设置。
    • 有效的别名组成:字母(区分大小写)、数字、下划线、汉字。
    • 限制:alias 命名长度限制为 40 字节。(判断长度需采用UTF-8编码)
  • 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 - filterValidTags

用于过滤出正确可用的 tags。

如果总数量超出最大限制则返回最大数量的靠前的可用tags。

使用建议

设置 tags 时,如果其中一个 tag 无效,则整个设置过程失败。

如果 App 的 tags 会在运行过程中动态设置,并且存在对 JPush SDK tag 规定的无效字符,则有可能一个 tag 无效导致这次调用里所有的 tags 更新失败。

这时你可以调用本方法 filterValidTags 来过滤掉无效的 tags,得到有效的 tags,再调用 JPush SDK 的 set tags / alias 方法。

支持的版本

开始支持的版本:1.4.0

接口定义

+ (NSSet*)filterValidTags:(NSSet*)tags;

参数说明

  • tags
    • 原 tag 集合。

接口返回

有效的 tag 集合。

返回错误码参考: 错误码定义

获取 APNs(通知) 推送内容

支持的版本

最初的版本。

功能说明

iOS 设备收到一条推送(APNs),用户点击推送通知打开应用时,应用程序根据状态不同进行处理需在 AppDelegate 中的以下两个方法中添加代码以获取apn内容

  • 如果 App 状态为未运行,此函数将被调用,如果launchOptions包含UIApplicationLaunchOptionsRemoteNotificationKey表示用户点击apn 通知导致app被启动运行;如果不含有对应键值则表示 App 不是因点击apn而被启动,可能为直接点击icon被启动或其他。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions; 
// apn 内容获取:
NSDictionary *remoteNotification = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey]
  • 基于iOS 6 及以下的系统版本,如果 App状态为正在前台或者点击通知栏的通知消息,那么此函数将被调用,并且可通过AppDelegate的applicationState是否为UIApplicationStateActive判断程序是否在前台运行。此种情况在此函数中处理:
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo;
  • 基于iOS 7 及以上的系统版本,如果是使用 iOS 7 的 Remote Notification 特性那么处理函数需要使用
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler;
  • 基于iOS 10及以上的系统版本,原[application: didReceiveRemoteNotification:]将会被系统废弃,
    由新增UserNotifications Framework中的[UNUserNotificationCenterDelegate willPresentNotification:withCompletionHandler:]
    或者[UNUserNotificationCenterDelegate didReceiveNotificationResponse:withCompletionHandler:]方法替代。
    在2.1.9版本及以上可实现SDK封装的JPUSHRegisterDelegate协议方法,适配iOS10新增的delegate协议方法。
    即以下两个方法:
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler; 
// NSDictionary * userInfo = notification.request.content.userInfo; 
// APNs内容为userInfo

- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler; 
// NSDictionary * userInfo = response.notification.request.content.userInfo; 
// APNs内容为userInfo

示例代码

// NS_DEPRECATED_IOS(3_0, 10_0, "Use UserNotifications Framework's -[UNUserNotificationCenterDelegate willPresentNotification:withCompletionHandler:] or -[UNUserNotificationCenterDelegate didReceiveNotificationResponse:withCompletionHandler:] for user visible notifications and -[UIApplicationDelegate application:didReceiveRemoteNotification:fetchCompletionHandler:] for silent remote notifications")
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
  // 取得 APNs 标准信息内容
  NSDictionary *aps = [userInfo valueForKey:@"aps"];
  NSString *content = [aps valueForKey:@"alert"]; //推送显示的内容
  NSInteger badge = [[aps valueForKey:@"badge"] integerValue]; //badge数量
  NSString *sound = [aps valueForKey:@"sound"]; //播放的声音

  // 取得Extras字段内容
  NSString *customizeField1 = [userInfo valueForKey:@"customizeExtras"]; //服务端中Extras字段,key是自己定义的
  NSLog(@"content =[%@], badge=[%d], sound=[%@], customize field  =[%@]",content,badge,sound,customizeField1);

  // iOS 10 以下 Required
  [JPUSHService handleRemoteNotification:userInfo];
}

//iOS 7 Remote Notification
- (void)application:(UIApplication *)application didReceiveRemoteNotification:  (NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {

  NSLog(@"this is iOS7 Remote Notification");

  // iOS 10 以下 Required
  [JPUSHService handleRemoteNotification:userInfo];
  completionHandler(UIBackgroundFetchResultNewData);
}

#pragma mark- JPUSHRegisterDelegate // 2.1.9版新增JPUSHRegisterDelegate,需实现以下两个方法

// iOS 10 Support
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center  willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler {
  // Required
  NSDictionary * userInfo = notification.request.content.userInfo;
  if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
    [JPUSHService handleRemoteNotification:userInfo];
  }
  else {
     // 本地通知
  }
  completionHandler(UNNotificationPresentationOptionAlert); // 需要执行这个方法,选择是否提醒用户,有Badge、Sound、Alert三种类型可以选择设置
}

// iOS 10 Support
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler: (void (^)())completionHandler {
  // Required
  NSDictionary * userInfo = response.notification.request.content.userInfo;
  if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
    [JPUSHService handleRemoteNotification:userInfo];
  }
  else {
     // 本地通知
  }
  completionHandler();  // 系统要求执行这个方法
}

参考文档:Handling Local and Remote Notifications

获取自定义消息推送内容

支持的版本

r1.2.5 以后。

功能说明

只有在前端运行的时候才能收到自定义消息的推送。

从jpush服务器获取用户推送的自定义消息内容和标题以及附加字段等。

实现方法

获取iOS的推送内容需要在delegate类中注册通知并实现回调方法。

在方法- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *) launchOptions 加入下面的代码:


    NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter];
    [defaultCenter addObserver:self selector:@selector(networkDidReceiveMessage:) name:kJPFNetworkDidReceiveMessageNotification object:nil];

实现回调方法 networkDidReceiveMessage

    - (void)networkDidReceiveMessage:(NSNotification *)notification {
        NSDictionary * userInfo = [notification userInfo];
        NSString *content = [userInfo valueForKey:@"content"];
        NSDictionary *extras = [userInfo valueForKey:@"extras"]; 
        NSString *customizeField1 = [extras valueForKey:@"customizeField1"]; //服务端传递的Extras附加字段,key是自己定义的
     
    }

参数描述:

content:获取推送的内容

extras:获取用户自定义参数

customizeField1:根据自定义key获取自定义的value

更多实现参考 SDK下载压缩包中的 demo。

获取 RegistrationID

RegistrationID 定义

集成了 JPush SDK 的应用程序在第一次成功注册到 JPush 服务器时,JPush 服务器会给客户端返回一个唯一的该设备的标识 - RegistrationID。JPush SDK 会以广播的形式发送 RegistrationID 到应用程序。

应用程序可以把此 RegistrationID 保存以自己的应用服务器上,然后就可以根据 RegistrationID 来向设备推送消息或者通知。

API - registrationIDCompletionHandler:(with block)

支持的版本

开始支持的版本:2.1.9。

接口定义

+ (void)registrationIDCompletionHandler:(void(^)(int resCode,NSString *registrationID))completionHandler;

参数说明

  • (void(^)(int resCode,NSString *registrationID))completionHandler
    • completionHandler用于处理设置返回结果
    • resCode返回的结果状态码
    • registrationID返回registrationID
[JPUSHService registrationIDCompletionHandler:^(int resCode, NSString *registrationID) {
    NSLog(@"resCode : %d,registrationID: %@",resCode,registrationID);
}];

温馨提示:

建议使用此接口获取registrationID,模拟器中调用此接口resCode返回1011,registrationID返回nil.

API - registrationID

调用此 API 来取得应用程序对应的 RegistrationID。 只有当应用程序成功注册到 JPush 的服务器时才返回对应的值,否则返回空字符串。

支持的版本

开始支持的版本:1.7.0。

接口定义

+(NSString *)registrationID

温馨提示:

iOS 9系统,应用卸载重装,APNs返回的devicetoken会发生变化,开发者需要获取设备最新的Registration id。请在kJPFNetworkDidLoginNotification的实现方法里面调用"RegistrationID"这个接口来获取 RegistrationID。

附加说明

通过 RegistrationID 推送消息和通知

可以通过 RegistrationID 来推送消息和通知, 参考文档 Push API v3, 当audience 参数为 RegistrationID 时候即可根据 RegistrationID 推送。

注:

要使用此功能,客户端 App 一定要集成有 r1.7.0 及以上版本的 JPush iOS SDK

设置Badge

支持的版本

v1.7.4及后续版本

功能说明

badge是iOS用来标记应用程序状态的一个数字,出现在程序图标右上角。 JPush封装badge功能,允许应用上传badge值至JPush服务器,由JPush后台帮助管理每个用户所对应的推送badge值,简化了设置推送badge的操作。

实际应用中,开发者可以直接对badge值做增减操作,无需自己维护用户与badge值之间的对应关系。

API setBadge

设置JPush服务器中存储的badge值

接口定义

+ (BOOL)setBadge:(int)value

参数说明

  • value 取值范围:[0,99999]

设置badge值,本地仍须调用UIApplication:setApplicationIconBadgeNumber函数


  • 返回值
    • 在value的取值区间内返回 TRUE,否则返回FALSE

API resetBadge

清空JPush服务器中存储的badge值,即 [setBadge:0]

接口定义

+ (void)resetBadge

本地通知

支持的版本

v1.8.0及后续版本,v2.1.9版本有更新

功能说明

iOS 设备收到一条本地通知,用户点击通知打开应用时,应用程序根据状态不同进行处理需在 AppDelegate 中的以下两个方法中添加代码以获取本地通知内容

  • 如果 App 状态为未运行,此函数将被调用,如果launchOptions包含UIApplicationLaunchOptionsLocalNotificationKey表示用户点击本地通知导致app被启动运行;如果不含有对应键值则表示 App 不是因点击本地通知而被启动,可能为直接点击icon被启动或其他。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions; 
// 本地通知内容获取:NSDictionary *localNotification = [launchOptions objectForKey: UIApplicationLaunchOptionsLocalNotificationKey]
  • 如果 App状态为正在前台或者后台运行,那么此函数将被调用,并且可通过AppDelegate的applicationState是否为UIApplicationStateActive判断程序是否在前台运行。此种情况在此函数中处理:
// NS_DEPRECATED_IOS(4_0, 10_0, "Use UserNotifications Framework's -[UNUserNotificationCenterDelegate willPresentNotification:withCompletionHandler:] or -[UNUserNotificationCenterDelegate didReceiveNotificationResponse:withCompletionHandler:]")
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification;
// 本地通知为notification
  • 在iOS 10以上上述方法将被系统废弃,由新增UserNotifications Framework中的-[UNUserNotificationCenterDelegate willPresentNotification:withCompletionHandler:] 或者 -[UNUserNotificationCenterDelegate didReceiveNotificationResponse:withCompletionHandler:]方法替代。为此,SDK封装了JPUSHRegisterDelegate协议,只需实现相应的协议方法即可适配iOS10新增的delegate方法,与上述远程推送新回调方法一致,也即是如下方法:
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^) (NSInteger))completionHandler; 
   // if (![notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) { 
   // 本地通知为notification 
   // }

- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler: (void (^)())completionHandler; 
  // if (![response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) { 
  // 本地通知为response.notification 
  // }

Method AddNotification

支持版本

v2.1.9及后续版本

功能说明

API 用于注册或更新推送(支持iOS10,并兼容iOS10以下版本)

接口定义

+ (void)addNotification:(JPushNotificationRequest *)request;

参数说明

  • request [JPushNotificationRequest]实体类型,可传入推送的属性

调用说明

request中传入已有推送的request.requestIdentifier即更新已有的推送,否则为注册新推送。

代码示例

- (void)testAddNotification {
  JPushNotificationContent *content = [[JPushNotificationContent alloc] init];
  content.title = @"Test Notifications";
  content.subtitle = @"2016";
  content.body = @"This is a test code";
  content.badge = @1;
  content.categoryIdentifier = @"Custom Category Name";

  // 5s后提醒 iOS 10 以上支持
  JPushNotificationTrigger *trigger1 = [[JPushNotificationTrigger alloc] init];
  trigger1.timeInterval = 5;
  //每小时重复 1 次 iOS 10 以上支持
  JPushNotificationTrigger *trigger2 = [[JPushNotificationTrigger alloc] init];
  trigger2.timeInterval = 3600;
  trigger2.repeat = YES;

  //每周一早上8:00提醒,iOS10以上支持
  NSDateComponents *components = [[NSDateComponents alloc] init];
  components.weekday = 2;
  components.hour = 8;
  JPushNotificationTrigger *trigger3 = [[JPushNotificationTrigger alloc] init];
  trigger3.dateComponents = components;
  trigger3.repeat = YES;

  //#import <CoreLocation/CoreLocation.h>
  //一到某地点提醒,iOS8以上支持
  CLRegion *region = [[CLRegion alloc] initCircularRegionWithCenter:CLLocationCoordinate2DMake(0, 0) radius:0 identifier:@"test"];
  JPushNotificationTrigger *trigger4 = [[JPushNotificationTrigger alloc] init];
  trigger4.region = region;

  //5s后提醒,iOS10以下支持
  JPushNotificationTrigger *trigger5 = [[JPushNotificationTrigger alloc] init];
  trigger5.fireDate = [NSDate dateWithTimeIntervalSinceNow:5];

  JPushNotificationRequest *request = [[JPushNotificationRequest alloc] init];
  request.requestIdentifier = @"sampleRequest";
  request.content = content;
  request.trigger = trigger1;//trigger2;//trigger3;//trigger4;//trigger5;
  request.completionHandler = ^(id result) {
    NSLog(@"结果返回:%@", result);
  };
  [JPUSHService addNotification:request];
}

Method RemoveNotification

支持版本

v2.1.9及后续版本

功能说明

API 用于移除待推送或已在通知中心显示的推送(支持iOS10,并兼容iOS10以下版本)

接口定义

+ (void)removeNotification:(JPushNotificationIdentifier *)identifier;

参数说明

  • identifier [JPushNotificationIdentifier]实体类型

调用说明

  • iOS10以上identifier设置为nil,则移除所有在通知中心显示推送和待推送请求,也可以通过设置identifier.delivered和identifier.identifiers来移除相应在通知中心显示推送或待推送请求,identifier.identifiers如果设置为nil或空数组则移除相应标志下所有在通知中心显示推送或待推送请求;iOS10以下identifier设置为nil,则移除所有推送,identifier.delivered属性无效,另外可以通过identifier.notificationObj传入特定推送对象来移除此推送。

代码示例

- (void)testRemoveNotification {
  JPushNotificationIdentifier *identifier = [[JPushNotificationIdentifier alloc] init];
  identifier.identifiers = @[@"sampleRequest"];
  identifier.delivered = YES;  //iOS10以上有效,等于YES则在通知中心显示的里面移除,等于NO则为在待推送的里面移除;iOS10以下无效
  [JPUSHService removeNotification:identifier];
}


- (void)testRemoveAllNotification {
  [JPUSHService removeNotification:nil];  // iOS10以下移除所有推送;iOS10以上移除所有在通知中心显示推送和待推送请求

//  //iOS10以上支持
//  JPushNotificationIdentifier *identifier = [[JPushNotificationIdentifier alloc] init];
//  identifier.identifiers = nil;
//  identifier.delivered = YES;  //等于YES则移除所有在通知中心显示的,等于NO则为移除所有待推送的
//  [JPUSHService removeNotification:identifier];
}

Method FindNotification

支持版本

v2.1.9及后续版本

功能说明

API 用于查找推送(支持iOS10,并兼容iOS10以下版本)

接口定义

+ (void)findNotification:(JPushNotificationIdentifier *)identifier;

参数说明

  • identifier [JPushNotificationIdentifier]实体类型

调用说明

  • iOS10以上可以通过设置identifier.delivered和identifier.identifiers来查找相应在通知中心显示推送或待推送请求,identifier.identifiers如果设置为nil或空数组则返回相应标志下所有在通知中心显示推送或待推送请求;iOS10以下identifier.delivered属性无效,identifier.identifiers如果设置nil或空数组则返回所有推送。
  • 须要设置identifier.findCompletionHandler回调才能得到查找结果,通过(NSArray *results)返回相应对象数组。

代码示例

- (void)testFindNotification {
  JPushNotificationIdentifier *identifier = [[JPushNotificationIdentifier alloc] init];
  identifier.identifiers = @[@"sampleRequest"];
  identifier.delivered = YES;  //iOS10以上有效,等于YES则在通知中心显示的里面查找,等于NO则在待推送的里面查找;iOS10以下无效
  identifier.findCompletionHandler = ^(NSArray *results) {
  NSLog(@"返回结果为:%@", results); // iOS10以下返回UILocalNotification对象数组,iOS10以上根据delivered传入值返回UNNotification或UNNotificationRequest对象数组
};
  [JPUSHService findNotification:identifier];
}

- (void)testFindAllNotification {
  JPushNotificationIdentifier *identifier = [[JPushNotificationIdentifier alloc] init];
  identifier.identifiers = nil;
  identifier.delivered = YES;  //iOS10以上有效,等于YES则查找所有在通知中心显示的,等于NO则为查找所有待推送的;iOS10以下无效
  identifier.findCompletionHandler = ^(NSArray *results) {
  NSLog(@"返回结果为:%@", results); // iOS10以下返回UILocalNotification对象数组,iOS10以上根据delivered传入值返回UNNotification或UNNotificationRequest对象数组
};
  [JPUSHService findNotification:identifier];
}

Method SetLocalNotification

功能说明

API 用于注册本地通知

v2.1.9版后将会被废弃,由AddNotification方法取代,建议及早放弃使用。

接口定义

+ (UILocalNotification *)setLocalNotification:(NSDate *)fireDate
                                    alertBody:(NSString *)alertBody
                                        badge:(int)badge
                                  alertAction:(NSString *)alertAction
                                identifierKey:(NSString *)notificationKey
                                     userInfo:(NSDictionary *)userInfo
                                    soundName:(NSString *)soundName;

iOS8 新参数使用API。非iOS8版本或者不需要使用iOS8新功能请使用上面的API


+ (UILocalNotification *)setLocalNotification:(NSDate *)fireDate
                                    alertBody:(NSString *)alertBody
                                        badge:(int)badge
                                  alertAction:(NSString *)alertAction
                                identifierKey:(NSString *)notificationKey
                                     userInfo:(NSDictionary *)userInfo
                                    soundName:(NSString *)soundName
                                       region:(CLRegion *)region
                           regionTriggersOnce:(BOOL)regionTriggersOnce
                                     category:(NSString *)category

参数说明

  • fireDate 本地推送触发的时间
  • alertBody 本地推送需要显示的内容
  • badge 角标的数字。如果不需要改变角标传-1
  • alertAction 弹框的按钮显示的内容(iOS 8默认为"打开",其他默认为"启动")
  • notificationKey 本地推送标示符
  • userInfo 自定义参数,可以用来标识推送和增加附加信息
  • soundName 本地通知声音名称设置,空为默认声音
  • region
  • regionTriggersOnce
  • category

调用说明

fireDate必须大于当前时间,同时不能为空。注册通知数目必须小于64个。

代码示例

[JPUSHService setLocalNotification:[NSDate dateWithTimeIntervalSinceNow:100]
                      alertBody:@"alert content"
                          badge:1
                    alertAction:@"buttonText"
                  identifierKey:@"identifierKey"
                       userInfo:nil
                      soundName:nil];

Method showLocalNotificationAtFront

功能说明

API用来在APP前台运行时,仍然将通知显示出来。(样式为UIAlertView)

iOS10以下还可继续使用,iOS10以上在[JPUSHRegisterDelegate jpushNotificationCenter:willPresentNotification:withCompletionHandler:]方法中调用completionHandler(UNNotificationPresentationOptionSound | UNNotificationPresentationOptionAlert);即可,故v2.1.9版后将会被废弃,建议及早放弃使用。

接口定义

+ (void)showLocalNotificationAtFront:(UILocalNotification *)notification
                       identifierKey:(NSString *)notificationKey;

参数说明

  • notification 当前触发的UILocalNotification
  • notificationKey 过滤不需要前台显示的通知。只有notificationKey标示符的通知才会在前台显示。如果需要全部都显示,该参数传nil。

调用说明

API必须放在 - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification(AppDelegate.m) 苹果的回调函数下。

代码示例

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { [JPUSHService showLocalNotificationAtFront:notification identifierKey:@"identifierKey"]; }

Delegate Method findLocalNotificationWithIdentifier

功能说明

API 用于获取自定义的identifierKey标示符的UILocationNotification对象

v2.1.9版后将会被废弃,由FindNotification方法取代,建议及早放弃使用。

接口定义

+ (NSArray *)findLocalNotificationWithIdentifier:(NSString *)notificationKey;

参数说明

  • notificationKey 获取通知对象的标示符

调用说明

API返回数组,包含所有和identifierKey匹配的LocalNotification对象,如果没找到,则为一个空的数组对象。

代码示例


NSArray *LocalNotifications = [JPUSHService findLocalNotificationWithIdentifier:@"identifierKey"];

Delegate Method deleteLocalNotification

功能说明

API 用于删除指定的LocalNotification对象

v2.1.9版后将会被废弃,由RemoveNotification方法取代,建议及早放弃使用。

接口定义

+ (void)deleteLocalNotification:(UILocalNotification *)localNotification;

参数说明

  • localNotification 删除的本地通知对象

调用说明

API参数localNotification不能为nil.

代码示例

[JPUSHService deleteLocalNotification:localNotification];

Delegate Method deleteLocalNotificationWithIdentifierKey

功能说明

API 用于删除指定所有identifierKey标示符的通知对象

v2.1.9版后将会被废弃,由RemoveNotification方法取代,建议及早放弃使用。

接口定义

+ (void)deleteLocalNotificationWithIdentifierKey:(NSString *)notificationKey;

参数说明

  • notificationKey 删除的通知拥有的标示符

调用说明

API参数notificationKey不能为nil.

代码示例

[JPUSHService deleteLocalNotificationWithIdentifierKey:@"identifierKey"]; 

Delegate Method clearAllLocalNotification

功能说明

API 用于清除所有注册的通知

v2.1.9版后将会被废弃,由RemoveNotification方法取代,建议及早放弃使用。

接口定义

+ (void)clearAllLocalNotifications;

代码示例

[JPUSHService clearAllLocalNotifications];

日志等级设置

支持版本

v1.8.0 版本开始

Method - setDebugMode

功能说明

API 用于开启Debug模式,显示更多的日志信息

接口定义

+ (void)setDebugMode;

调用说明

当需要了解更多的调试信息时候,调用API开启Debug模式

代码示例

[JPUSHService setDebugMode];

Method setLogOFF

功能说明

API用来关闭日志信息(除了必要的错误信息)

接口定义

+ (void)setLogOFF;

调用说明

不需要任何调试信息的时候,调用此API (发布时建议调用此API,用来屏蔽日志信息,节省性能消耗)

代码示例

[JPUSHService setLogOFF];

页面的统计

支持的版本

r1.7.0 版本开始。

功能说明

本 API 用于“用户指定页面使用时长”的统计,并上报到服务器,在 Portal 上展示给开发者。页面统计集成正确,才能够获取正确的页面访问路径、访问深度(PV)的数据。

API

接口定义

+ (void)startLogPageView:(NSString*)pageName;
+ (void)stopLogPageView:(NSString*)pageName;
+ (void)beginLogPageView:(NSString*)pageName duration:(int)seconds;

参数说明

  • pageName 需要统计页面自定义名称
  • duration 自定义的页面时间

调用说明

应在所有的需要统计得页面得 viewWillAppear 和 viewWillDisappear 加入 startLogPageView 和 stopLogPageView 来统计当前页面的停留时间。

或者直接使用 beginLogPageView 来自定义加入页面和时间信息。

代码示例

- (void)viewWillAppear:(BOOL)animated
    {
        [super viewWillAppear:animated];
        [JPUSHService startLogPageView:@"PageOne"];
    }
- (void)viewWillDisappear:(BOOL)animated 
    {
        [super viewWillDisappear:animated];
        [JPUSHService stopLogPageView:@"PageOne"];
    }   
-(void)trackView
   {
       [JPUSHService beginLogPageView:@"PageTwo" duration:10];
   }

地理位置统计

支持版本

v1.8.0版本开始

在 iOS11 上,原有的 NSLocationAlwaysUsageDeion 被降级为 NSLocationWhenInUseUsageDeion。因此,需要在 plist 文件中配置 NSLocationAlwaysAndWhenInUseUsageDeion,在获取定位的时候,系统才会弹出提示窗口。建议新旧 key 值都在plist里配置上。

Method SetLatitude: longitude

功能说明

API 用于统计用户地理信息。

接口定义

+ (void)setLatitude:(double)latitude longitude:(double)longitude;

参数说明

  • latitude 地理位置纬度
  • longitude 地理位置经度

调用说明

需要加入 CoreLocation.framework库, 并且引入 <CoreLocation/CoreLocation.h>头文件(#import <CoreLocation/CoreLocation.h >)

经度和纬度需要开发者自己调用苹果的地理位置信息API获取。

代码示例


[JPUSHService setLatitude:100.0 longitude:100.0];

Method setLocation

功能说明

API用来统计地理位置信息

接口定义

+ (void)setLocation:(CLLocation *)location;

参数说明

  • location 当前地理位置的CLLocation对象

调用说明

需要加入 CoreLocation.framework库, 并且引入<CoreLocation/CoreLocation.h>头文件(#import <CoreLocation/CoreLocation.h>)

CLLocation对象需要开发者自己调用苹果的地理位置信息API获取。

代码示例

Build Phases中Link Binary With Libraries添加CoreLocation.framework
应用的plist增加NSLocationAlwaysUsageDescription或NSLocationWhenInUseUsageDescription字段,内容为是否允许alert的内容

#import <CoreLocation/CoreLocation.h>
@interface xxx : UIViewController<CLLocationManagerDelegate>
@property(nonatomic, strong) CLLocationManager *currentLoaction;

- (void)viewDidLoad {
  //注册LocationManager
  _currentLoaction = [[CLLocationManager alloc] init];
  _currentLoaction.delegate = self;
#ifdef __IPHONE_8_0
  if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
    [_currentLoaction requestAlwaysAuthorization];
  }
#endif
    if ([CLLocationManager locationServicesEnabled]) {
        NSLog(@"您的设备的[设置]-[隐私]-[定位]已开启");
        [_currentLoaction startUpdatingLocation];
    }
    else{
        NSLog(@"您的设备的[设置]-[隐私]-[定位]尚未开启");
  }
}

#ifdef __IPHONE_6_0
- (void)locationManager:(CLLocationManager *)manager
     didUpdateLocations:(NSArray *)locations {
  if ([[UIDevice currentDevice].systemVersion floatValue] >= 6.0) {
    CLLocation *newLocation = [locations lastObject];
    float longtitude = newLocation.coordinate.longitude;
    float latitude = newLocation.coordinate.latitude;
    [JPUSHService setLocation:newLocation];
    //[JPUSHService setLatitude:latitude longitude:longtitude];
    [manager stopUpdatingLocation];
  }
}
#endif

- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation {
  if ([[UIDevice currentDevice].systemVersion floatValue] < 6.0) {
    float longtitude = newLocation.coordinate.longitude;
    float latitude = newLocation.coordinate.latitude;
    [JPUSHService setLocation:newLocation];
    //[JPUSHService setLatitude:latitude longitude:longtitude];
    [manager stopUpdatingLocation];
  }
}

- (void)locationManager:(CLLocationManager *)manager   
       didFailWithError:(NSError *)error{
//获取地理位置错误处理
}

崩溃日志统计

支持版本

v1.8.0版本开始

Method crashLogON

功能说明

API 用于统计用户应用崩溃日志

接口定义

+ (void)crashLogON;

调用说明

如果需要统计Log信息,调用该接口。当你需要自己收集错误信息时,切记不要调用该接口。

代码示例

[JPUSHService crashLogON];

Notification Service Extension相关接口

支持的版本

Notification Service Extension SDK v1.0.0 (随 JPush iOS SDK 3.0.7 版本发布) 及以后的版本

功能说明

使用Notification Service Extension SDK 上报推送送达情况

API jpushSetAppkey

设置appkey接口,必须提前调用

接口定义

+ (void)jpushSetAppkey:(NSString *)appkey

参数说明

  • appkey 需要和main app中的JPush SDK的appkey保持一致

API jpushReceiveNotificationRequest:with:

消息送达统计接口,调用该接口上报APNs消息体中的JPush相关数据

接口定义

+ (void)jpushReceiveNotificationRequest:(UNNotificationRequest *)request with:(void (^)(void))completion

参数说明

  • request UNNotificationRequest
  • completion 消息送达上报回调,请在该回调中执行显示APNs等操作

客户端错误码定义

Code 描述 详细解释
1005 AppKey不存在
1008 AppKey非法 请到官网检查此应用详情中的appkey,确认无误
1009 当前appkey无对应应用 当前的appkey下没有创建iOS应用。请到官网检查此应用的应用详情
6001 无效的设置,tag/alias 不应参数都为 null
6002 设置超时 建议重试
6003 alias 字符串不合法 有效的别名、标签组成:字母(区分大小写)、数字、下划线、汉字
6004 alias超长。最多 40个字节 中文 UTF-8 是 3 个字节
6005 某一个 tag 字符串不合法 有效的别名、标签组成:字母(区分大小写)、数字、下划线、汉字
6006 某一个 tag 超长。一个 tag 最多 40个字节 中文 UTF-8 是 3 个字节
6007 tags 数量超出限制。最多 1000个 这是一台设备的限制。一个应用全局的标签数量无限制。
6008 tag 超出总长度限制 总长度最多 7K 字节
6009 未知错误 SDK发生了意料之外的异常
6011 10s内设置tag或alias大于10次 短时间内操作过于频繁
6014 请求繁忙 请求频率太高,本次请求失败,请重新发起请求
6015 黑名单 用户被拉入黑名单
6016 该用户无效 失效用户请求失败
6017 该请求无效 本次请求出现异常参数,请求无效
6018 Tags过多 该用户tags已设置超过1000个,不能在设置
6019 获取Tags失败 在获取全部tags时发生异常
6020 请求失败 发生了特殊问题导致请求失败
6021 tags操作正在进行中 上一次的tags请求还在等待响应,暂时不能执行下一次请求
6022 alias操作正在进行中 上一次的alias请求还在等待响应,暂时不能执行下一次请求

更多地说明请参考Apple的官方文档


Copyright 2011-2017, jiguang.cn, All Rights Reserved.
粤ICP备12056275号-13 深圳市和讯华谷信息技术有限公司

Documentation built with MkDocs.