全部产品
云市场
云游戏

iOS SDK配置

更新时间:2020-08-24 14:32:44

1. 创建应用

到阿里云移动推送控制台创建应用,应用创建完成后,进入移动推送相关模块进行设置,具体操作请参见 创建APP

2. SDK 下载和集成

移动推送iOS SDK 目前自持手动集成自动工具CocoaPods集成。

2.1 手动集成

2.1.1 在控制台下载推送 SDK

  • 登录您的 阿里云 EMAS 控制台 显示如下页面 点击 SDK 下载:

    ios-sdk-download1

  • 在右侧弹窗 下载您需要集成的SDK:

    ios-sdk-download2

2.1.2 公共包依赖

  • libz.tbd
  • libresolv.tbd
  • CoreTelephony.framework
  • SystemConfiguration.framework
  • libsqlite3.tbd

2.1.3 SDK目录结构

  • CloudPushSDK.framework
  • AlicloudUtils.framework
  • UTDID.framework
  • UTMini.framework

2.1.4 引入Framework

  • Xcode中,直接把下载SDK目录中的framework拖入对应Target下即可,在弹出框勾选Copy items if needed
  • Build Phases -> Link Binary With Libraries中,引入2.1.2列出的公共包;

2.2 Pod依赖

  • 指定Master仓库和阿里云仓库:
  1. source 'https://github.com/CocoaPods/Specs.git'
  2. source 'https://github.com/aliyun/aliyun-specs.git'
  • 添加依赖:
  1. pod 'AlicloudPush', '~> 1.9.9'

(~>为模糊指定版本号方式,~> 1.9.9表明引用版本位于1.9.9 <= version < 2.0之间的最新版本SDK,用户可参考Podfile Syntax Reference,根据项目需要指定 SDK 版本。)

2.3 下载SDK统一配置文件

  • 在控制台产品概览页面,下载App的配置文件AliyunEmasServices-Info.plist,如下图所示:unit_config_pic

  • Xcode中,把下载的AliyunEmasServices-Info.plist文件拖入对应App Target下即可,在弹出框勾选Copy items if needed

  • 【附】AliyunEmasServices-Info.plist配置文件,包含SDK初始化所需的配置信息,用户只需要调用无需手动输入配置信息的autoInit初始化接口,API调用可参考:API介绍

2.4 工程引入头文件

  1. #import <CloudPushSDK/CloudPushSDK.h>

2.5 说明

  • 应用的targets -> Build Settings -> Linking -> Other Linker Flags,请加上-ObjC这个属性,否则推送服务无法正常使用;如果之前已经设置了force_load,需要设置-force_load <framework_path>/CloudPushSDK.framework/CloudPushSDK

  • 移动推送iOS SDK已经完成ATS适配,请求都以HTTPS发出,无需在Info.plist中进行ATS配置。

  • 若SDK集成过程中出现UTDID冲突,请参考 阿里云-移动云产品SDK UTDID冲突解决方案

3. Push SDK使用

  • 请参照以下代码完成SDK的初始化,appKey/appSecret的获取参考创建App
  • 注意:百川云推送迁移来的用户,不要使用百川平台获取到的appKey/appSecret,参考上述链接从阿里云平台获取,否则会发生鉴权错误。
  • > iOS 10系统的设备需注意,源于工信部的要求,国行手机首次安装App时,会弹出一个询问用户“是否允许应用访问数据”的弹框,如下图所示。在用户点击允许前,或点击不允许,App的网络环境是不通的,会导致推送SDK的初始化失败,推送服务不能正常使用。推送各接口内部是有重试机制的,但是,建议用户在业务层,也要捕获处理SDK接口错误回调,确保正确获知SDK接口调用状态。

