mop-flutter-sdk/ios/Classes/FinAppletExt/Common/Util/FATExtUtil.m

264 lines
9.9 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

//
// FATExtUtil.m
// FinAppletExt
//
// Created by Haley on 2021/1/25.
// Copyright © 2021 finogeeks. All rights reserved.
//
#import "FATExtUtil.h"
#import "FATExtFileManager.h"
#import "FATExtMapManager.h"
#import "fincore.h"
#import "FATMapPlace.h"
#import <FinApplet/FinApplet.h>
#import <CommonCrypto/CommonDigest.h>
#define FAT_EXT_FILE_SCHEMA @"finfile://"
@implementation FATExtUtil
+ (NSString *)tmpDirWithAppletId:(NSString *)appletId {
if (!appletId) {
return nil;
}
NSString *cacheDir = [FATExtFileManager appTempDirPath:appletId];
NSFileManager *fileManager = [NSFileManager defaultManager];
BOOL flag = YES;
if (![fileManager fileExistsAtPath:cacheDir isDirectory:&flag]) {
[fileManager createDirectoryAtPath:cacheDir withIntermediateDirectories:YES attributes:nil error:nil];
}
return cacheDir;
}
+ (NSString *)fat_md5WithBytes:(char *)bytes length:(NSUInteger)length {
unsigned char result[16];
CC_MD5(bytes, (CC_LONG)length, result);
return [NSString stringWithFormat:
@"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
result[0], result[1], result[2], result[3],
result[4], result[5], result[6], result[7],
result[8], result[9], result[10], result[11],
result[12], result[13], result[14], result[15]];
}
+ (NSString *)jsonStringFromDict:(NSDictionary *)dict {
if (!dict || ![dict isKindOfClass:[NSDictionary class]]) {
return nil;
}
NSData *data = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:nil];
if (!data) {
return nil;
}
NSString *jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
return jsonString;
}
+ (NSString *)jsonStringFromArray:(NSArray *)array {
if (!array || ![array isKindOfClass:[NSArray class]]) {
return nil;
}
NSData *data = [NSJSONSerialization dataWithJSONObject:array options:NSJSONWritingPrettyPrinted error:nil];
if (!data) {
return nil;
}
NSString *jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
return jsonString;
}
+ (NSString *)signFromDict:(NSDictionary *)dict {
if (!dict || ![dict isKindOfClass:[NSDictionary class]]) {
return nil;
}
NSArray *keys = [dict allKeys];
NSArray *sortedKeys = [keys sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [obj1 compare:obj2 options:NSNumericSearch]; //正序
}];
NSString *plainText = @"";
for (NSString *key in sortedKeys) {
NSString *and = [plainText isEqualToString:@""] ? @"" : @"&";
NSString *value = [dict valueForKey:key];
// if ([value isKindOfClass:[NSDictionary class]]) {
// NSDictionary *dictValue = (NSDictionary *)value;
// value = [FATExtUtil jsonStringFromDict:dictValue];
// } else if ([key isKindOfClass:[NSArray class]]) {
// NSArray *arrayValue = (NSArray *)value;
// value = [FATExtUtil jsonStringFromArray:arrayValue];
// }
if ([key isEqualToString:@"sign"]) {
continue;
}
if ([value isKindOfClass:[NSString class]] || [value isKindOfClass:[NSNumber class]]) {
NSString *append = [NSString stringWithFormat:@"%@%@=%@", and, key, value];
plainText = [plainText stringByAppendingString:append];
}
}
// NSLog(@"扩展:%@", plainText);
NSString *digest = [[[SDKCoreClient sharedInstance].finoLicenseService fin_messageDigest:plainText] uppercaseString];
NSData *data = [digest dataUsingEncoding:NSUTF8StringEncoding];
NSData *encodeData = [[SDKCoreClient sharedInstance].finoLicenseService fin_encodeSMContent:data];
NSString *sign = [[NSString alloc] initWithData:encodeData encoding:NSUTF8StringEncoding];
// NSLog(@"扩展sign%@", sign);
return sign;
}
/// 获取音频文件时长
/// @param fileURL 文件url必须为AVURLAsset可解码的文件格式如 .caf .aac .wav .mp3 等)
+ (float)durtaionWithFileURL:(NSURL *)fileURL {
NSDictionary *options = @{AVURLAssetPreferPreciseDurationAndTimingKey : @(YES)};
AVURLAsset *recordAsset = [AVURLAsset URLAssetWithURL:fileURL options:options];
// 录音的时长单位ms
CMTime durationTime = recordAsset.duration;
durationTime.value = durationTime.value;
float seconds = CMTimeGetSeconds(durationTime);
float duration = seconds * 1000;
return duration;
}
/// 获取音频文件大小
/// @param fileURL 文件url
+ (long long)fileSizeWithFileURL:(NSURL *)fileURL {
// 录音文件的大小单位Byte
NSFileManager *manager = [NSFileManager defaultManager];
long long fileSize = [[manager attributesOfItemAtPath:fileURL.path error:nil] fileSize];
return fileSize;
}
+ (NSString *)currentUserId {
NSString *currentUserId = [FATClient sharedClient].config.currentUserId;
NSString *productIdentification = [FATClient sharedClient].config.productIdentification;
if (!currentUserId || currentUserId.length == 0) {
if ([NSString fat_isEmptyWithString:productIdentification]) {
currentUserId = @"finclip_default";
} else {
currentUserId = productIdentification;
}
}
return currentUserId;
}
+ (BOOL)currentProductIdentificationIsEmpty {
NSString *productIdentification = [FATClient sharedClient].config.productIdentification;
return [NSString fat_isEmptyWithString:productIdentification];
}
+ (NSString *)currentProductIdentification {
NSString *productIdentification = [FATClient sharedClient].config.productIdentification;
return productIdentification;
}
+ (NSString *)getAppName {
NSDictionary *infoDict = [[NSBundle mainBundle] infoDictionary];
NSString *appName = [infoDict valueForKey:@"CFBundleDisplayName"];
if (!appName) appName = [infoDict valueForKey:@"CFBundleName"];
if (!appName) appName = [infoDict valueForKey:@"CFBundleExecutable"];
return appName;
}
+ (void)getNearbyPlacesByCategory:(NSString *)category coordinates:(CLLocationCoordinate2D)coordinates radius:(NSInteger)radius token:(NSString *)token
completion:(void (^)(NSDictionary *))completion {
NSURL *url = [NSURL URLWithString:[self searchApiHost]];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"GET";
if (token && [token length] > 0) {
NSDictionary *parameters = @{
@"key" : [FATExtMapManager shareInstance].googleMapApiKey,
@"pagetoken" : token
};
NSURLComponents *urlComponents = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO];
NSMutableArray *queryItems = [NSMutableArray array];
for (NSString *key in parameters) {
NSString *value = [NSString stringWithFormat:@"%@", parameters[key]];
[queryItems addObject:[NSURLQueryItem queryItemWithName:key value:value]];
}
urlComponents.queryItems = queryItems;
request.URL = urlComponents.URL;
} else {
NSDictionary *parameters = @{
@"key" : [FATExtMapManager shareInstance].placesApiKey,
@"radius" : @(radius),
@"location" : [NSString stringWithFormat:@"%f,%f", coordinates.latitude, coordinates.longitude],
@"type" : [category lowercaseString]
};
NSURLComponents *urlComponents = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO];
NSMutableArray *queryItems = [NSMutableArray array];
for (NSString *key in parameters) {
NSString *value = [NSString stringWithFormat:@"%@", parameters[key]];
[queryItems addObject:[NSURLQueryItem queryItemWithName:key value:value]];
}
urlComponents.queryItems = queryItems;
request.URL = urlComponents.URL;
}
NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error) {
NSLog(@"Error: %@", error);
completion(nil);
return;
}
if (data) {
NSError *jsonError;
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonError];
if (jsonError) {
NSLog(@"Error: %@", jsonError);
completion(nil);
} else {
completion(json);
}
} else {
completion(nil);
}
}];
[task resume];
}
+ (NSArray *)convertPlaceDictToArray:(NSDictionary*)dict{
NSMutableArray *placeArrayM = [NSMutableArray array];
for (NSDictionary *dictItem in [dict objectForKey:@"results"]) {
FATMapPlace *place = [[FATMapPlace alloc] init];
place.name = dictItem[@"name"];
place.address = dictItem[@"vicinity"];
FATMapPlace *mark = [[FATMapPlace alloc] init];
NSDictionary *dict = dictItem[@"geometry"];
mark.name = dictItem[@"name"];
mark.address = dictItem[@"vicinity"];
double lat = [dict[@"location"][@"lat"] doubleValue];
double lng = [dict[@"location"][@"lng"] doubleValue];
place.location = [[CLLocation alloc] initWithLatitude:lat longitude:lng] ;
[placeArrayM addObject:place];
}
return placeArrayM;
}
+ (NSArray *)getCategories {
NSArray *list = @[@"Places",@"Bakery", @"Doctor", @"School", @"Taxi_stand", @"Hair_care", @"Restaurant", @"Pharmacy", @"Atm", @"Gym", @"Store", @"Spa"];
return list;
}
+ (NSString *)searchApiHost {
return @"https://maps.googleapis.com/maps/api/place/nearbysearch/json";
}
+ (NSString *)googlePhotosHost {
return @"https://maps.googleapis.com/maps/api/place/photo";
}
+ (NSString *)googlePlaceDetailsHost {
return @"https://maps.googleapis.com/maps/api/place/details/json";
}
@end