快速接入
步骤1:集成 TIMPush 组件
1. TIMPush 组件支持 cocoapods 集成,您需要在 Podfile 中添加组件依赖。
target 'YourAppName' do# Uncommment the next line if you're using Swift or would like to use dynamic frameworksuse_frameworks!use_modular_headers!# Pods for Examplepod 'TIMPush', 'VERSION'end
2. 执行以下命令,安装 TIMPush 组件。
pod install # 如果无法安装 TUIKit 最新版本,执行以下命令更新本地的 CocoaPods 仓库列表。 pod repo update
步骤2:配置推送参数
1. 当您上传证书到 Chat 控制台后,Chat 控制台会为您分配一个证书 ID,见下图:

2. 您需要在 AppDelegate 中,实现
- businessID
协议方法返回证书 ID 即可。#pragma mark - TIMPush- (int)businessID {//上一步控制台给的证书ID,如 1234567int kBusinessID = 0;return kBusinessID;}- (NSString *)applicationGroupID {//AppGroup IDreturn kTIMPushAppGroupKey;}- (BOOL)onRemoteNotificationReceived:(NSString *)notice {// custom navigatereturn NO;}
#pragma mark - TIMPush//Swift 务必携带 @objc 关键字@objc func businessID() -> Int32 {//上一步控制台给的证书IDreturn 0}@objc func applicationGroupID() -> String {//AppGroup IDreturn "group.com.yourcompony.pushkey"}@objc func onRemoteNotificationReceived(_ notice: String?) -> Bool {// custom navigatereturn false}
至此,您已经完成了基本推送功能的接入。
注意:
1. 当您登录后,在控制台上看到 APNs configuration success 日志打印时,即表示已成功接入。
2. 如果您的 App 已经获取到了推送权限,此时退入后台或者停止进程,即可收到远程推送通知。
3. 如果您未接入 TUICore 组件,不需要使用 TUILogin 的登录/登出,但依然想实现离线推送,您只需:
在您的 App/IM 登录完成后,主动调用 registerPush 方法注册推送。
退出登录时,主动调用 unRegisterPush 方法 反注册推送。
4. 如果您仅想支持免登录推送的功能,可以切换注册接口为:调用 TIMPushManager 的接口 registerPush,步骤 3 的发送消息详见 - restApi 接口。
步骤3:发消息时设置离线推送参数(含 UI 集成时 TUIChat 已默认添加,可跳过此步骤)
调用 sendMessage 发送消息时,您可以通过 V2TIMOfflinePushInfo 设置离线推送参数。调用 V2TIMOfflinePushInfo 的ext 设置自定义 ext 数据,当用户收到离线推送启动 App 的时候,可以在单击通知跳转的回调中获取到 ext 字段,然后根据 ext 字段内容跳转到指定的 UI 界面。可以参见 TUIMessageBaseDataProvider 的 sendMessage: 方法:
#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 TIMPushimport TUICoreimport ImSDK_Pluslet pushInfo = V2TIMOfflinePushInfo()pushInfo.title = "推送标题"pushInfo.desc = "推送内容"let isGroup = groupID!.count > 0let senderId = isGroup ? groupID : TUILogin.getUserID()let nickName = isGroup ? "conversationData Title" : (TUILogin.getNickName() ?? TUILogin.getUserID())let extInfo = OfflinePushExtInfo()let entity = extInfo.entityentity.action = 1entity.content = "推送内容"entity.sender = senderId ?? ""entity.nickname = nickName ?? ""entity.faceUrl = TUILogin.getFaceUrl() ?? ""entity.chatType = isGroup ? Int(V2TIMConversationType.GROUP.rawValue) : Int(V2TIMConversationType.C2C.rawValue)entity.version = 1pushInfo.ext = extInfo.toReportExtString()// 以下是兼容安卓的字段,需要填写pushInfo.androidOPPOChannelID = "tuikit"pushInfo.androidSound = TUIConfig.default().enableCustomRing ? "private_ring" : nilpushInfo.androidHuaWeiCategory = "IM"pushInfo.androidVIVOCategory = "IM"
步骤4: 点击离线推送后自定义跳转
如果您需要自定义解析收到的远程推送,您可按照如下方法实现:
注意:
注册回调时机建议放在应用 AppDelegate 的 didFinishLaunchingWithOptions 函数中。
- (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}
1. 如果您需要自定义解析收到的远程推送,您需要在 AppDelegate.m 文件中遵守 TIMPushDelegate 协议并实现 - onRemoteNotificationReceived 方法。
#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}
2. 如果您想使用内置的 TUIChat 推送解析逻辑,并跳转到 TUIChat 的聊天页面,您可以实现
- navigateToBuiltInChatViewController
方法。#pragma mark - TIMPush- (void)navigateToBuiltInChatViewController:(NSString *)userID groupID:(NSString *)groupID {UITabBarController *tab = [self getMainController];if (![tab isKindOfClass: UITabBarController.class]) {// 正在登录中return;}if (tab.selectedIndex != 0) {[tab setSelectedIndex:0];}self.window.rootViewController = tab;UINavigationController *nav = (UINavigationController *)tab.selectedViewController;if (![nav isKindOfClass:UINavigationController.class]) {return;}UIViewController *vc = nav.viewControllers.firstObject;if (![vc isKindOfClass:NSClassFromString(@"ConversationController")]&& ![vc isKindOfClass:NSClassFromString(@"ConversationController_Minimalist")]) {return;}if ([vc respondsToSelector:NSSelectorFromString(@"pushToChatViewController:userID:")]) {[vc performSelector:NSSelectorFromString(@"pushToChatViewController:userID:") withObject:groupID withObject:userID];}
@objc func navigateToBuiltInChatViewController(userID: String?, groupID: String?) {// 在这里实现导航到内置聊天视图控制器的逻辑print(userID,groupID)}
步骤5: 统计推送抵达率
1. 如果您需要统计推送的抵达和点击数据,您需要在 AppDelegate.m 文件中实现
- applicationGroupID
方法,返回 App Group ID (生成方式可参见 厂商配置-生成 App GroupID)。2. 在 Notification Service Extension 的
-didReceiveNotificationRequest:withContentHandler:
方法中调用推送抵达率统计函数:@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.pushkeyNSString * 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 = contentHandlerbestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)//appGroup 标识当前主 APP 和 Extension 之间共享的 APP Group,需要在主 APP 的 Capability 中配置 App Groups 能力。//推荐格式为 group + [主bundleID]//如 group.com.主bundleID.pushkeyTIMPushManager.handleNotificationServiceRequest(request: request, appGroupID: "appGroupID") {[weak self] content inif let bestAttemptContent = self?.bestAttemptContent {// Modify the notification content here...bestAttemptContent.title = "\(bestAttemptContent.title) [modified]"contentHandler(bestAttemptContent)}}}
关于合规
TIMPush 在您未主动调用 registerPush 之前,不会有其他任何操作,符合相关规定。
如果您使用了 TUILogin 的登录登出,TIMPush 会在内部自动调用 registerPush 或 unRegisterPush。
关于全员/标签推送
全员/标签推送支持发送特定内容,还可根据标签、属性,针对特定用户群体发送个性化内容,例如会员活动、区域通知等,助力拉新、转化、促活等各个阶段运营工作的有效进行,同时支持推送送达报表,自助推送故障排查工具,具体效果请参见 效果展示。