全部产品

接入 iOS

更新时间:2020-07-27 17:04:25

重要:自 2020 年 6 月 28 日起,mPaaS 停止维护 10.1.32 基线。请使用 10.1.6810.1.60 系列基线。可以参考 mPaaS 10.1.68 升级指南mPaaS 10.1.60 升级指南 进行基线版本升级。

本文将向您详细介绍将消息推送服务接入 iOS 客户端的接入流程。为了使用消息推送服务,您需要完成以下流程:

选择接入方式并接入

消息推送服务支持以下三种接入方式,您可以根据实际情况进行选择。关于接入方式的更多信息,请参见 接入方式简介。在确定接入方式后,请您参考各接入方式的接入文档,添加消息推送 SDK 完成接入。

配置工程

需要在工程 target 设置中开启以下两处:

  • Capabilities > Push Notifications
    push-ca
  • Capabilities > Background Modes > Remote notifications
    push-back`

使用 SDK

基于原生框架

注册 deviceToken(非必须)

PushSDK 在应用启动完成时,会自动请求注册 deviceToken,一般情况下您无需请求注册 deviceToken 。但是当特殊情况下(比如启动时有隐私管控,阻止一切网络请求时)您需要在管控授权后,再次触发注册 deviceToken,示例代码如下:

  1. - (void)registerRemoteNotification
  2. {
  3. // 注册推送
  4. if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 10.0) {// 10.0+
  5. UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter];
  6. center.delegate = self;
  7. [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
  8. [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert|UNAuthorizationOptionSound|UNAuthorizationOptionBadge)
  9. completionHandler:^(BOOL granted, NSError * _Nullable error) {
  10. // Enable or disable features based on authorization.
  11. if (granted) {
  12. dispatch_async(dispatch_get_main_queue(), ^{
  13. [[UIApplication sharedApplication] registerForRemoteNotifications];
  14. });
  15. }
  16. }];
  17. }];
  18. } else {// 8.0,9.0
  19. UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge |UIUserNotificationTypeSound|UIUserNotificationTypeAlert) categories:nil];
  20. [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
  21. [[UIApplication sharedApplication] registerForRemoteNotifications];
  22. }
  23. }

获取 deviceToken 并绑定 userId

mPaaS 提供的 Push SDK 中封装了向 APNs 服务器注册的逻辑,在程序启动后,Push SDK 自动向 APNs 服务器注册。您可在注册成功的回调方法中获取 APNs 下发的 DeviceToken,然后调用 PushService 的接口方法,上报绑定 userId 至移动推送核心。

  1. // import <PushService/PushService.h>
  2. - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
  3. {
  4. [[PushService sharedService] setDeviceToken:deviceToken];
  5. [[PushService sharedService] pushBindWithUserId:@"your userid(需替换)" completion:^(NSException *error) {
  6. }];
  7. }
说明:Push SDK 同时提供了解绑的接口 - (void)pushUnBindWithUserId:(NSString *)userId completion:(void (^)(NSException *error))completion;,用于解除设备的 deviceToken 与当前应用的 userId 的绑定。如在用户切换账号后,可以调用解绑接口。

接收推送消息

客户端收到 push 消息后,如果用户点击查看,系统将启动相应应用。可在 AppDelegate 的回调方法中完成收到 push 消息后的逻辑处理。

  • 在 iOS 10 以下系统中,通知栏消息或静默消息的处理方法如下:

    1. // iOS 10 以下Push冷启动处理
    2. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    3. NSDictionary *userInfo = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey];
    4. if ([[[UIDevice currentDevice] systemVersion] doubleValue] < 10.0) {
    5. // iOS 10 以下Push冷启动处理
    6. }
    7. return YES;
    8. }
    9. // App 在前台时,普通推送的处理方法;App 在前台或后台时,静默推送的处理方法;iOS 10 以下系统,通知栏消息处理方法
    10. - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler
    11. {
    12. //处理接受到的消息
    13. }
  • 在 iOS 10 及以上系统中,您需要实现以下代理方法来监听通知栏消息:
  1. // 注册 UNUserNotificationCenter delegate
  2. if ([[[UIDevice currentDevice] systemVersion] doubleValue] >= 10.0) {
  3. UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter];
  4. center.delegate = self;
  5. }
  6. //应用处于前台时的远程推送接受
  7. - (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler
  8. {
  9. NSDictionary *userInfo = notification.request.content.userInfo;
  10. if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
  11. //应用处于前台时的远程推送接受
  12. } else {
  13. //应用处于前台时的本地推送接受
  14. }
  15. completionHandler(UNNotificationPresentationOptionNone);
  16. }
  17. //应用处于后台或者活冷启动时远程推送接受
  18. - (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)(void))completionHandler
  19. {
  20. NSDictionary *userInfo = response.notification.request.content.userInfo;
  21. if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
  22. //应用处于后台或者活冷启动时远程推送接受
  23. } else {
  24. //应用处于前台时的本地推送接受
  25. }
  26. completionHandler();
  27. }

基于 mPaaS 框架

注册 deviceToken(非必须)

PushSDK 在应用启动完成时,会自动请求注册 deviceToken,一般情况下您无需请求注册 deviceToken 。但是当特殊情况下(比如启动时有隐私管控,阻止一切网络请求时)您需要在管控授权后,再次触发注册 deviceToken,示例代码如下:

  1. - (void)registerRemoteNotification
  2. {
  3. // 注册推送
  4. if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 10.0) {// 10.0+
  5. UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter];
  6. center.delegate = self;
  7. [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
  8. [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert|UNAuthorizationOptionSound|UNAuthorizationOptionBadge)
  9. completionHandler:^(BOOL granted, NSError * _Nullable error) {
  10. // Enable or disable features based on authorization.
  11. if (granted) {
  12. dispatch_async(dispatch_get_main_queue(), ^{
  13. [[UIApplication sharedApplication] registerForRemoteNotifications];
  14. });
  15. }
  16. }];
  17. }];
  18. } else {// 8.0,9.0
  19. UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge |UIUserNotificationTypeSound|UIUserNotificationTypeAlert) categories:nil];
  20. [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
  21. [[UIApplication sharedApplication] registerForRemoteNotifications];
  22. }
  23. }

获取 deviceToken 并绑定 userId

与基于 iOS 原生框架相比,基于 mPaaS 框架的应用的生命周期被 mPaaS 框架接管,应用获取 deviceToken 的回调方法有所不同,代码示例如下:

  1. // import <PushService/PushService.h>
  2. // 在 DTFrameworkInterface 分类中重写如下方法
  3. - (DTFrameworkCallbackResult)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
  4. {
  5. [[PushService sharedService] setDeviceToken:deviceToken];
  6. [[PushService sharedService] pushBindWithUserId:@"your userid(需替换)" completion:^(NSException *error) {
  7. }];
  8. return DTFrameworkCallbackResultContinue;
  9. }
说明:Push SDK 同时提供了解绑的接口 - (void)pushUnBindWithUserId:(NSString *)userId completion:(void (^)(NSException *error))completion;,用于解除设备的 deviceToken 与当前应用的 userId 的绑定。如在用户切换账号后,可以调用解绑接口。

接收推送消息

基于 mPaaS iOS 框架的应用,由于其生命周期被 mPaaS 框架接管,与基于 iOS 原生框架相比,收到消息的回调方法不同,代码示例如下:

  1. // import <PushService/PushService.h>
  2. // 在 DTFrameworkInterface 分类中重写如下方法
  3. - (DTFrameworkCallbackResult)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
  4. {
  5. // userInfo 为推送消息内容,业务解析处理
  6. return DTFrameworkCallbackResultContinue;
  7. }

配置推送证书

要使用 mPaaS 消息推送控制台推送消息,您需要在控制台中配置 APNs 推送证书。该证书必须是与客户端签名对应的推送证书,否则客户端会收不到推送消息。

有关详细的配置说明,查看 iOS 推送证书配置

代码示例

点击此处 下载示例代码包。

后续操作

  • 在 mPaaS 消息推送控制台配置完 APNs 证书后,可以按 设备 维度向应用推送消息。消息推送服务使用苹果的 APNs 服务向客户端推送消息,更多信息请参见 苹果及国外安卓设备的推送流程
  • 上报用户 ID 并由服务端绑定用户和设备后,可以按 用户 维度向应用推送消息。

支持的推送类型如下:

  • 极简推送
  • 模板推送
  • 批量推送
  • 群发推送

关于推送类型的定义,查看 创建消息

相关链接