CNLiveUserSystemTools.m 6.38 KB
//
//  CNLiveUserSystemTools.m
//  CNLiveUserSystemDemo
//
//  Created by iOS on 16/9/13.
//  Copyright © 2016年 zhulin. All rights reserved.
//

#import "CNLiveUserSystemTools.h"
#import <UIKit/UIKit.h>
#import "CommonCrypto/CommonDigest.h"
#import "Common.h"
#import "CNLiveUserManager.h"

@implementation CNLiveUserSystemTools

#pragma mark - uuid

+ (nullable NSString *)uidForStat:(NSString *)dateStr{
    
    NSString *uid = @"";
    
    NSUserDefaults *defauts = [NSUserDefaults standardUserDefaults];
    
    if ([defauts objectForKey:@"kCNLiveUserDefaultsUIDKey"]) {
        uid = [[defauts objectForKey:@"kCNLiveUserDefaultsUIDKey"] copy];
        return uid;
    }
    else {
        
        NSString *stamp = dateStr;
        stamp = [stamp stringByReplacingOccurrencesOfString:@"." withString:@""];
        
        NSString *idfv = [[[[UIDevice currentDevice] identifierForVendor] UUIDString] stringByReplacingOccurrencesOfString:@"-" withString:@""];
        uid = [NSString stringWithFormat:@"%@_%@", idfv, stamp];
        
        [defauts setObject:uid forKey:@"kCNLiveUserDefaultsUIDKey"];
        [defauts synchronize];
    }
    
    return uid;
}

#pragma mark - 加密

+ (NSString *)sha1:(NSString *)string
{
    NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
    
    uint8_t digest[CC_SHA1_DIGEST_LENGTH];
    
    CC_SHA1(data.bytes, (int)data.length, digest);
    
    NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
    
    for(int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++)
        [output appendFormat:@"%02x", digest[i]];
    
    while ([[output substringToIndex:1] isEqualToString:@"0"]) {
        output = [[NSMutableString alloc] initWithString:[output substringFromIndex:1]];
    }
    
    return output;
}

+ (NSString *)signvalue:(NSDictionary*)parameter
{
    //对所有传入参数按照字段名的 ASCII 码从小到大排序
    NSArray *keyArr=[parameter allKeys];
    NSArray *arr = [keyArr sortedArrayUsingSelector:@selector(compare:)];
    
    NSMutableString *string1 = [[NSMutableString alloc]init];
    for (int i=0; i<arr.count; i++) {
        
        NSString *parameterString = [NSString stringWithFormat:@"%@",parameter[[arr objectAtIndex:i]]];
        if (parameterString.length > 0) {
            [string1 appendString:[NSString stringWithFormat:@"%@=%@&",[arr objectAtIndex:i],parameter[[arr objectAtIndex:i]]]];
        }
    }
    
    if (string1.length > 0) {
        [string1 deleteCharactersInRange:NSMakeRange(string1.length-1, 1)];
    }
    
    return string1;
}

//null处理
+ (NSString *)verify:(NSString *)string
{
    NSString *newString;
    
    if ([string isKindOfClass:[NSNumber class]]) {
        newString = [NSString stringWithFormat:@"%@",string];
    } else {
        newString = string;
    }
    
    if ([newString isKindOfClass:[NSString class]] || newString.length > 0) {
        return string;
    } else {
        return @"";
    }

}

+ (void)errorStat:(NSString *)errorString 
{
    errorString = [self urlEncodeUsingEncodingString:errorString];
    
    [CNLiveUserSystemTools getRealTimeString:^(NSString * _Nullable realTime, NSDate * _Nullable netDate) {
        NSString *stamp = realTime;
        stamp = [stamp stringByReplacingOccurrencesOfString:@"." withString:@""];
        NSString *vvUrl = [NSString stringWithFormat:@"http://app.sta.cnlive.com/app.js?sver=%@&uid=%@&tm=%@&from=&spid=&appid=%@&version=1005_%@&eventid=1000&uri=%@&sid=%@&plat=i_%@&objid=_", kSVer, [self uidForStat:realTime], stamp, [CNLiveUserManager manager].appId, SDKVersion, errorString,[self getSid],StatAppVersion];
        [NSURLConnection connectionWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:vvUrl]] delegate:nil];
    }];
}

+ (NSString *)urlEncodeUsingEncodingString:(NSString *)string {
    return (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
                                                                                 (__bridge CFStringRef)string,
                                                                                 NULL,
                                                                                 (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ",
                                                                                 CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));
}

+ (NSString *)getSid
{
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    if ([userDefaults objectForKey:@"CNLiveUserSid"]) {
        return [userDefaults objectForKey:@"CNLiveUserSid"];
    }
    return @"";
}

+ (void)getRealTimeString:(void (^_Nullable)(NSString * __nullable realTime,NSDate * _Nullable netDate))realTime
{
    [NSURLConnection sendAsynchronousRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://m.baidu.com"]] queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
        
        if (!response) {
            NSInteger time = [[NSDate date] timeIntervalSince1970];
            NSString *timeString = [NSString stringWithFormat:@"%ld", (long)time];
            dispatch_sync(dispatch_get_main_queue(), ^{
                realTime(timeString,[NSDate date]);
            });
            return ;
        }
        
        NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
        NSString *timestamp = [[httpResponse allHeaderFields] objectForKey:@"Date"];
        
        NSString *timeStr = [timestamp substringWithRange:NSMakeRange(5, 20)];
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"GMT"];
        NSLocale *local = [[NSLocale alloc]initWithLocaleIdentifier:@"en_US_POSIX"];
        [formatter setLocale:local];//需要配置区域,不然会造成模拟器正常,真机日期为null的情况
        [formatter setTimeZone:timeZone];
        [formatter setDateFormat:@"dd MMM yyyy HH:mm:ss"];//设置源时间字符串的格式
        NSDate *date = [formatter dateFromString:timeStr];//将源时间字符串转化为NSDate
        
        NSString *timeString = [NSString stringWithFormat:@"%.0f", [date timeIntervalSince1970]];
        dispatch_sync(dispatch_get_main_queue(), ^{
            realTime(timeString,date);
        });
    }];
}

+ (BOOL)isTestEnvironment
{
    return [CNLiveUserManager manager].isTestEnvironment;
}
@end