264 lines
9.9 KiB
Dart
264 lines
9.9 KiB
Dart
//
|
||
// 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
|