iOS

最近更新时间:2026-04-24 17:24:33

我的收藏

快速接入

步骤1:集成 TIMPush

1. TIMPush 组件支持 CocoaPods 集成,您需要在 Podfile 中添加组件依赖。
target 'YourAppName' do
# Uncomment the next line if you're using Swift or would like to use dynamic frameworks
use_frameworks!
use_modular_headers!
# Pods for Example
pod 'TXIMSDK_Plus_iOS_XCFramework'
# 版本号 “VERSION” 请前往 更新日志 中获取配置。
pod 'TIMPush', 'VERSION'
end
2. 执行以下命令,安装 TIMPush 组件。
pod install # 如果无法安装 TUIKit 最新版本,执行以下命令更新本地的 CocoaPods 仓库列表。 pod repo update

步骤2:配置推送参数

1. 当您上传证书到 IM 控制台后,IM 控制台会为您分配一个证书 ID,见下图:

2. 您需要在 AppDelegate 中,实现 - businessID 协议方法返回证书 ID 即可。
Objective-C
Swift
#pragma mark - TIMPush
- (int)businessID {
//上一步控制台给的证书ID,如 1234567
int kBusinessID = 1234567;
return kBusinessID;
}

- (NSString *)applicationGroupID {
//在 Xcode 中配置的 AppGroupID,详见 “步骤4:消息触达统计配置” 中使用指引
return kTIMPushAppGroupKey;
}
#pragma mark - TIMPush
//Swift 务必携带 @objc 关键字
@objc func businessID() -> Int32 {
//上一步控制台给的证书ID
return 0
}
@objc func applicationGroupID() -> String {
//在 Xcode 中配置的 AppGroupID
return "group.com.yourcompony.pushkey"
}

步骤3:注册推送

调用接口推送注册成功后,就可以收到离线推送通知了。
说明:
注册接口必填参数 SDKAppID 和客户端密钥 AppKey 的获取路径是 IM 控制台 > 推送服务 Push > 概览,如下图所示:

Objective-C
Swift
const int sdkAppId = 您的 sdkAppId;
static const NSString *appKey = @"客户端密钥";

[TIMPushManager registerPush:sdkAppId appKey:appKey succ:^(NSData * _Nonnull deviceToken) {

} fail:^(int code, NSString * _Nonnull desc) {

}];
let sdkAppId: Int = 0
let appKey: String = "客户端密钥"

TIMPushManager.registerPush(Int32(sdkAppId), appKey: appKey, succ: { deviceToken in
// 成功回调处理
}, fail: { code, desc in
// 失败回调处理
})

步骤4:消息触达统计配置

1. 如果您需要统计推送的触达和点击数据,您需要在 AppDelegate.m 文件中实现 - applicationGroupID 方法,返回 App Group ID (生成方式可参见 厂商配置 > 生成 App GroupID)。
2. 在 Notification Service Extension 的 -didReceiveNotificationRequest:withContentHandler: 方法中调用推送触达率统计函数:
Objective-C
Swift
@implementation NotificationService
- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
//appGroup 标识当前主 APP 和 Extension 之间共享的 APP Group,需要在主 APP 的 Capability 中配置 App Groups 能力。
//格式为 group + [主bundleID]+ key
//如 group.com.tencent.im.pushkey
NSString * appGroupID = kTIMPushAppGroupKey;
__weak typeof(self) weakSelf = self;
[TIMPushManager handleNotificationServiceRequest:request appGroupID:appGroupID callback:^(UNNotificationContent *content) {
weakSelf.bestAttemptContent = [content mutableCopy];
// Modify the notification content here...
// self.bestAttemptContent.title = [NSString stringWithFormat:@"%@ [modified]", self.bestAttemptContent.title];
weakSelf.contentHandler(weakSelf.bestAttemptContent);
}];
}
@end
override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
self.contentHandler = contentHandler
bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
//appGroup 标识当前主 APP 和 Extension 之间共享的 APP Group,需要在主 APP 的 Capability 中配置 App Groups 能力。
//推荐格式为 group + [主bundleID]
//如 group.com.主bundleID.pushkey
TIMPushManager.handleNotificationServiceRequest(request: request, appGroupID: "appGroupID") {
[weak self] content in
if let bestAttemptContent = self?.bestAttemptContent {
// Modify the notification content here...
bestAttemptContent.title = "\\(bestAttemptContent.title) [modified]"
contentHandler(bestAttemptContent)
}
}
}
注意:
1. 上报推送触达数据,需要开启 mutable-content 开关来支持 iOS 10 的 Extension 功能。

2. 数据详情可在推送数据页面查看,推送数据页面仅限 购买推送插件 后使用。

步骤5:接入成功验证

运行 App,过滤 “TIMPush” 关键字,查看相关日志:

若出现类似上图日志,则表明 Push 已成功集成,可以继续下一步测试。
若未看到以上注册成功提示,请查看注册接口返回的错误码,根据 错误码对照表 排查。

测试和使用

步骤1:发送推送消息

REST API
SDK API
您可以在 控制台 > 接入测试 指定 RegistrationID/userID 进行离线推送测试,REST API 接口详细说明可参见:REST API 接口 > 发起全员/标签推送
调用 sendMessage 发送消息时,您可以通过 V2TIMOfflinePushInfo 设置离线推送参数。调用 V2TIMOfflinePushInfo 的 ext 设置自定义 ext 数据,当用户收到离线推送启动 App 的时候,可以在单击通知跳转的回调中获取到 ext 字段,然后根据 ext 字段内容跳转到指定的 UI 界面。可以参见 TUIMessageBaseDataProvider 的 sendMessage: 方法:
Objective-C
Swift
#import <TUICore/OfflinePushExtInfo.h>

