+ (void)startSdkWithAppId:(NSString *)appid appKey:(NSString *)appKey appSecret:(NSString *)appSecret delegate:(id<GeTuiSdkDelegate>)delegate launchingOptions:(NSDictionary * __nullable)launchOptions;
GeTuiSdkDelegate回调接口返回 cid 信息。[GeTuiSdk startSdkWithAppId:kGtAppId appKey:kGtAppKey appSecret:kGtAppSecret delegate:self launchingOptions:launchingOptions];
// 通过 appId、 appKey 、appSecret 启动SDK,注:该方法需要在主线程中调用
/// [ GTSDK回调 ] SDK启动成功返回cid
- (void)GeTuiSdkDidRegisterClient:(NSString *)clientId {
    NSLog(@"[ TestDemo ] [GTSdk RegisterClient]:%@", clientId);
}
+ (void)registerRemoteNotification:(UNAuthorizationOptions)types;
[GeTuiSdk registerDeviceTokenData:deviceToken]关联。UNAuthorizationOptions types = (UNAuthorizationOptionBadge |
                                    UNAuthorizationOptionAlert |
                                    UNAuthorizationOptionSound);
[GeTuiSdk registerRemoteNotification:types];
- (void)GeTuiSDkDidNotifySdkState:(SdkStatus)status;
- (void)GeTuiSDkDidNotifySdkState:(SdkStatus)status {
    NSLog(@"[GetuiSdk Status]:%u", status);
}
- (void)GeTuiSdkNotificationCenter:(UNUserNotificationCenter *)center
           willPresentNotification:(UNNotification * )notification
             completionHandler:(void (^) (UNNotificationPresentationOptions))completionHandler;
userNotificationCenter: willPresentNotification: withCompletionHandler:展示回调。开发者需要调用个推注册远程通知[GeTuiSdk registerRemoteNotification]。- (void)GeTuiSdkNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification completionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
    NSString *msg = [NSString stringWithFormat:@"[ TestDemo ] [APNs] %@ \n%@", NSStringFromSelector(_cmd), notification.request.content.userInfo];
    [self.homePage logMsg:msg];
    // [ 参考代码,开发者注意根据实际需求自行修改 ] 根据APP需要,判断是否要提示用户Badge、Sound、Alert等
    //completionHandler(UNNotificationPresentationOptionNone); 若不显示通知,则无法点击通知
    completionHandler(UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionSound | UNNotificationPresentationOptionAlert);
}
- (void)GeTuiSdkDidReceiveNotification:(NSDictionary *)userInfo
                    notificationCenter:(nullable UNUserNotificationCenter *)center
                              response:(nullable UNNotificationResponse *)response
                fetchCompletionHandler:(nullable void (^)(UIBackgroundFetchResult))completionHandler;
application: didReceiveRemoteNotification: fetchCompletionHandler: 和userNotificationCenter: didReceiveNotificationResponse: withCompletionHandler: 通知回调。开发者需要调用个推注册远程通知[GeTuiSdk registerRemoteNotification]。application: didReceiveRemoteNotification: fetchCompletionHandler: 和 当前方法,要注意只保留一个completionHandler调用,调用多次可能多导致偶现crash。- (void)GeTuiSdkDidReceiveNotification:(NSDictionary *)userInfo notificationCenter:(UNUserNotificationCenter *)center response:(UNNotificationResponse *)response fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    NSString *msg = [NSString stringWithFormat:@"[ TestDemo ] [APNs] %@ \n%@", NSStringFromSelector(_cmd), userInfo];
    [self.homePage logMsg:msg];
    if(completionHandler) {
        // [ 参考代码,开发者注意根据实际需求自行修改 ] 根据APP需要自行修改参数值
        completionHandler(UIBackgroundFetchResultNoData);
    }
- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo fetchCompletionHandler:(void(^)(UIBackgroundFetchResult))completionHandler
{
    //注意,如果执行了上述代理方法中的completionHandler,就不要执行当前回调中的completionHandler。
    //防止两次调用completionHandler引起崩溃
    //completionHandler(UIBackgroundFetchResultNewData);
}
- (void)GeTuiSdkDidReceiveSlience:(NSDictionary *)userInfo
                        fromGetui:(BOOL)fromGetui
                          offLine:(BOOL)offLine
                            appId:(nullable NSString *)appId
                           taskId:(nullable NSString *)taskId
                            msgId:(nullable NSString *)msgId
           fetchCompletionHandler:(nullable void (^)(UIBackgroundFetchResult))completionHandler;
