iOS 推送指南
本文介绍了如何在 iOS 设备中使用推送通知功能。建议先阅读推送通知总览了解相关概念。
配置 APNs 推送证书
配置 APNs 证书是使用推送服务的前提,详情请参考iOS 推送设置指南。
iOS 流程简介
首先,注册 APNs 申请 Token,并将其保存到云端:
然后,调用推送通知提供的接口发送推送消息:
Installation
Installation 是 LCObject 的子类,使用 Installation 对象来保存推送所需的 token 以及其他数据。
SDK 提供默认的 Installation 对象,并会在默认对象保存成功后持久缓存其数据。一般情况下,使用默认对象保存 device token。默认对象的获取方式如下:
- Objective-C
LCInstallation *installation = [LCInstallation defaultInstallation];
除了默认的 Installation 对象,你也可以构造新的 Installation 对象,用来存储其他特殊类型的 token(诸如 VoIP 等),构造方式如下:
- Objective-C
LCInstallation *installation = [[LCInstallation alloc] init];
SDK 即时通讯模块会使用默认 Installation 对象的 device token。如需使用即时通讯的离线推送功能,请确保默认 Installation 对象成功保存了 device token。
Installation 对象的默认字段如下所示:
| 字段 | 类型 | 说明 |
|---|---|---|
| deviceToken | String | 推送所需的 Token |
| apnsTeamId | String | 推送所需的 Team ID |
| badge | Number | 对应应用通知的标记,主要用于通知标记清零 |
| channels | Array | 订阅频道数组 |
| deviceProfile | String | 自定义证书名称,主要用于多证书推送 |
| deviceType | String | 设备类型,SDK 会自动设置该属性,一般情况下不要随意更改 |
| apnsTopic | String | 应用的 Bundle Identifier,SDK 会自动设置该属性,一般情况下不要随意更改 |
| timeZone | String | 设备所处时区,SDK 会自动设置该属性,一般情况下不要随意更改 |
注册 APNs 获取 Token
在保存 Installation 前,要先注册 APNs 来获取推送所需的 token,以 User Notification 为例,具体步骤如下:
- Objective-C
#import <LeanCloudObjc/Foundation.h>
#import <UserNotifications/UserNotifications.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 首先需要初始化应用
[LCApplication setApplicationId:{{appid}}
clientKey:{{appkey}}
serverURLString:"https://please-replace-with-your-customized.domain.com"];
[[UNUserNotificationCenter currentNotificationCenter] getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
switch ([settings authorizationStatus]) {
case UNAuthorizationStatusAuthorized:
dispatch_async(dispatch_get_main_queue(), ^{
[[UIApplication sharedApplication] registerForRemoteNotifications];
});
break;
case UNAuthorizationStatusNotDetermined:
[[UNUserNotificationCenter currentNotificationCenter] requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert) completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (granted) {
dispatch_async(dispatch_get_main_queue(), ^{
[[UIApplication sharedApplication] registerForRemoteNotifications];
});
}
}];
break;
default:
break;
}
}];
return YES;
}
保存 Token
注册 APNs 成功后,系统会通过 didRegisterForRemoteNotificationsWithDeviceToken 函数返回 deviceToken。一般情况,在该函数里保存 deviceToken 和 apnsTeamId 即可。保存方式如下:
- Objective-C
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
[[LCInstallation defaultInstallation] setDeviceTokenFromData:deviceToken
teamId:@"YOUR_APNS_TEAM_ID"];
[[LCInstallation defaultInstallation] saveInBackgroundWithBlock:^(BOOL succeeded, NSError * _Nullable error) {
if (succeeded) {
// save succeeded
} else if (error) {
NSLog(@"%@", error);
}
}];
}
iOS 系统重装、从备份恢复应用、在新设备上安装应用都会导致 device token 变化,因此 Apple 推荐在应用每次启动时都去请求 APNs 的 device token,获取 token 后进行设置并保存 token。
除此以外,云服务后端会统计 Installation 的更新时 间(updatedAt),据此清理长期未更新的 Installation 数据。
所以我们建议开发者遵循 Apple 的推荐方式开发应用,以免有效 Installation 数据被意外清理,以及因为 device token 过期无效而推送失败。
多证书场景
对于一些应用,他们在发布和上架时分为不同的版本(司机版、乘客版),但数据和消息是互通的,这种场景下我们允许应用上传多个自定义证书并对不同的设备设置 deviceProfile,从而可以用合适的证书给不同版本的应用推送。
当你上传自定义证书时会被要求输入「证书类型」,即 deviceProfile 的名字。当 Installation 上保存了 deviceProfile 时,我们将忽略原先的开发和生产证书设置,而直接按照 deviceProfile 推送。
特殊推送类型
对于诸如 VoIP 这类的特殊推送,由于其使用的 apnsTopic 并不是应用的 Bundle Identifier,所以在保存 token 前,需要修改 apnsTopic 为其指定的值。
发送推送消息
可以通过 REST API 或云服务控制台发送 iOS 推送消息。
推送环境
iOS 应用的推送环境有