接入 iOS

本文将向您详细介绍将消息推送服务接入 iOS 客户端的接入流程。

操作步骤

要使用消息推送服务,您需要完成以下接入步骤:

  1. 选择接入方式并接入。

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

  2. 配置工程。需要在工程的 TARGETS 设置中开启以下两项配置:

    • Capabilities > Push Notificationspush-ca

    • Capabilities > Background Modes > Remote notificationspush-back

  3. 使用 SDK。下面对不同接入方式的 SDK 使用进行说明。

    • 基于 mPaaS 框架接入

      1. 注册 deviceToken(非必需)。

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

        - (void)registerRemoteNotification
        {
            // 注册推送
            if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 10.0) {// 10.0+
                UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter];
                center.delegate = self;
                [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
        
                        [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert|UNAuthorizationOptionSound|UNAuthorizationOptionBadge)
                                              completionHandler:^(BOOL granted, NSError * _Nullable error) {
                            // Enable or disable features based on authorization.
                            if (granted) {
                                dispatch_async(dispatch_get_main_queue(), ^{
                                    [[UIApplication sharedApplication] registerForRemoteNotifications];
                                });
                            }
                        }];
        
                }];
            } else {// 8.0,9.0
                UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge                                                                                         |UIUserNotificationTypeSound|UIUserNotificationTypeAlert) categories:nil];
                [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
                [[UIApplication sharedApplication] registerForRemoteNotifications];
            }
        }
      2. 获取 deviceToken 并绑定 userId。

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

        // import <PushService/PushService.h>
        // 在 DTFrameworkInterface 分类中重写如下方法
        - (DTFrameworkCallbackResult)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
        {
            [[PushService sharedService] setDeviceToken:deviceToken];
            [[PushService sharedService] pushBindWithUserId:@"your userid(需替换)" completion:^(NSException *error) {
            }];
        
            return DTFrameworkCallbackResultContinue;
        }
        说明

        消息推送 SDK 同时提供了解绑的接口 - (void)pushUnBindWithUserId:(NSString *)userId completion:(void (^)(NSException *error))completion;,用于解除设备的 deviceToken 与当前应用的 userId 的绑定。如在用户切换账号后,可以调用解绑接口。

      3. 绑定用户手机号。

        注意

        目前,仅杭州非金融区提供短信补充服务。

        将 deviceToken 和用户的手机号码绑定。绑定手机号码后,用户就可以通过该手机号码收到相关推送短信。

        // 若在绑定接口上传手机号码,则可以使用短信补充服务
        - (void)pushBindWithUserId:(NSString *)userId phoneNumber:(NSString *)phoneNumber completion:(void (^)(NSException *error))completion;
      4. 接收推送的消息。

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

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

        为了统计消息在客户端的打开率,您需要在 App 消息被用户打开时,调用 PushServicepushOpenLogReport 接口(10.1.32 及以上版本可用)上报消息打开事件。该事件上报后,您可以在 mPaaS 控制台中的 消息推送 > 概览 页面中查看消息打开率的统计数据。

        /**
         * 打开推送消息的上报接口,用于统计推送消息的打开率
         * @param  userInfo 消息的 userInfo
         * @return
         */
        - (void)pushOpenLogReport:(NSDictionary *)userInfo;
    • 基于已有工程接入

      在基于已有工程且使用 mPaaS 插件或 CocoaPods 接入 iOS 客户端的情况下,您需要完成以下操作。

      1. 注册 deviceToken(非必需)

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

        - (void)registerRemoteNotification
        {
            // 注册推送
            if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 10.0) {// 10.0+
                UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter];
                center.delegate = self;
                [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
        
                        [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert|UNAuthorizationOptionSound|UNAuthorizationOptionBadge)
                                              completionHandler:^(BOOL granted, NSError * _Nullable error) {
                            // Enable or disable features based on authorization.
                            if (granted) {
                                dispatch_async(dispatch_get_main_queue(), ^{
                                    [[UIApplication sharedApplication] registerForRemoteNotifications];
                                });
                            }
                        }];
        
                }];
            } else {// 8.0,9.0
                UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge                                                                                         |UIUserNotificationTypeSound|UIUserNotificationTypeAlert) categories:nil];
                [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
                [[UIApplication sharedApplication] registerForRemoteNotifications];
            }
        }
      2. 获取 deviceToken 并绑定 userId。

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

        // import <PushService/PushService.h>
        - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
        {
            [[PushService sharedService] setDeviceToken:deviceToken];
            [[PushService sharedService] pushBindWithUserId:@"your userid(需替换)" completion:^(NSException *error) {
            }];
        
        }

        消息推送 SDK 同时提供了解绑的接口 - (void)pushUnBindWithUserId:(NSString *)userId completion:(void (^)(NSException *error))completion;,用于解除设备的 deviceToken 与当前应用的 userId 的绑定。如在用户切换账号后,可以调用解绑接口。

      3. 绑定用户手机号。

        注意

        目前,仅杭州非金融区提供短信补充服务。

        将 deviceToken 和用户的手机号码绑定。绑定手机号码后,用户就可以通过该手机号码收到相关推送短信。

        // 若在绑定接口上传手机号码,则可以使用短信补充服务
        - (void)pushBindWithUserId:(NSString *)userId phoneNumber:(NSString *)phoneNumber completion:(void (^)
      4. 接收推送的消息。

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

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

            // iOS 10 以下 Push 冷启动处理
            - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
            NSDictionary *userInfo = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey];
            if ([[[UIDevice currentDevice] systemVersion] doubleValue] < 10.0) {
                // iOS 10 以下 Push 冷启动处理
            }
          
            return YES;
          }
          
            // App 在前台时,普通推送的处理方法;App 在前台或后台时,静默推送的处理方法;iOS 10 以下系统,通知栏消息处理方法
            - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler
            {
                //处理接受到的消息
            }
        • 在 iOS 10 及以上系统中,您需要实现以下代理方法来监听通知栏消息:

            // 注册 UNUserNotificationCenter delegate 
            if ([[[UIDevice currentDevice] systemVersion] doubleValue] >= 10.0) {
                    UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter];
                    center.delegate = self;
              }
          
             //应用处于前台时的远程推送接收
            - (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler
            {
                NSDictionary *userInfo = notification.request.content.userInfo;
          
                if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
                    //应用处于前台时的远程推送接收
          
                } else {
                    //应用处于前台时的本地推送接收
          
                }
                completionHandler(UNNotificationPresentationOptionNone);
            }
          
            //应用处于后台或者活冷启动时远程推送接收
            - (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)(void))completionHandler
            {
                NSDictionary *userInfo = response.notification.request.content.userInfo;
          
                if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
                    //应用处于后台或者活冷启动时远程推送接收
          
                } else {
                    //应用处于前台时的本地推送接收
          
                }
                completionHandler();
          
            }
      5. 统计消息的打开率。

        基于已有工程统计消息打开率的操作方法和基于 mPaaS 框架完全相同。

  4. 配置推送证书。

    要使用 mPaaS 消息推送控制台推送消息,您需要在控制台中配置 APNs 推送证书。该证书必须是与客户端签名对应的推送证书,否则客户端会收不到推送消息。有关详细的配置说明,查看 配置 iOS 推送通道

后续操作

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

  • 上报用户 ID 并由服务端绑定用户和设备后,可以按用户维度向应用推送消息。

代码示例

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

相关链接

阿里云首页 移动开发平台 mPaaS 相关技术圈