GeTuiSdkDelegate将收到回调且offLine=NO。如果下发时cid离线,消息将存入个推离线服务器,通过苹果APNS发送静默消息通知。 cid在线后将收到本条消息且offLine=YES。application: didReceiveRemoteNotification: fetchCompletionHandler:通知回调,处理来自苹果APNs的静默消息通知回调。开发者需要调用个推注册远程通知[GeTuiSdk registerRemoteNotification]。- (void)GeTuiSdkDidReceiveSlience:(NSDictionary *)userInfo fromGetui:(BOOL)fromGetui offLine:(BOOL)offLine appId:(NSString *)appId taskId:(NSString *)taskId msgId:(NSString *)msgId fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    NSString *msg = [NSString stringWithFormat:@"[ TestDemo ] [APN] %@ \nReceive Slience: fromGetui:%@ appId:%@ offLine:%@ taskId:%@ msgId:%@ userInfo:%@ ", NSStringFromSelector(_cmd), fromGetui ? @"个推消息" : @"APNs消息", appId, offLine ? @"离线" : @"在线", taskId, msgId, userInfo];
    [self.homePage logMsg:msg];
    if(completionHandler) {
        // [ 参考代码,开发者注意根据实际需求自行修改 ] 根据APP需要自行修改参数值
        completionHandler(UIBackgroundFetchResultNoData);
    }
}
//以下处理用于推送苹果在线透传消息时,补全上报个推渠道消息点击数;需通过上述userInfo的_gmid_中获取到taskId 和msgId,_gmid_组成格式是taskId:msgId:clientid,以冒号区分;在您自身点击事件逻辑触发时,执行上报埋点,点击id固定为60002。
// [GeTuiSdk sendFeedbackMessage:60002 andTaskId:taskId andMsgId:msgId];
- (void)GetuiSdkGrantAuthorization:(BOOL)granted error:(NSError *)error;
[GeTuiSdk registerRemoteNotification]。GetuiSdkGrantAuthorization告知开发者。- (void)GetuiSdkGrantAuthorization:(BOOL)granted error:(NSError *)error {
    NSString *msg = [NSString stringWithFormat:@"[ TestDemo ] [APNs] %@ \n%@ %@", NSStringFromSelector(_cmd), @(granted), error];
    NSLog(@"%@", msg);
}
- (void)GeTuiSdkNotificationCenter:(UNUserNotificationCenter *)center
       openSettingsForNotification:(nullable UNNotification *)notification
