接入效果
应用在后台时或离线时 | 锁屏时 |
| |
准备条件
功能接入
1. 请参见推送插件 TIMPush 快速接入文档,完成除步骤6以外的所有步骤(TUIRoomKit 组件内部已经进行会前提醒的离线消息推送,所以步骤6不需要单独配置)。
2. (可选) 若您想实现点击通知立即进房,可参考以下代码,注册回调时机建议放在应用 Application 的 onCreate() 函数中:
TUICore.registerEvent(TUIConstants.TIMPush.EVENT_NOTIFY, TUIConstants.TIMPush.EVENT_NOTIFY_NOTIFICATION, new ITUINotification() {@Overridepublic void onNotifyEvent(String key, String subKey, Map<String, Object> param) {if (TUIConstants.TIMPush.EVENT_NOTIFY.equals(key) && TUIConstants.TIMPush.EVENT_NOTIFY_NOTIFICATION.equals(subKey)) {if (param != null) {String extString = (String) param.get(TUIConstants.TIMPush.NOTIFICATION_EXT_KEY);try {// 可根据您的业务,点击通知跳转到相应的界面,以下是跳转到房间的示例。JSONObject roomObject = new JSONObject(extString);String roomId = roomObject.getString("RoomId");if (!TextUtils.isEmpty(roomId)) {loginAndEnterRoom(roomId);}} catch (Exception e) {}}}}});private void loginAndEnterRoom(String roomId) {int sdkAppId = "您的appId";String userId = "您的UserId"String userSig = GenerateTestUserSig.genTestUserSig(userId);// 登录TUILogin.login(this.getApplicationContext(), sdkAppId, userId, userSig, new TUICallback() {@Overridepublic void onSuccess() {// 登录成功后进入房间ConferenceDefine.JoinConferenceParams params = new ConferenceDefine.JoinConferenceParams(roomId);Intent intent = new Intent(getApplicationContext(), ConferenceMainActivity.class);intent.putExtra(KEY_JOIN_CONFERENCE_PARAMS, params);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);getApplicationContext().startActivity(intent);}@Overridepublic void onError(int errorCode, String errorMessage) {}});}
注意:
若您想实现点击推送进入房间,必须进房前完成登录。
1. 集成 TIMPush 组件
pod 'TIMPush', '8.1.6108'
2. 配置推送参数
import TIMPushextension AppDelegate: TIMPushDelegate {func offlinePushCertificateID() -> Int32 {return kAPNSBusiId}}
#import "TIMPush/TIMPushManager.h"@interface AppDelegate () <TIMPushDelegate>- (int)offlinePushCertificateID {return kAPNSBusiId;}
3. 点击离线推送后自定义跳转(可选)
如果是冷启动,需要在 SceneDelegate 中解析通知消息,得到要进入会议的 roomId。
import UIKitclass SceneDelegate: UIResponder, UIWindowSceneDelegate {var window: UIWindow?func scene(_ scene: UIScene,willConnectTo session: UISceneSession,options connectionOptions: UIScene.ConnectionOptions) {guard let windowScene = (scene as? UIWindowScene) else { return }window = UIWindow(windowScene: windowScene)let loginVC = TRTCLoginViewController() //您自己的登录页面loginVC.roomId = processOfflinePush(connectionOptions: connectionOptions)let nav = UINavigationController(rootViewController: loginVC)window?.rootViewController = navwindow?.makeKeyAndVisible()}private func processOfflinePush(connectionOptions: UIScene.ConnectionOptions) -> String? {guard let pushNotification = connectionOptions.notificationResponse?.notification.request.content.userInfo else { return nil }guard let extString = pushNotification["ext"] as? String else { return nil }guard let dict = extString.convertToDic() else { return nil }return dict["RoomId"] as? String}
#import "SceneDelegate.h"#import <UserNotifications/UserNotifications.h>#import "TUIRoomKit/TUIRoomKit-Swift.h"#import "TIMDefine.h"@interface SceneDelegate ()@property (nonatomic, strong) NSString *roomId;@end@implementation SceneDelegate- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {[self processOfflinePush:connectionOptions];}- (void)processOfflinePush: (UISceneConnectionOptions *)connectionOptions {NSDictionary *pushNotification = connectionOptions.notificationResponse.notification.request.content.userInfo;NSString *notice = pushNotification[@"ext"];NSDictionary *dic = [self dictionaryFromString:notice];NSString *roomId = dic[@"RoomId"];//将roomId传给您自己的登录页面YourLoginViewController}@end
在您的登录页面完成 TUICore 的登录,并且判断是否需要跳转到会议主界面。
import TUICoreimport TUIRoomKit//YourLoginViewController 是您自己的登录页面class YourLoginViewController: UIViewController {var roomId: String?override func viewDidLoad() {super.viewDidLoad()TUILogin.login(Int32(SDKAppID), userID: "yourUserName", userSig: "yourUserSig") { [weak self] inguard let self = self else { return }self.navigationController?.pushViewController(YourSelfViewController(), animated: false)//YourSelfViewController是正常登录后应该显示的您自己的界面guard let roomId = self.roomId else { return }//通过roomId判断是否通过离线通知进入前台,由此判断是否再跳转到会议主界面self.showConferenceMainViewController(roomId: roomId)self.roomId = nil} fail: { (code, errorDes) inprint("code:\\(code), errorDes:\\(String(describing: errorDes))")}}func showConferenceMainViewController(roomId: String) {let conferenceViewController = ConferenceMainViewController()let params = JoinConferenceParams(roomId: roomId)conferenceViewController.setJoinConferenceParams(params: params)navigationController?.pushViewController(conferenceViewController, animated: true)}}
#import "YourLoginViewController.h"#import "TUIRoomKit/TUIRoomKit-Swift.h"#import "TUILogin.h"@interface YourLoginViewController ()@property (nonatomic, strong) NSString *roomId;@end@implementation YourLoginViewController- (void)viewDidLoad {[super viewDidLoad];[TUILogin login:yourSDKAPPID userID:@"youruserID" userSig:@"yourUserSig" succ:^{//先显示您自己的界面//如果roomId有值,说明是从离线推送进来的,可以调用showConferenceMainViewController再跳转到会议主界面} fail:^(int code, NSString * _Nullable msg) {}];// Do any additional setup after loading the view.}- (void)showConferenceMainViewController: (NSString *)roomId {ConferenceMainViewController * vc = [[ConferenceMainViewController alloc]init];JoinConferenceParams * params = [[JoinConferenceParams alloc]initWithRoomId:roomId isOpenMicrophone:true isOpenCamera:false isOpenSpeaker:true];[vc setJoinConferenceParamsWithParams:params];[self.navigationController pushViewController:vc animated:true];}
如果是从后台进入前台,需要在 AppDelegate文件中实现
onRemoteNotificationReceived
方法。import TUIRoomKitimport TIMPush@mainclass AppDelegate: UIResponder, UIApplicationDelegate, TIMPushDelegate {var roomId: String?func onRemoteNotificationReceived(_ notice: String?) -> Bool {guard let notice = notice else { return false }guard let dict = convertToDic(string: notice) else { return false }guard let roomId = dict["RoomId"] as? String else { return false }if V2TIMManager.sharedInstance().getLoginStatus() == .STATUS_LOGINED {//如果从后台唤醒并且已经完成登录,可以直接进入会议。showConferenceMainViewController(roomId: roomId)}return true}}
#import "AppDelegate.h"#import "TIMPush/TIMPushManager.h"#import "TUIRoomKit/TUIRoomKit-Swift.h"#import "TIMDefine.h"@interface AppDelegate ()<TIMPushDelegate>@property (nonatomic, strong) NSString *roomId;@end@implementation AppDelegate- (BOOL)onRemoteNotificationReceived:(NSString *)notice {NSDictionary * dic = [self dictionaryFromString:notice];NSString * roomId = dic[@"RoomId"];if (!roomId) {return false;}if ([V2TIMManager sharedInstance].getLoginStatus == V2TIM_STATUS_LOGINED ) {//如果从后台唤醒并且已经完成登录,可以直接进入会议。[self showConferenceMainViewController:roomId];}return true;}@end
常见问题
1. 若在集成过程中遇到问题,请务必先查阅 插件推送-常见问题 进行自助排查。
2. 条件说明:部分厂商要求必须上架应用市场才可以正常使用推送服务,详情参见下表:
厂商通道 | 是否需要上架 | 账号说明 |
小米 | 是 | 需要注册企业开发者账号 |
VIVO | 是 | 需要注册企业开发者账号 |
OPPO | 否 | 需要注册企业开发者账号 |
荣耀 | 否 | 需要注册企业开发者账号 |
华为 | 否 | 个人开发者账号即可 |
魅族 | 否 | 个人开发者账号即可 |