全部产品
云市场

iOS接入

更新时间:2019-09-03 10:06:42

环境准备

参考接入准备一节的介绍:https://help.aliyun.com/document_detail/87885.html?spm=a2c4g.11186623.6.554.6cce7057jIKW4o

环境配置

  1. 在Podfile中添加依赖:

    1. pod 'AliEMASConfigure', '0.0.1.13'
    2. pod 'NetworkSDK', '10.0.4.2'
    3. pod 'TBAccsSDK', '10.0.7'
    4. pod 'PushCenterSDK', '10.0.6'
  2. 在EMAS后台下载脚手架配置文件AliyunEmasServices-Info.plist,将配置文件添加到项目中。AliEMASConfigure会自动读取配置文件,并将配置传递给推送SDK;

  3. 在AppDelegate中初始化EMAS推送SDK:

    1. // --自初始化头文件
    2. #import <AliEMASConfigure/AliEMASConfigure.h>
    3. // --基础库头文件
    4. #import <NetworkSDK/NetworkCore/NWNetworkConfiguration.h>
    5. #import <NetworkSDK/NetworkCore/NetworkDemote.h>
    6. #import <NetworkSDK/NetworkCore/NWuserLoger.h>
    7. #import <NetworkSDK/AliReachability/NWLog.h>
    8. // --ACCS头文件
    9. #import <TBAccsSDK/TBAccsManager.h>
    10. // --PUSH头文件
    11. #import <PushCenterSDK/TBSDKPushCenterConfiguration.h>
    12. #import <PushCenterSDK/TBSDKPushCenterEngine.h>
    13. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    14. [NWLog setLogLevel:NW_LOG_DEBUG];
    15. [self initAccsConfig];
    16. [self initPushConfig];
    17. [self registerNotificationSetting];
    18. }
    19. // ACCS初始化部分
    20. - (void)initAccsConfig {
    21. void tbAccsSDKSwitchLog(BOOL logCtr);
    22. tbAccsSDKSwitchLog(YES); // 打开调试日志
    23. TBAccsManager *accsManager = [TBAccsManager accsManagerByConfigureName:nil];
    24. [accsManager startAccs];
    25. [accsManager bindAppWithAppleToken: nil
    26. callBack:^(NSError *error, NSDictionary *resultsDict) {
    27. if (error) {
    28. NSLog(@"\n\n绑定App出错了 %@\n\n", error);
    29. }
    30. else {
    31. NSLog(@"\n\n绑定App成功了\n\n");
    32. }
    33. }];
    34. }
    35. // PUSH
    36. - (void)initPushConfig {
    37. TBSDKPushCenterEngine *pce = [TBSDKPushCenterEngine sharedInstanceWithDefaultConfigure];
    38. [TBSDKPushCenterConfiguration shareInstance].scheduleLocalNotificationWhenAppBackground = NO;
    39. [pce start];
    40. }
  4. 配置APNS推送能力:

    1. @interface AppDelegate () <UNUserNotificationCenterDelegate>
    2. @end
    3. // 注册推送
    4. - (void)registerNotificationSetting {
    5. if (@available(iOS 10.0, *)) {
    6. UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    7. center.delegate = self;
    8. [center requestAuthorizationWithOptions:(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error) {
    9. if(error) {
    10. NSLog( @"Push registration FAILED" );
    11. NSLog( @"ERROR: %@ - %@", error.localizedFailureReason, error.localizedDescription );
    12. NSLog( @"SUGGESTIONS: %@ - %@", error.localizedRecoveryOptions, error.localizedRecoverySuggestion );
    13. return;
    14. }
    15. [[UIApplication sharedApplication] registerForRemoteNotifications];
    16. NSLog( @"Push registration success." );
    17. }];
    18. } else {
    19. [[UIApplication sharedApplication] registerUserNotificationSettings:
    20. [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge)
    21. categories:nil]];
    22. [[UIApplication sharedApplication] registerForRemoteNotifications];
    23. NSLog(@"[APNS] registerNotificationSetting");
    24. }
    25. }
    26. // 注册deviceToken
    27. - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    28. NSLog(@"[APNS] device token: %@", deviceToken);
    29. TBSDKPushCenterEngine *pce = [TBSDKPushCenterEngine sharedInstanceWithDefaultConfigure];
    30. [pce upLoaderDeviceToken:deviceToken userInfo:nil callback:^(NSDictionary *result, NSError *error){
    31. if ( error ) {
    32. NSLog(@"[APNS] update token error: %@", error);
    33. } else {
    34. [self initPushParameters];
    35. NSLog(@"[APNS] update token successfully!");
    36. }
    37. }];
    38. }
    39. - (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
    40. NSLog(@"[APNS] register error: %@", error);
    41. }
    42. // iOS6及以下系统接收通知
    43. - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
    44. NSLog(@">>>>>>> [AGOO MESSAGE]: %@", userInfo);
    45. }
    46. // iOS7及iOS10以下系统接收通知
    47. - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler: (void (^)(UIBackgroundFetchResult))completionHandler {
    48. NSLog(@">>>>>>> [AGOO MESSAGE]: %@", userInfo);
    49. completionHandler(UIBackgroundFetchResultNewData);
    50. }
    51. // iOS10及以上系统接收通知
    52. - (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler API_AVAILABLE(ios(10.0)){
    53. NSDictionary *userInfo = response.notification.request.content.userInfo;
    54. NSLog(@">>>>>>> [AGOO MESSAGE]: %@", userInfo);
    55. }
  5. 绑定/解绑Agoo别名:

    1. - (IBAction)bindUser {
    2. NSString *alias = @"myAlias";
    3. TBSDKPushCenterEngine *pce = [TBSDKPushCenterEngine sharedInstanceWithDefaultConfigure];
    4. [pce bindUserIntoPushCenterWithAlias:alias userInfo:nil callback:^(NSDictionary *result, NSError *error){
    5. if (error) {
    6. [self displayText:[NSString stringWithFormat:@"绑定别名错误:%@", error]];
    7. } else {
    8. [self displayText:[NSString stringWithFormat:@"绑定别名成功"]];
    9. }
    10. }];
    11. }
    12. - (IBAction)unbindUser {
    13. TBSDKPushCenterEngine *pce = [TBSDKPushCenterEngine sharedInstanceWithDefaultConfigure];
    14. [pce unbindUserIntoPushCenterWithPushUserInfo:nil callback:^(NSDictionary *result, NSError *error){
    15. if (error) {
    16. [self displayText:[NSString stringWithFormat:@"解绑别名发生错误: %@", error]];
    17. } else {
    18. [self displayText:[NSString stringWithFormat:@"解除绑定别名成功"]];
    19. }
    20. }];
    21. }
  6. 登录EMAS后台,在移动推送->配置管理界面,配置开发环境和生成环境的推送证书;

    消息通道

    如果应用运行在后台,会接收苹果的APNS推送,如果运行在前台,推送消息则来自于ACCS通道,为了接收到ACCS推送的长连消息, 需要创建一个PushSDKReceiverConfig.plist文件,plist文件内容如下:

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    3. <plist version="1.0">
    4. <dict>
    5. <key>ReceiverList</key>
    6. <array>
    7. <dict>
    8. <key>class</key>
    9. <string>PushMessageReceiver</string>
    10. <key>isSingleton</key>
    11. <true/>
    12. </dict>
    13. </array>
    14. </dict>
    15. </plist>

    然后创建一个PushMessageReceiver类接收ACCS消息:

    1. @implementation PushMessageReceiver
    2. - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler {
    3. NSLog(@">>>>>>> [AGOO MESSAGE]: %@", userInfo);
    4. }
    5. @end

推送验证

在EMAS后台的移动推送->设备查询界面,选择查询类型“别名”,输入myAlias,如果一切配置无误,搜索结果会显示当前建连成功的设备信息;

在移动推送->推送消息界面可以给App发送推送消息,由于带图推送是iOS10以后才引入,如果需要测试配图推送,需要自己创建Notification Content Extension。

常见的几种推送收不到情况:

  1. 推送证书问题:可以在EMAS后台的移动推送->配置管理界面,使用测试Token功能测试证书的有效性;
  2. 保证Xcode的Capabilities推送开关开启;
  3. 保证ACCS SDK的[TBAccsManager bindAppWithAppleToken:callBack:]回调绑定App成功;
  4. 保证Appdelegate的application:didRegisterForRemoteNotificationsWithDeviceToken:能够成功获得deviceToken;

上报消息的到达率和点开率

  1. // 4表示消息到达,8表示消息被点开
  2. [TBSDKPushCenterUserTrackEngine uploadAgooPoint:@"message_id" MsgStatus:@"4"];
  3. [TBSDKPushCenterUserTrackEngine uploadAgooPoint:@"message_id" MsgStatus:@"8"];

调试和错误码

  1. /**
  2. * LOG 打印级别
  3. */
  4. typedef enum {
  5. kTBPushLogNone = 0, // 关闭,不打印
  6. kTBPushLogError = 1, // 打印 ERROR 级别
  7. kTBPushLogDebug = 2 // 打印 DEBUG 级别
  8. } TBPushLogLevel;
  9. // 因为PushCenterSDK 强依赖 TBAccsSDK 与 NetworkSDK, 需要是可以打开下级SDK日志
  10. [TBSDKPushCenterConfiguration setLogLevelWithPushSDK:kTBPushLogDebug
  11. withAccsSDK:kTBPushLogDebug
  12. withNetworkSDK:kTBPushLogDebug];

错误码

设备相关
错误码 描述
-100 设备未注册
-101 构造设备注册消息失败
-102 设备注册返回空
-103 设备注册失败
上传apple token相关
错误码 描述
-200 空 TOKEN
-201 构造UploadToken消息失败
-202 发送UploadToken失败
-203 UploadToken返回失败
绑定用户相关
错误码 描述
-300 空 Alias
-301 构造BindUser消息失败
-302 上传BindUser失败
-303 BindUser返回空
-305 BindUser返回空
-306 UnbindUser失败
应用内push相关
错误码 描述
-400 ACCS payload 空
-401 ACCS payload 解析失败
-402 MESSAGE BODY EMPTY
-403 MESSAGE ID EMPTY
-405 MESSAGE 解析错误
-406 MESSAGE 解析错误
-407 MESSAGE BODY 解密失败
-408 MESSAGE 为送达
基础accs通道相关
错误码 描述
-500 ACCS SDK 未接入
-501 ACCS 无 payload
-502 ACCS 通道错误