userNotificationCenter: openSettingsForNotification:通知设置回调。开发者需要调用个推注册远程通知[GeTuiSdk registerRemoteNotification]。+ (BOOL)sendFeedbackMessage:(NSInteger)actionId andTaskId:(NSString *)taskId andMsgId:(NSString *)msgId;
第三方自定义回执,可用于数据统计。
/// [ GTSDK回调 ] SDK收到透传消息回调
- (void)GeTuiSdkDidReceivePayloadData:(NSData *)payloadData andTaskId:(NSString *)taskId andMsgId:(NSString *)msgId andOffLine:(BOOL)offLine fromGtAppId:(NSString *)appId {
    // [ GTSDK ]:汇报个推自定义事件(反馈透传消息)
    [GeTuiSdk sendFeedbackMessage:90001 andTaskId:taskId andMsgId:msgId];
}
+ (NSString*) handleApplinkFeedback:(NSURL* )webUrl;
/// [ 系统回调 ] APPLink回调
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void(^)(NSArray<id<UIUserActivityRestoring>> * __nullable restorableObjects))restorationHandler {
    if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
        NSURL *webUrl = userActivity.webpageURL;
        // [ GTSDK ]:处理个推APPLink回执统计
        // APPLink url 示例:https://link.gl.ink/getui?n=payload&p=mid, 其中 n=payload 字段存储用户透传信息,可以根据透传内容进行业务操作。
        NSString *payload = [GeTuiSdk handleApplinkFeedback:webUrl];
        if (payload) {
            NSLog(@"[ TestDemo ] 个推APPLink中携带的用户payload信息: %@,URL : %@", payload, webUrl);
            // TODO: 用户可根据具体 payload 进行业务处理
        }
    }
    return YES;
}
+ (void)setPushModeForOff:(BOOL)isValue;
- (void)GeTuiSdkDidSetPushMode:(BOOL)isModeOff error:(NSError *)error;具体可参考GeTuiSdkDelegate 回调中的说明。[GeTuiSdk setPushModeForOff:NO];
- (void)GeTuiSdkDidSetPushMode:(BOOL)isModeOff error:(NSError *)error {
    if (error) {
        NSString* errorInfo = [NSString stringWithFormat:@">>>[SetModeOff error]: %@", [error localizedDescription]];
        NSLog(@"GeTuiSdkDidSetPushMode with error : %@", errorInfo);
        return;
    }
    NSString* settingInfo = [NSString stringWithFormat:@">>>[GexinSdkSetModeOff]: %@", isModeOff ? @"开启" : @"关闭"];
    NSLog(@"%@", settingInfo);
}
+ (BOOL)setTags:(NSArray *)tags;
+ (BOOL)setTags:(NSArray *)tags andSequenceNum:(NSString *)aSn;
- (void)GeTuiSdkDidSetTagsAction:(NSString *)sequenceNum result:(BOOL)isSuccess error:(NSError *)aError;。[GeTuiSdk setTags:@[@"标签1",@"标签2",@"标签3"]];
[GeTuiSdk setTags:@[@"标签1",@"标签2",@"标签3" andSequenceNum:@"seqtag-1"];
- (void)GeTuiSdkDidSetTagsAction:(NSString *)sequenceNum result:(BOOL)isSuccess error:(NSError *)aError {
    /*
     参数说明
     sequenceNum: 请求的序列码
     isSuccess: 操作成功 YES, 操作失败 NO
     aError.code:
     20001:tag 数量过大(单次设置的 tag 数量不超过 100)
     20002:调用次数超限(默认一天只能成功设置一次)
     20003:标签重复
     20004:服务初始化失败
     20005:setTag 异常
     20006:tag 为空
     20007:sn 为空
     20008:离线,还未登陆成功
     20009:该 appid 已经在黑名单列表(请联系技术支持处理)
     20010:已存 tag 数目超限
     20011:tag 内容格式不正确
     */
    NSLog(@"GeTuiSdkDidSetTagAction sequenceNum:%@ isSuccess:%@ error: %@", sequenceNum, @(isSuccess), aError);
}
+ (void)bindAlias:(NSString *)alias andSequenceNum:(NSString *)aSn;
GeTuiSdkDidAliasAction:(NSString *)action result:(BOOL)isSuccess sequenceNum:(NSString *)aSn error:(NSError *)aError;具体可参考GeTuiSdkDelegate 回调中的说明。[GeTuiSdk bindAlias:@"个推" andSequenceNum:@"seq-1"];
- (void)GeTuiSdkDidAliasAction:(NSString *)action result:(BOOL)isSuccess sequenceNum:(NSString *)aSn error:(NSError *)aError {
    /*
     参数说明
     isSuccess: 操作成功 YES, 操作失败 NO
     aError.code: 
     30001:操作别名失败,频率过快,两次调用的间隔需大于 5s
     30002:操作别名失败,参数错误
     30003:当前 cid 绑定别名次数超限
     30004:操作别名失败,未知异常
     30005:操作别名时,cid 未获取到
     30006:操作别名时,发生网络错误
     30007:别名无效
     30008:sn 无效 */
    if([action isEqual:kGtResponseBindType]) {
        NSLog(@"[ TestDemo ] bind alias result sn = %@, code = %@", aSn, @(aError.code));
    }
    if([action isEqual:kGtResponseUnBindType]) {
        NSLog(@"[ TestDemo ] unbind alias result sn = %@, code = %@", aSn, @(aError.code));
    }
}
+ (void)unbindAlias:(NSString *)alias andSequenceNum:(NSString *)aSn andIsSelf:(BOOL) isSelf;
请求回调同绑定别名
GeTuiSdk.h
[GeTuiSdk unbindAlias:@"个推" andSequenceNum:@"seq-1" andIsSelf:YES];
+ (void)setBadge:(NSUInteger)value;
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:badge] 进行设置。[GeTuiSdk setBadge:5];
//如果需要角标显示需要调用系统方法设置
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:5];
+ (void)resetBadge;
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0] 进行设置。//重置角标
[GeTuiSdk resetBadge];
//如果需要角标清空需要调用系统方法设置
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
+ (void)clearAllNotificationForNotificationBar;
 //清空通知和角标
 [GeTuiSdk clearAllNotificationForNotificationBar];
