Files
SellyCloudSDK_demo/Example/SellyCloudSDK/VideoCall/TokenGenerator.m
2026-03-01 15:59:27 +08:00

94 lines
3.3 KiB
Objective-C

//
// 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 + 60; // 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