ios-network-alert

  1. - (void)initCloudPush {
  2. // SDK初始化
  3. [CloudPushSDK asyncInit:@"*****" appSecret:@"*****" callback:^(CloudPushCallbackResult *res) {
  4. if (res.success) {
  5. NSLog(@"Push SDK init success, deviceId: %@.", [CloudPushSDK getDeviceId]);
  6. } else {
  7. NSLog(@"Push SDK init failed, error: %@", res.error);
  8. }
  9. }];
  10. }
  • 向苹果 APNs 注册获取 deviceToken 并上报到阿里云推送服务器;
  1. # pragma mark -- 向APNs注册, 获取deviceToken并上报给SDK
  2. - (void)registerAPNS:(UIApplication *)application {
  3. float systemVersionNum = [[[UIDevice currentDevice] systemVersion] floatValue];
  4. NSLog(@"\n \n ==== 当前手机系统版本 : %f",systemVersionNum);
  5. if (systemVersionNum >= 10.0) {
  6. _notificationCenter = [UNUserNotificationCenter currentNotificationCenter];
  7. // 创建 category , 并注册到通知中心
  8. [self createCustomNotificationCategory];
  9. // 遵循协议
  10. _notificationCenter.delegate = self;
  11. // 咨询客户是否允许推送通知 , 以及设置推送的类型
  12. [_notificationCenter requestAuthorizationWithOptions:UNAuthorizationOptionAlert | UNAuthorizationOptionBadge | UNAuthorizationOptionSound completionHandler:^(BOOL granted, NSError * _Nullable error) {
  13. if (granted) {
  14. NSLog(@"\n \n ==== 客户允许通知. ");
  15. // 向APNs注册, 获取 deviceToken // 要求在主线程中
  16. dispatch_async(dispatch_get_main_queue(), ^{
  17. [application registerForRemoteNotifications];
  18. });
  19. } else { }
  20. }];
  21. } else if (systemVersionNum >= 8.0) { // 适配 iOS_8, iOS_10.0
  22. // iOS 8 Notifications
  23. #pragma clang diagnostic push
  24. #pragma clang diagnostic ignored"-Wdeprecated-declarations"
  25. [application registerUserNotificationSettings:
  26. [UIUserNotificationSettings settingsForTypes:
  27. (UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
  28. [application registerForRemoteNotifications];
  29. #pragma clang diagnostic pop
  30. } else {
  31. // iOS < 8 Notifications
  32. #pragma clang diagnostic push
  33. #pragma clang diagnostic ignored"-Wdeprecated-declarations"
  34. [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
  35. (UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];
  36. #pragma clang diagnostic pop
  37. }
  38. }
  39. /*
  40. * 苹果推送注册成功回调,将苹果返回的deviceToken上传到CloudPush服务器
  41. */
  42. - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
  43. [CloudPushSDK registerDevice:deviceToken withCallback:^(CloudPushCallbackResult *res) {
  44. if (res.success) {
  45. NSLog(@"Register deviceToken success.");
  46. } else {
  47. NSLog(@"Register deviceToken failed, error: %@", res.error);
  48. }
  49. }];
  50. }
  51. /*
  52. * 苹果推送注册失败回调
  53. */
  54. - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
  55. NSLog(@"didFailToRegisterForRemoteNotificationsWithError %@", error);
  56. }
  • 推送消息到来监听;
  1. /**
  2. * 注册推送消息到来监听
  3. */
  4. - (void)registerMessageReceive {
  5. [[NSNotificationCenter defaultCenter] addObserver:self
  6. selector:@selector(onMessageReceived:)
  7. name:@"CCPDidReceiveMessageNotification"
  8. object:nil];
  9. }
  10. /**
  11. * 处理到来推送消息
  12. *
  13. * @param notification
  14. */
  15. - (void)onMessageReceived:(NSNotification *)notification {
  16. CCPSysMessage *message = [notification object];
  17. NSString *title = [[NSString alloc] initWithData:message.title encoding:NSUTF8StringEncoding];
  18. NSString *body = [[NSString alloc] initWithData:message.body encoding:NSUTF8StringEncoding];
  19. NSLog(@"Receive message title: %@, content: %@.", title, body);
  20. }
  • 通知打开监听:
  1. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  2. // 点击通知将App从关闭状态启动时,将通知打开回执上报
  3. // [CloudPushSDK handleLaunching:launchOptions];(Deprecated from v1.8.1)
  4. [CloudPushSDK sendNotificationAck:launchOptions];
  5. return YES;
  6. }
  7. /*
  8. * App处于启动状态时,通知打开回调
  9. */
  10. - (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo {
  11. NSLog(@"Receive one notification.");
  12. // 取得APNS通知内容
  13. NSDictionary *aps = [userInfo valueForKey:@"aps"];
  14. // 内容
  15. NSString *content = [aps valueForKey:@"alert"];
  16. // badge数量
  17. NSInteger badge = [[aps valueForKey:@"badge"] integerValue];
  18. // 播放声音
  19. NSString *sound = [aps valueForKey:@"sound"];
  20. // 取得Extras字段内容
  21. NSString *Extras = [userInfo valueForKey:@"Extras"]; //服务端中Extras字段,key是自己定义的
  22. NSLog(@"content = [%@], badge = [%ld], sound = [%@], Extras = [%@]", content, (long)badge, sound, Extras);
  23. // iOS badge 清0
  24. application.applicationIconBadgeNumber = 0;
  25. // 通知打开回执上报
  26. // [CloudPushSDK handleReceiveRemoteNotification:userInfo];(Deprecated from v1.8.1)
  27. [CloudPushSDK sendNotificationAck:userInfo];
  28. }

如果使用推送模块,请参考移动推送常见问题