Unity和iOS 数据交互(腾讯云验证码)

最近公司用Unity开发项目,需要与iOS进行交互,主要是照相和验证码交互,所以写下心得,与大家互相学习。

验证码部分

由于只用到了腾讯云单发短信这个功能,所以我们可以看到腾讯云给定的模版:https://cloud.tencent.com/document/product/382/5976,里面参数介绍的很详细,再次不做叙述。

unity代码:

#if UNITY_IPHONE
	[DllImport("__Internal")]
	private static extern void sendSMS (string phoneNum,int appid,string appkey,int templateId,string smsSign);

对验证方法进行声明,这里我需要传给iOS那边传入参数。

//注解

 phoneNum :接收验证码的手机号

 appid:在腾讯云上申请到的sdkappid

appkey:sdkappid对应的appkey

templateId:在控制台审核通过的模板 ID

smsSign:短信签名

#elif UNITY_IPHONE && !UNITY_EDITOR
    Debug.Log("苹果验证码");
	sendSMS(PhoneNumText.text, UIManager.Instance.appid, UIManager.Instance.appkey, UIManager.Instance.templateId, UIManager.Instance.smsSign);

然后再需要的位置调用苹果发送验证码。

*使用 [DllImport("__Internal")]需要加入命名空间

using System.Runtime.InteropServices;        //[DllImport]特性的命名空间。

当苹果向腾讯云发送完验证码后,需要向unity返回自己生成的验证码,这边就可以比对验证码是否输入有误

public void RecCode(string code)
{
    this.code = code;
}

 Xcode代码:

iOS这边需要做三件事情:1.接收unity传过来的参数  2.向腾讯云发送消息 3.接收消息后传递给unity

1.接收unity传过来的参数

(1)创建文件

由于会用到C语言,所以创建的“VerifyCTL”文件需要修改成.mm结尾,此外还创建了一个处理数据的NSString的类拓展。

(二)在VerifyCTL接收unity传递过来的参数

extern "C" void sendSMS(char *phoneNum,int appid,char *appkey,int templateId,char *smsSign)
    {
        VerifyCTL *app = [[VerifyCTL alloc] init];
        [app getParameter:[[NSString alloc] initWithUTF8String:phoneNum] appid:appid appkey:[[NSString alloc] initWithUTF8String:appkey] templateId:templateId smsSign:[[NSString alloc] initWithUTF8String:smsSign]];
    }

(三)拼接数据

- (void)getParameter:(NSString *)phoneNum appid:(int)appid appkey:(NSString *)appkey templateId:(int)templateId smsSign:(NSString *)smsSign{
    NSString *ext = @"";
    NSString *extend = @"";
    NSString *code = [NSString getAuthcode:4];//客户端自动生成4位数的验证码
    NSArray *params = [NSArray arrayWithObject:code];
    
    NSString *random = @"000000";//随机数,这里我测试写个定值
    NSString *strTime = [NSString currentTimeStr];//请求发起时间,unix 时间戳
    NSString *sha = [NSString stringWithFormat:@"appkey=%@&random=%@&time=%@&mobile=%@",appkey,random,strTime,phoneNum];
    NSString *sig = [NSString SHA256:sha];//这里要进行sha256加密
    NSString *sign = smsSign;
    
    NSDictionary *tel = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:phoneNum,@"86", nil] forKeys:[NSArray arrayWithObjects:@"mobile",@"nationcode", nil]];//电话号码处理
    NSString * time = [NSString currentTimeStr];
    NSString * tpl_id = [NSString stringWithFormat:@"%d",templateId];
    
    NSDictionary *dic = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:ext,extend,params,sig,sign,tel,time,tpl_id, nil] forKeys:[NSArray arrayWithObjects:@"ext",@"extend",@"params",@"sig",@"sign",@"tel",@"time",@"tpl_id", nil]];
    NSString *sendData = [NSString convertToJsonData:dic];//字典转json字符串
    [self sendData:sendData random:random appid:[NSString stringWithFormat:@"%d",appid] code:code];
}

2.向腾讯云发送消息

- (void)sendData:(NSString *)sendData random:(NSString *)random appid:(NSString *)appid code:(NSString *)code{
    //     1. URL
    NSString *urlString = [NSString stringWithFormat:@"https://yun.tim.qq.com/v5/tlssmssvr/sendsms?sdkappid=%@&random=%@",appid,random];
    NSURL *url = [NSURL URLWithString:urlString];
    
    // 2. 请求(可以改的请求)
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    request.HTTPMethod = @"POST";
    request.HTTPBody = [sendData dataUsingEncoding:NSUTF8StringEncoding];
    // 3.获得会话对象
    NSURLSession *session = [NSURLSession sharedSession];
    // 4.根据会话对象,创建一个Task任务
    //        __weak typeof(self) weakSelf = self;
    NSURLSessionDataTask *sessionDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        NSString * str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        UnitySendMessage("Register","RecCode",[code UTF8String]);
//        NSDictionary *dicData = [NSString dictionaryWithJsonString:str];
    }];
    //5.最后一步,执行任务,(resume也是继续执行)。
    [sessionDataTask resume];
}

3.接收消息后传递给unity

在收到发送成功的消息之后,如果消息成功就将自己生成的验证码发送给unity进行验证,这里本人不做叙述。

下面展示部分数据处理代码

1.SHA256加密

+ (NSString *)SHA256:(NSString *)dataStr
{
    const char *s = [dataStr cStringUsingEncoding:NSASCIIStringEncoding];
    NSData *keyData = [NSData dataWithBytes:s length:strlen(s)];
    
    uint8_t digest[CC_SHA256_DIGEST_LENGTH] = {0};
    CC_SHA256(keyData.bytes, (CC_LONG)keyData.length, digest);
    NSData *out = [NSData dataWithBytes:digest length:CC_SHA256_DIGEST_LENGTH];
    NSString *hash = [out description];
    hash = [hash stringByReplacingOccurrencesOfString:@" " withString:@""];
    hash = [hash stringByReplacingOccurrencesOfString:@"<" withString:@""];
    hash = [hash stringByReplacingOccurrencesOfString:@">" withString:@""];
    return hash;
}

2.获取4位数验证码

//获取验证码
+ (NSString *)getAuthcode:(NSInteger)kCharCount{
    //字符串素材
    NSArray *dataArray = [[NSArray alloc] initWithObjects:@"0",@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",nil];
    NSMutableString *authCodeStr = [[NSMutableString alloc] initWithCapacity:kCharCount];
    //随机从数组中选取需要个数的字符串,拼接为验证码字符串
    for (int i = 0; i < kCharCount; i++) {
        NSInteger index = arc4random() % (dataArray.count-1);
        NSString *tempStr = [dataArray objectAtIndex:index];
        authCodeStr = (NSMutableString *)[authCodeStr stringByAppendingString:tempStr];
    }
    return authCodeStr;
}

3.获取时间戳

//获取当前时间戳
+ (NSString *)currentTimeStr{
    NSDate* date = [NSDate dateWithTimeIntervalSinceNow:0];//获取当前时间0秒后的时间
    NSTimeInterval time=[date timeIntervalSince1970];// *1000 是精确到毫秒,不乘就是精确到秒
    NSString *timeString = [NSString stringWithFormat:@"%.0f", time];
    return timeString;
}

所发的是测试代码,可自行优化,经测试可以获取到手机验证码信息。

猜你喜欢

转载自blog.csdn.net/small_cap/article/details/81204184