// Copyright (c) 2024 Tencent. All rights reserved. // Author: eddardliu #import "TUIMultimediaSignatureChecker.h" #import #import #import #import #import #import "NSArray+Functional.h" #import "TUIMultimediaPlugin/TUIMultimediaPersistence.h" #define SCHEDULE_UPDATE_SIGNATURE_INTERVAL_WHEN_START 0.f #define SCHEDULE_UPDATE_SIGNATURE_INTERVAL_WHEN_SUCCESS 3600 * 1000.0f #define SCHEDULE_UPDATE_SIGNATURE_INTERVAL_WHEN_FAIL 1000.0f #define SCHEDULE_UPDATE_SIGNATURE_RETRY_TIMES 3 @interface TUIMultimediaSignatureChecker () { NSString* _signature; NSInteger _expiredTime; NSTimer* _timer; void (^_updateSignatureSuccess)(void); } @property (nonatomic, assign) NSInteger retryCount; @end @implementation TUIMultimediaSignatureChecker + (instancetype)shareInstance { static id instance = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ instance = [[self alloc] init]; }); return instance; } - (instancetype)init { self = [super init]; if (self) { _retryCount = 0; } return self; } - (void)startUpdateSignature:(void (^)(void))updateSignatureSuccessful { NSLog(@"TUIMultimediaSignatureChecker startUpdateSignature"); _updateSignatureSuccess = updateSignatureSuccessful; [self scheduleUpdateSignature:SCHEDULE_UPDATE_SIGNATURE_INTERVAL_WHEN_START]; } - (void)updateSignatureIfNeed { if ([NSDate.now timeIntervalSince1970] < _expiredTime) { [self scheduleUpdateSignature:(_expiredTime - [NSDate.now timeIntervalSince1970]) *1000]; return; } [V2TIMManager.sharedInstance callExperimentalAPI:@"getVideoEditSignature" param:nil succ:^(NSObject *result) { if (result == nil || ![result isKindOfClass:NSDictionary.class]) { NSLog(@"getVideoEditSignature: data = nil"); return; } NSDictionary *data = (NSDictionary *)result; NSLog(@"getVideoEditSignature: data = %@", data); NSNumber *expiredTime = data[@"expired_time"]; NSString *signature = data[@"signature"]; if (![expiredTime isKindOfClass:NSNumber.class]) { NSLog(@"getVideoEditSignature: expiredTime type error"); return; } if (![signature isKindOfClass:NSString.class]) { NSLog(@"getVideoEditSignature: signature type error"); return; } self.retryCount = 0; self->_expiredTime = [expiredTime integerValue]; self->_signature = signature; NSLog(@"getVideoEditSignature: succeed. signature=%@, expiredTime=%@", self->_signature, @(self->_expiredTime)); [self setSignatureToSDK]; [self scheduleUpdateSignature:([expiredTime integerValue] - [NSDate.now timeIntervalSince1970]) * 1000]; if (self->_updateSignatureSuccess != nil) { self->_updateSignatureSuccess(); self->_updateSignatureSuccess = nil; } } fail:^(int code, NSString *desc) { NSLog(@"getVideoEditSignature: failed. code=%@, desc=%@", @(code), desc); if (code == ERR_SDK_INTERFACE_NOT_SUPPORT) { [self cancelTimer]; return; } self.retryCount ++; if (self.retryCount > SCHEDULE_UPDATE_SIGNATURE_RETRY_TIMES) { self.retryCount = 0; return; } else { NSLog(@"getVideoEditSignature: Attempting to get signature for the %ld time",self.retryCount); [self scheduleUpdateSignature:SCHEDULE_UPDATE_SIGNATURE_INTERVAL_WHEN_FAIL]; } }]; } - (void)setSignatureToSDK { NSDictionary *param = @{ @"api" : @"setSignature", @"params" : @{ @"appid" : [@([TUILogin getSdkAppID]) stringValue], @"signature" : _signature, }, }; NSError *error = nil; NSData *data = [NSJSONSerialization dataWithJSONObject:param options:0 error:&error]; if (error != nil) { NSLog(@"TUIMultimedia GetMultimediaIsSupport Error:%@", error); } NSString *paramStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"TUIMultimedia setSignature:%@", paramStr); SEL selector = NSSelectorFromString(@"callExperimentalAPI:"); if ([[TXUGCBase class] respondsToSelector:selector]) { // [TXUGCBase callExperimentalAPI:paramStr]; [[TXUGCBase class] performSelector:selector withObject:paramStr]; } else { NSLog(@"callExperimentalAPI: method is not available."); } } - (BOOL)isFunctionSupport { return _signature != nil && _signature.length > 0 && [NSDate.now timeIntervalSince1970] < _expiredTime; } -(void)scheduleUpdateSignature:(float)interval { [self cancelTimer]; interval = interval / 1000; _timer = [NSTimer scheduledTimerWithTimeInterval:interval target:self selector:@selector(updateSignatureIfNeed) userInfo:nil repeats:NO]; } - (void)cancelTimer { if (_timer != nil) { [_timer invalidate]; _timer = nil; } } @end