// // TokenGenerator.m // SellyCloudSDK_Example // // Created by Caleb on 20/11/25. // Copyright © 2025 Caleb. All rights reserved. // #import "TokenGenerator.h" #define KSecret @"CHANGE_ME" #define CALL_APP_ID @"demo-app" @implementation TokenGenerator + (NSString *)generateRTCCallTokenWithUserId:(NSString *)userId callId:(NSString *)callId { // 当前时间戳(秒) long signTime = (long)[[NSDate date] timeIntervalSince1970]; long exprTime = signTime + 600; // 10 分钟后过期 // payload 拼接 NSString *payload = [NSString stringWithFormat:@"%@%@%@%ld%ld", CALL_APP_ID, userId, callId, signTime, exprTime]; // HMAC-SHA256 计算 const char *cKey = [KSecret cStringUsingEncoding:NSUTF8StringEncoding]; const char *cData = [payload cStringUsingEncoding:NSUTF8StringEncoding]; unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH]; CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC); // 转 hex 字符串 NSMutableString *sign = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2]; for (int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) { [sign appendFormat:@"%02x", cHMAC[i]]; } // 拼接最终 Token NSString *token = [NSString stringWithFormat: @"appid=%@&userid=%@&callid=%@&signtime=%ld&exprtime=%ld&sign=%@", CALL_APP_ID, userId, callId, signTime, exprTime, sign]; return token; } + (NSString *)generateStreamSignatureWithVhost:(NSString *)vhost appId:(NSString *)appId channelId:(NSString *)channelId type:(NSString *)type key:(NSString *)key { // 当前时间戳(秒) long signTm = (long)[[NSDate date] timeIntervalSince1970]; long expireTm = signTm + 600; // 10 分钟后过期 // 拼接签名字符串: vhost|app_id|channel_id|sign_tm|expire_tm|type NSString *payload = [NSString stringWithFormat:@"%@|%@|%@|%ld|%ld|%@", vhost, appId, channelId, signTm, expireTm, type]; // 使用 key 生成签名 NSString *sign = [self generateSign:payload withKey:key]; // 拼接完整 payload: vhost|app_id|channel_id|sign_tm|expire_tm|type|sign NSString *fullPayload = [NSString stringWithFormat:@"%@|%@", payload, sign]; NSLog(@"###fullPayload == %@",fullPayload); // Base64 编码 NSData *data = [fullPayload dataUsingEncoding:NSUTF8StringEncoding]; NSString *base64String = [data base64EncodedStringWithOptions:0]; return base64String; } + (NSString *)generateSign:(NSString *)payload withKey:(NSString *)key { // HMAC-SHA256 计算 const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding]; const char *cData = [payload cStringUsingEncoding:NSUTF8StringEncoding]; unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH]; CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC); // 转 hex 字符串 NSMutableString *sign = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2]; for (int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) { [sign appendFormat:@"%02x", cHMAC[i]]; } return sign; } @end