+ (NSString *)clientId;
17. 获取回调CID接口中的 cid 为准)[GeTuiSdk clientId];
- (void)GeTuiSdkDidRegisterClient:(NSString *)clientId;
- (void)GeTuiSdkDidRegisterClient:(NSString *)clientId;具体可参考GeTuiSdkDelegate 回调中的说明。- (void)GeTuiSdkDidRegisterClient:(NSString *)clientId {
    NSLog(@"[GetuiSDK ClientId]:%@", clientId);
}
+ (SdkStatus)status;
[GeTuiSdk status];
+ (NSString *)version;
[GeTuiSdk version];
+ (void)setChannelId:(NSString *)channelId;
 //设置渠道信息
 [GeTuiSdk setChannelId:@"GT-Channel"];
+ (BOOL)registerVoipTokenCredentials:(NSData *)voipToken;
/// [ 系统回调 ]
- (void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials:(PKPushCredentials *)credentials forType:(NSString *)type {
    //向个推服务器注册 VoipToken
    [GeTuiSdk registerVoipTokenCredentials:credentials.token];
}
+ (void)handleVoipNotification:(NSDictionary *)payload;
警告:在iOS 13 之后 Apple不再允许PushKit应用在非Voip电话的场景下,如果需要使用Pushkit则需要接入Callkit的接口。若需要实现语音播报功能,建议通过通知扩展实现,具体参考官方Demo;
/// [ 系统回调 ]
- (void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(NSString *)type {
    //TODO:接收 VOIP 推送中的 Payload 信息进行业务处理。
    NSLog(@"[Voip Payload]:%@,%@", payload, payload.dictionaryPayload);
    //调用个推 VOIP 回执统计接口
    [GeTuiSdk handleVoipNotification:payload.dictionaryPayload];
}
+ (void)runBackgroundEnable:(BOOL)isEnable;
[GeTuiSdk runBackgroundEnable:YES];
+ (void)lbsLocationEnable:(BOOL)isEnable andUserVerify:(BOOL)isVerify;
[GeTuiSdk lbsLocationEnable:YES andUserVerify:YES];
+ (NSString *)sendMessage:(NSData *)body error:(NSError **)error;
+ (NSString *)sendMessage:(NSData *)body taskId:(NSString *)taskId error:(NSError **)error;
- (void)GeTuiSdkDidSendMessage:(NSString *)messageId result:(int)result;具体可参考GeTuiSdkDelegate 回调中的说明。 NSError *aError = nil;
 NSData *sendData = [@"sendMessage" dataUsingEncoding:NSUTF8StringEncoding];
 [GeTuiSdk sendMessage:sendData error:&aError]
- (void)GeTuiSdkDidSendMessage:(NSString *)messageId result:(int)result {
    //消息推送到个推服务器,服务器通过该接口通知sdk到达结果,result 为1 说明消息发送成功,0为失败。
    //注意: 需第三方服务器接入个推,SendMessage 到达第三方服务器后返回 1。
    NSString *msg = [NSString stringWithFormat:@"Received sendmessage:%@ result:%d", messageId, result];
    NSLog(@"[ TestDemo ] [GeTuiSdk DidSendMessage]:%@\n\n",msg);
}
+ (void)setApplicationGroupIdentifier:(NSString*)identifier;
[GeTuiSdk setApplicationGroupIdentifier:]和[GeTuiExtSdk setApplicationGroupIdentifier:],用于回执报表统计。 [GeTuiSdk setApplicationGroupIdentifier:苹果开发者后台设置的Group Identify];
+ (void)handelNotificationServiceRequest:(UNNotificationRequest *)request withAttachmentsComplete:(void (^)(NSArray* attachments, NSArray* errors))completeBlock;
UNNotificationAttachment组成的数组NSError组成的数组1).接收到 APNs 通知后,SDK 判断是否有多媒体资源,如果多媒体资源存在则下载资源,下载完成后以 Block 方式回调返回 attachments 资源数组对象和 errors 错误数组信息。
2).多媒体大小限制:
| 资源 | 类型 | 大小 | 超时 | 
|---|---|---|---|
| 图片 | 1 | <=10MB | 120s | 
| 音频 | 2 | <=5MB | 60s | 
| 视频 | 3 | <=50MB | 180s | 
3).可设置是否仅在 WIFI 下下载资源,参考服务端API。如果为True,数据网络下将不下载资源,展示通知不带附件。默认是False,支持 WIFI 和 数据网络下下载。
4). 资源URL格式注意:不支持中文及转译地址,请使用英文合法地址。
5). 错误信息:
- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
    self.contentHandler = contentHandler;
    self.bestAttemptContent = [request.content mutableCopy];
    NSLog(@"----将APNs信息交由个推处理----");
    [GeTuiExtSdk handelNotificationServiceRequest:request withAttachmentsComplete:^(NSArray *attachments, NSArray* errors) {
        //TODO:用户可以在这里处理通知样式的修改,eg:修改标题
        self.bestAttemptContent.title = [NSString stringWithFormat:@"%@ [modified]", self.bestAttemptContent.title]; //修改展示title信息
        self.bestAttemptContent.attachments = attachments; //设置通知中的多媒体附件
        NSLog(@"个推处理APNs消息遇到错误:%@",errors); //如果APNs处理有错误,可以在这里查看相关错误详情
        self.contentHandler(self.bestAttemptContent); //展示推送的回调处理需要放到个推回执完成的回调中
    }];
}
+ (void)handelNotificationServiceRequest:(UNNotificationRequest *) request withComplete:(void (^)(void))completeBlock;
只统计APNs到达情况,不下载多媒体资源,完成后以 block方式回调,用户可在此回调中自行修改通知样式等。self.contentHandler(self.bestAttemptContent) 来完成更新通知栏的正常展示。- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
    self.contentHandler = contentHandler;
    self.bestAttemptContent = [request.content mutableCopy];
    //通知个推服务器APNs信息送达
    [GeTuiExtSdk handelNotificationServiceRequest:request withComplete:^{
        // Modify the notification content here...
        self.bestAttemptContent.title = [NSString stringWithFormat:@"%@ [modified]", self.bestAttemptContent.title];
        //返回新的通知内容,展示APNs通知。
        self.contentHandler(self.bestAttemptContent);
    }];
}
+ (void)destory;
- (void)serviceExtensionTimeWillExpire {
    //超时时销毁个推SDK释放资源
    [GeTuiExtSdk destory];
    self.contentHandler(self.bestAttemptContent);
}
- (void)GeTuiSdkDidOccurError:(NSError *)error;
/** SDK遇到错误回调 */
- (void)GeTuiSdkDidOccurError:(NSError *)error {
    NSLog(@"[ TestDemo ] [GeTuiSdk GeTuiSdkDidOccurError]:%@\n\n",error.localizedDescription);
}
+ (BOOL)registerLiveActivity:(NSString *)liveActivityId activityToken:(NSString*)token sequenceNum:(NSString*)sn;
for await tokenData in current.pushTokenUpdates {
    let mytoken = tokenData.map { String(format: "%02x", $0) }.joined()
    [GeTuiSdk registerLiveActivity:@"订单号" activityToken:mytoken sequenceNum:@"序列号"];
}
- (void)GeTuiSdkDidRegisterLiveActivity:(NSString *)sequenceNum result:(BOOL)isSuccess error:(NSError *)error {
    NSLog(@"GeTuiSdkDidRegisterLiveActivity SN: %@, isSuccess : %@, error :%@", sequenceNum, @(isSuccess), error);
}
+ (BOOL)registerLiveActivity:(NSString *)activityAttributes pushToStartToken:(NSString*)pushToStartToken sequenceNum:(NSString*)sn;
BOOL: YES:入参长度校验成功,NO:activityAttributes\pushToStartToken\sn长度为空。
iOS 17.2 中推出了一个新功能 push-to-start LiveActivity。通过该接口注册 pushToStartToken,从而进行APNs推送启动 LiveActivity。
注意:
当App未启动时,系统收到APNs消息并启动LiveActivity后,会在后台拉活App(运行时间有限)。目的是让App及时汇报当前LiveActivity实例的pushToken,后续开发者可以通过APNs+pushToken对当前实例进行内容更新。
所以,开发者需要在App启动后尽快监听pushTokenUpdates并汇报PushToken给个推,以便后续通过APNs更新LiveActivity内容。
if #available(iOS 17.2, *) {
    let tokenData = Activity<Attributes>.pushToStartToken
    if let token = tokenData {
        //获取当前
        let pushToStartToken = String(data: token, encoding: .utf8)
        let attributeName = "\(Attributes.self)"
        NSLog("Activity \(Attributes.self) pushToStartToken = \(String(describing: pushToStartToken))")
        //TODO: 开发者上传pushToStartToken
        GeTuiSdk.registerLiveActivity(attributeName, pushToStartToken: pushToStartToken ?? "", sequenceNum: attributeName)
    }
    Task {
        for await tokenData in Activity<Attributes>.pushToStartTokenUpdates {
            //监听token更新
            let mytoken = tokenData.map { String(format: "%02x", $0) }.joined()
            let attributeName = "\(Attributes.self)"
            NSLog("Activity updates \(Attributes.self) pushToStartToken = \(mytoken) ")
            //TODO: 开发者上传pushToStartToken
            GeTuiSdk.registerLiveActivity(attributeName, pushToStartToken: pushToStartToken ?? "", sequenceNum: attributeName)
        }
    }
}
- (void)GeTuiSdkDidRegisterPushToStartToken:(NSString *)sequenceNum result:(BOOL)isSuccess error:(NSError *)error {
    NSLog(@"GeTuiSdkDidRegisterPushToStartToken SN: %@, isSuccess : %@, error :%@", sequenceNum, @(isSuccess), error);
}
// 弹窗展示回调
- (void)GeTuiSdkPopupDidShow:(NSDictionary *)info;
// 弹窗点击回调
- (void)GeTuiSdkPopupDidClick:(NSDictionary *)info;
// 展示回调
- (void)GeTuiSdkPopupDidShow:(NSDictionary *)info {
    NSString *msg = [NSString stringWithFormat:@"[ TestDemo ] GeTuiSdkPopupDidShow%@", info];
    [self.homePage logMsg:msg];
    //已经集成用户运营SDK的用户, 建议调用IDO的应用内弹窗统计
    [GTCountSDK popupDidShow:info];
}
// 点击回调
- (void)GeTuiSdkPopupDidClick:(NSDictionary *)info {
    NSString *msg = [NSString stringWithFormat:@"[ TestDemo ] GeTuiSdkPopupDidClick%@", info];
    [self.homePage logMsg:msg];
    //已经集成用户运营SDK的用户, 建议调用IDO的应用内弹窗统计
    [GTCountSDK popupDidClick:info];
}
+ (BOOL)registerControlsTokens:(NSDictionary *)tokens sequenceNum:(NSString*)sn;
- (void)controlsClick {
    if (@available(iOS 18.0, *)) {
      NSDictionary *tokens = @{
            @"kind1":@"token1",
            @"kind2":@"",
            @"kind3":@"token3",
        };
       [GeTuiSdk registerControlsTokens:tokens sequenceNum:@"sn1-uuid"];
    }
}
- (void)GeTuiSdkDidRegisterControlsTokens:(NSString *)sequenceNum result:(BOOL)isSuccess error:(NSError *)error {
    NSLog(@"GeTuiSdkDidRegisterControlsTokens SN: %@, isSuccess : %@, error :%@", sequenceNum, @(isSuccess), error);
}
                
            以上文档对您是否有帮助?