简介
本文档提供关于 SDK 接入以及开启推送服务的示例代码(SDK 版本:V1.0+ 版本)。
注意
SDK 组成
doc 文件夹:腾讯移动推送 iOS SDK 开发指南。
demo 文件夹:包含样例工程,腾讯移动推送SDK(仅包含 OC demo,Swift Demo 请前往 腾讯工蜂 进行下载)。
SDK 集成
接入前准备
2. 单击配置管理,进入管理页面。
![](https://qcloudimg.tencent-cloud.cn/image/document/43a9bb66693bd66fac7f17023510f08b.png)
![](https://qcloudimg.tencent-cloud.cn/image/document/43a9bb66693bd66fac7f17023510f08b.png)
3. 单击上传证书,完成上传操作。推送证书获取详情请参见 证书获取指引。
![](https://qcloudimg.tencent-cloud.cn/image/document/d06fd0e2349ff373fa8930b1d2f0ec2b.png)
![](https://qcloudimg.tencent-cloud.cn/image/document/d06fd0e2349ff373fa8930b1d2f0ec2b.png)
4. 证书上传成功后,在应用信息栏中,获取应用 Access ID 和 Access KEY。
导入 SDK(二选一)
方式一:Cocoapods 导入
通过 Cocoapods 下载地址:
pod 'TPNS-iOS', '~> 版本' // 如果不指定版本则默认为本地 pod TPNS-iOS 最新版本
说明
由于仓库地址变更,如果 pod 提示
Unable to find a specification for 'TPNS-iOS'
,那么需要执行以下命令,并更新仓库确认版本:pod repo updatepod search TPNS-iOSpod install //安装 SDK
方式二:手动导入
2. 打开 demo 目录下的 SDK 文件夹,将 XGPush.h 及 libXG-SDK-Cloud.a 添加到工程,打开 XGPushStatistics 文件夹,获取 XGMTACloud.framework。
3. 将 InAppMessage 文件夹导入到工程并在 Build Setting > Framework Search Paths 添加查找路径(若您 SDK 版本低于1.2.8.0,则可以忽略此步骤)。
4. 在 Build Phases 下,添加以下 Framework:
* XGInAppMessage.framework* XGMTACloud.framework* CoreTelephony.framework* SystemConfiguration.framework* UserNotifications.framework* libXG-SDK-Cloud.a* libz.tbd* CoreData.framework* CFNetwork.framework* libc++.tbd
5. 添加完成后,库的引用如下:
![](https://qcloudimg.tencent-cloud.cn/image/document/bed11d385e1e5946be16bcec52aa5d91.png)
![](https://qcloudimg.tencent-cloud.cn/image/document/bed11d385e1e5946be16bcec52aa5d91.png)
工程配置
1. 在工程配置和后台模式中打开推送,如下图所示:
![](https://qcloudimg.tencent-cloud.cn/image/document/691aea11d84706a272033532ed02750e.png)
1.1 如需使用 iOS15 新增的"时效性通知功能",请在
![](https://qcloudimg.tencent-cloud.cn/image/document/691aea11d84706a272033532ed02750e.png)
Capabilities
中开启Time Sensitive Notifications
。![](https://qcloudimg.tencent-cloud.cn/image/document/c7f218e7c78b82dd86859433e9548499.png)
2. 添加编译参数
-ObjC
。![](https://qcloudimg.tencent-cloud.cn/image/document/cad23b549e934d61535d891c696a9085.png)
如果 checkTargetOtherLinkFlagForObjc 报错,是因为 build setting 中,Other link flags 未添加 -ObjC。
注意
如果您的应用服务接入点为广州,SDK 默认实现该配置,广州域名为
tpns.tencent.com
。如果您的应用服务接入点为上海、新加坡或者中国香港,请按照下文步骤完成其他服务接入点域名配置。
2.1 解压 SDK 文件包,将 SDK 目录下的 XGPushPrivate.h 文件添加到工程中并在需要配置域名的类中引用(#import "XGPushPrivate.h")。
2.2 在
startXGWithAccessID:accessKey:delegate:
方法之前调用头文件中的配置域名
接口:如需接入上海服务接入点,则将域名设置为
tpns.sh.tencent.com
。
示例/// @note TPNS SDK1.2.7.1+[[XGPush defaultManager] configureClusterDomainName:@"tpns.sh.tencent.com"];
如需接入新加坡服务接入点,则将域名设置为
tpns.sgp.tencent.com
。
示例/// @note TPNS SDK1.2.7.1+[[XGPush defaultManager] configureClusterDomainName:@"tpns.sgp.tencent.com"];
如需接入中国香港服务接入点,则将域名设置为
tpns.hk.tencent.com
。
示例/// @note TPNS SDK1.2.7.1+[[XGPush defaultManager] configureClusterDomainName:@"tpns.hk.tencent.com"];
如需接入中国广州服务接入点,则将域名设置为
tpns.tencent.com
。
示例/// @note TPNS SDK1.2.7.1+[[XGPush defaultManager] configureClusterDomainName:@"tpns.tencent.com"];
接入样例
调用启动腾讯移动推送的 API,并根据需要实现
XGPushDelegate
协议中的方法,开启推送服务。1. 启动腾讯移动推送服务,
AppDelegate
示例如下:@interface AppDelegate () <XGPushDelegate>@end/**@param AccessID 通过 TPNS 管理台申请的 AccessID@param AccessKey 通过 TPNS 管理台申请的 AccessKey@param delegate 回调对象**/-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{[[XGPush defaultManager] startXGWithAccessID:<your AccessID> accessKey:<your AccessKey> delegate:self];return YES;}
2. 在
AppDelegate
中,选择实现 XGPushDelegate
协议中的方法:/// 统一接收消息的回调/// @param notification 消息对象(有2种类型NSDictionary和UNNotification具体解析参考示例代码)/// @note 此回调为前台收到通知消息及所有状态下收到静默消息的回调(消息点击需使用统一点击回调)/// 区分消息类型说明:xg字段里的msgtype为1则代表通知消息msgtype为2则代表静默消息- (void)xgPushDidReceiveRemoteNotification:(nonnull id)notification withCompletionHandler:(nullable void (^)(NSUInteger))completionHandler{/// code}/// 统一点击回调/// @param response 如果iOS 10+/macOS 10.14+则为UNNotificationResponse,低于目标版本则为NSDictionary- (void)xgPushDidReceiveNotificationResponse:(nonnull id)response withCompletionHandler:(nonnull void (^)(void))completionHandler {/// code}
通知服务扩展插件集成
SDK 提供了 Service Extension 接口,可供客户端调用,从而可以使用以下扩展功能:
精准统计 APNs 通道消息抵达。
接收 APNs 通道图片、音视频富媒体消息。
注意
如果未集成此接口,则无法统计 APNs 通道“抵达数”。
未集成通知服务扩展插件:
![](https://qcloudimg.tencent-cloud.cn/image/document/163c3fafdc25c0ee30d82aebf7840a36.png)
![](https://qcloudimg.tencent-cloud.cn/image/document/163c3fafdc25c0ee30d82aebf7840a36.png)
集成通知服务扩展插件后:
![](https://qcloudimg.tencent-cloud.cn/image/document/01fa4189689a5295de56e1cb2bc47c6a.png)
![](https://qcloudimg.tencent-cloud.cn/image/document/01fa4189689a5295de56e1cb2bc47c6a.png)
调试方法
开启 Debug 模式
打开 Debug 模式,即可在终端查看详细的腾讯移动推送 Debug 信息,方便定位问题。
示例代码
//打开 debug 开关[[XGPush defaultManager] setEnableDebug:YES];
实现 XGPushDelegate
协议
在调试阶段建议实现协议中的此方法,即可获取更详细的调试信息:
/**@brief 注册推送服务回调@param deviceToken APNs 生成的 Device Token@param xgToken TPNS 生成的 Token,推送消息时需要使用此值。TPNS 维护此值与 APNs 的 Device Token 的映射关系@param error 错误信息,若 error 为 nil 则注册推送服务成功@note TPNS SDK1.2.6.0+*/- (void)xgPushDidRegisteredDeviceToken:(nullable NSString *)deviceToken xgToken:(nullable NSString *)xgToken error:(nullable NSError *)error;/// 注册推送服务失败回调/// @param error 注册失败错误信息/// @note TPNS SDK1.2.7.1+- (void)xgPushDidFailToRegisterDeviceTokenWithError:(nullable NSError *)error {}
观察日志
如果 Xcode 控制台,显示如下相似日志,表明客户端已经正确集成 SDK。
[TPNS] Current device token is 9298da5605c3b242261b57****376e409f826c2caf87aa0e6112f944[TPNS] Current TPNS token is 00c30e0aeddff1270d8****dc594606dc184
注意
在推送单个目标设备时请使用 TPNS 36位的 Token。
统一接收消息及点击消息回调说明
统一接收消息回调说明:
通知消息:应用处于前台会走此回调,后台/关闭状态下无消息回调,需要点击通知走点击回调。
静默消息:应用处于前台/后台会走此回调,关闭状态下需要打开应用后才走此回调。
- (void)xgPushDidReceiveRemoteNotification:(nonnull id)notification withCompletionHandler:(nullable void (^)(NSUInteger))completionHandler;
说明
如何让通知消息在前台展示
当您前台收到通知时默认不弹横幅,通知中心不会展示的,如需展示请参考如下代码:
if ([notification isKindOfClass:[UNNotification class]]) {completionHandler(UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionSound | UNNotificationPresentationOptionAlert);}
如何区分通知消息和静默消息
当应用在前台收到通知消息以及所有状态下收到静默消息时,会触发统一接收消息回调 xgPushDidReceiveRemoteNotification。
区分前台收到通知消息和静默消息示例代码如下:
NSDictionary *tpnsInfo = notificationDic[@"xg"];NSNumber *msgType = tpnsInfo[@"msgtype"];if (msgType.integerValue == 1) {/// 前台收到通知消息} else if (msgType.integerValue == 2) {/// 收到静默消息} else if (msgType.integerValue == 9) {/// 收到本地通知(TPNS本地通知)}
统一点击消息回调说明:
应用所有状态(前台、后台、关闭)下点击通知消息时会走此回调。
/// 统一点击回调/// @param response 如果 iOS 10+/macOS 10.14+ 则为 UNNotificationResponse,低于目标版本则为 NSDictionary/// @note TPNS SDK1.2.7.1+- (void)xgPushDidReceiveNotificationResponse:(nonnull id)response withCompletionHandler:(nonnull void (^)(void))completionHandler;
注意
移动推送统一消息回调
xgPushDidReceiveRemoteNotification
会处理消息接收,并自动后续调用 application:didReceiveRemoteNotification:fetchCompletionHandler
方法。然而,该方法也可能被其他 SDK 也进行 hook 调用。如果您只集成了移动推送平台,我们不推荐再去实现系统通知回调方法,请统一在移动推送通知回调中进行处理。
如果您集成了多推送平台,并且需要在
application:didReceiveRemoteNotification:fetchCompletionHandler
方法处理其他推送平台的业务,请参照如下指引,避免业务重复:您需要区分平台消息,在两个消息回调方法中分别拿到消息字典后通过“xg”字段来区分是否是移动推送平台的消息,如果是移动推送的消息则在
xgPushDidReceiveRemoteNotification
方法进行处理,非移动推送消息请统一在 application:didReceiveRemoteNotification:fetchCompletionHandler
方法处理。xgPushDidReceiveRemoteNotification
和 application:didReceiveRemoteNotification:fetchCompletionHandler
如果都执行,总共只需要调用一次 completionHandler
。如果其他 SDK 也调用 completionHandler
,确保整体的 completionHandler
只调用一次。这样可以防止由于多次 completionHandler
而引起的 crash。高级配置(可选)
获取移动推送 Token 交互建议
建议您完成 SDK 集成后,在 App 的关于、意见反馈等比较不常用的 UI 中,通过手势或者其他方式显示移动推送Token,控制台和 Restful API 推送需要根据移动推送Token 进行 Token 推送,后续问题排查也需要根据移动推送Token 进行定位。
示例代码
//获取 TPNS 生成的 Token[[XGPushTokenManager defaultTokenManager] xgTokenString];
![](https://qcloudimg.tencent-cloud.cn/image/document/f47ca2897bc888371549e576fddd2373.png)
![](https://qcloudimg.tencent-cloud.cn/image/document/f47ca2897bc888371549e576fddd2373.png)
获取 "移动推送运行日志" 交互建议
建议您完成 SDK 集成后,在 App 的关于、意见反馈等比较不常用的 UI 中,通过手势或者其他方式显示"移动推送运行日志",方便后续问题排查。
效果如下图所示:
![](https://qcloudimg.tencent-cloud.cn/image/document/05305a48ab0c65ad8bf49a9b0791b521.png)
![](https://qcloudimg.tencent-cloud.cn/image/document/e65bee2259cd69d8f542f100d4879e41.png)
![](https://qcloudimg.tencent-cloud.cn/image/document/05305a48ab0c65ad8bf49a9b0791b521.png)
![](https://qcloudimg.tencent-cloud.cn/image/document/e65bee2259cd69d8f542f100d4879e41.png)
示例代码
[[XGPush defaultManager] uploadLogCompletionHandler:^(BOOL result, NSString * _Nullable errorMessage) {NSString *title = result ? NSLocalizedString(@"report_log_info", nil) : NSLocalizedString(@"failed", nil);if (result && errorMessage.length>0) {UIPasteboard *pasteboard = [UIPasteboardgeneralPasteboard];pasteboard.string = errorMessage;}[TPNSCommonMethodshowAlert:title message:errorMessage viewController:selfcompletion:nil];}];
隐私协议声明建议
您可在申请 App 权限使用时,使用以下内容声明授权的用途:
我们使用 腾讯云移动推送 TPNS 用于实现产品信息的推送,在您授权我们“访问网络连接”和“访问网络状态”权限后,表示您同意 腾讯 SDK 隐私协议。您可以通过关闭终端设备中的通知选项来拒绝接受此 SDK 推送服务。
其中上述声明授权的两个链接如下:
腾讯云移动推送 :
https://cloud.tencent.com/product/tpns
腾讯 SDK 隐私协议:
https://cloud.tencent.com/document/product/548/50955