V2TIMOfflinePushInfo *pushInfo = [[V2TIMOfflinePushInfo alloc] init];
pushInfo.title = @"推送标题";
pushInfo.desc = @"推送内容";
BOOL isGroup = groupID.length > 0;
NSString *senderId = isGroup ? (groupID) : ([TUILogin getUserID]);
NSString *nickName = isGroup ? (conversationData.title) : ([TUILogin getNickName] ?: [TUILogin getUserID]);

OfflinePushExtInfo *extInfo = [[OfflinePushExtInfo alloc] init];
OfflinePushExtBusinessInfo * entity = extInfo.entity;
entity.action = 1;
entity.content = @"推送内容";
entity.sender = senderId;
entity.nickname = nickName;
entity.faceUrl = [TUILogin getFaceUrl] ?: @"";
entity.chatType = [isGroup ? @(V2TIM_GROUP) : @(V2TIM_C2C) integerValue];
entity.version = kOfflinePushVersion;
pushInfo.ext = [extInfo toReportExtString];
//以下是兼容安卓的字段,需要填写
pushInfo.AndroidOPPOChannelID = @"tuikit";
pushInfo.AndroidSound = TUIConfig.defaultConfig.enableCustomRing ? @"private_ring" : nil;
pushInfo.AndroidHuaWeiCategory = @"IM";
pushInfo.AndroidVIVOCategory = @"IM";
import TIMPush
import TUICore
import ImSDK_Plus

let pushInfo = V2TIMOfflinePushInfo()
pushInfo.title = "推送标题"
pushInfo.desc = "推送内容"

let isGroup = groupID!.count > 0
let senderId = isGroup ? groupID : TUILogin.getUserID()
let nickName = isGroup ? "conversationData Title" : (TUILogin.getNickName() ?? TUILogin.getUserID())

let extInfo = OfflinePushExtInfo()
let entity = extInfo.entity
entity.action = 1
entity.content = "推送内容"
entity.sender = senderId ?? ""
entity.nickname = nickName ?? ""
entity.faceUrl = TUILogin.getFaceUrl() ?? ""
entity.chatType = isGroup ? Int(V2TIMConversationType.GROUP.rawValue) : Int(V2TIMConversationType.C2C.rawValue)
entity.version = 1
pushInfo.ext = extInfo.toReportExtString()

// 以下是兼容安卓的字段,需要填写
pushInfo.androidOPPOChannelID = "tuikit"
pushInfo.androidSound = TUIConfig.default().enableCustomRing ? "private_ring" : nil
pushInfo.androidHuaWeiCategory = "IM"
pushInfo.androidVIVOCategory = "IM"

步骤2:单击离线推送后自定义跳转

如果您需要自定义解析收到的远程推送,您可按照如下方法实现:
自定义点击跳转实现(推荐)
自定义点击跳转实现(旧方案)
注意:
注册回调时机必须放在应用 AppDelegate 的 didFinishLaunchingWithOptions 函数中,确保注册时序可靠。
Objective-C
Swift
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[TIMPushManager addPushListener:self];
return YES;
}
#pragma mark - TIMPushListener
- (void)onNotificationClicked:(NSString *)ext {
// 获取 ext 自定义跳转
}
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
TIMPushManager.addPushListener(listener: self)
return true
}

@objc func onNotificationClicked(_ ext: String) {
//Clicked
}
@objc func onRecvPushMessage(_ message: TIMPushMessage) {
//onRecvPushMessage
}
@objc func onRevokePushMessage(_ messageID: String) {
//onRevokePushMessage
}
您需要在 AppDelegate.m 文件中实现 - onRemoteNotificationReceived 方法。
Objective-C
Swift
#pragma mark - TIMPush
- (BOOL)onRemoteNotificationReceived:(NSString *)notice {
//- 如果返回 YES, TIMPush 将不在执行内置的 TUIKit 离线推送解析逻辑,完全交由您自行处理;
//NSString *ext = notice;
//OfflinePushExtInfo *info = [OfflinePushExtInfo createWithExtString:ext];
//return YES;
//- 如果返回 NO,TIMPush 将继续执行内置的 TUIKit 离线推送解析逻辑,继续回调 - navigateToBuiltInChatViewController:groupID: 方法。
return NO;
}
@objc func onRemoteNotificationReceived(_ notice: String) -> Bool {
// - 如果返回 true, TIMPush 将不在执行内置的 TUIKit 离线推送解析逻辑,完全交由您自行处理;
// let ext = notice
// let info = OfflinePushExtInfo.create(withExtString: ext)
// return true
// - 如果返回 false,TIMPush 将继续执行内置的 TUIKit 离线推送解析逻辑,继续回调 - navigateToBuiltInChatViewController:groupID: 方法。
return false
}
恭喜您已经完成了推送插件的接入,需要提醒您:消息推送插件试用或购买到期后,将自动停止提供推送服务(包括普通消息离线推送、全员推送等服务)。为避免影响您业务正常使用,请提前购买/续费
说明:
接入完成收不到推送,请先自助使用 排查工具 查看下具体原因。
推送指标数据查看,请使用 数据统计 查询。
全员/标签推送功能请参见:REST API 接口 - 发起全员/标签推送