// // PhobosUtil.m // Pods // // Created by Thierry on 16/2/15. // // #import "PhobosUtil.h" #import #import "PhobosConfig.h" #import @implementation PhobosUtil + (NSData *)compressData:(NSData *)originData{ if (!originData || [originData length] == 0) { return nil; } z_stream zlibStreamStruct; zlibStreamStruct.zalloc = Z_NULL; // Set zalloc, zfree, and opaque to Z_NULL so zlibStreamStruct.zfree = Z_NULL; // that when we call deflateInit2 they will be zlibStreamStruct.opaque = Z_NULL; // updated to use default allocation functions. zlibStreamStruct.total_out = 0; // Total number of output bytes produced so far zlibStreamStruct.next_in = (Bytef*)[originData bytes]; // Pointer to input bytes zlibStreamStruct.avail_in = (uInt)[originData length]; // Number of input bytes left to process int initError = deflateInit2(&zlibStreamStruct, Z_DEFAULT_COMPRESSION, Z_DEFLATED, (15+16), 8, Z_DEFAULT_STRATEGY); if (initError != Z_OK) { NSString *errorMsg = nil; switch (initError) { case Z_STREAM_ERROR: errorMsg = @"Invalid parameter passed in to function."; break; case Z_MEM_ERROR: errorMsg = @"Insufficient memory."; break; case Z_VERSION_ERROR: errorMsg = @"The version of zlib.h and the version of the library linked do not match."; break; default: errorMsg = @"Unknown error code."; break; } return nil; } NSMutableData *compressedData = [NSMutableData dataWithLength:[originData length] * 1.01 + 12]; NSInteger deflateStatus; do { zlibStreamStruct.next_out = [compressedData mutableBytes] + zlibStreamStruct.total_out; zlibStreamStruct.avail_out = (uInt)([compressedData length] - zlibStreamStruct.total_out); deflateStatus = deflate(&zlibStreamStruct, Z_FINISH); } while ( deflateStatus == Z_OK ); // Check for zlib error and convert code to usable error message if appropriate if (deflateStatus != Z_STREAM_END) { NSString *errorMsg = nil; switch (deflateStatus) { case Z_ERRNO: errorMsg = @"Error occured while reading file."; break; case Z_STREAM_ERROR: errorMsg = @"The stream state was inconsistent (e.g., next_in or next_out was NULL)."; break; case Z_DATA_ERROR: errorMsg = @"The deflate data was invalid or incomplete."; break; case Z_MEM_ERROR: errorMsg = @"Memory could not be allocated for processing."; break; case Z_BUF_ERROR: errorMsg = @"Ran out of output buffer for writing compressed bytes."; break; case Z_VERSION_ERROR: errorMsg = @"The version of zlib.h and the version of the library linked do not match."; break; default: errorMsg = @"Unknown error code."; break; } deflateEnd(&zlibStreamStruct); return nil; } deflateEnd(&zlibStreamStruct); [compressedData setLength: zlibStreamStruct.total_out]; phobosLog([NSString stringWithFormat:@"Compressed file from %lu B to %lu B", [originData length], [compressedData length]]); return compressedData; } + (void)sendData:(NSData *)data success:(SendDataSuccessBlock)success { #ifdef POD_CONFIGURATION_APP_STORE NSString *url = @"http://log.gmei.com/log/collect"; #elif POD_CONFIGURATION_UNIT_TEST NSString *url = @"http://jaguar.gmei/log/collect"; #else NSString *url = @"http://log.test.gengmei.cc/log/collect"; #endif @try { NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:url]]; [request setValue:@"gzip" forHTTPHeaderField:@"Content-Encoding"]; request.HTTPBody = data; request.HTTPMethod = @"POST"; [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) { NSHTTPURLResponse *res = (NSHTTPURLResponse *)response; NSInteger code = res.statusCode; if (code == 200) { if (success) { success(code); } } }]; } @catch (NSException *exception) { phobosLog(exception); } } /** * @brief 将对象转成JSON格式数据 * * @param obj * * @return * * @since 0.0.1 */ + (NSData *)encodeJSON:(id)obj { NSData *data = [NSJSONSerialization dataWithJSONObject:obj options:0 error:nil]; return data; } /** * @brief 获取当前时间的毫秒数 * * @return * * @since 0.0.1 */ + (NSString *)currentTime { NSDate *date = [NSDate date]; NSTimeInterval interval = [date timeIntervalSince1970]; NSString *timeIntervalStr = [NSString stringWithFormat:@"%ld",(long)interval]; return timeIntervalStr; } /** * @brief 获取当前APP的版本号 * * @return * * @since 0.0.1 */ + (NSString *)getAppVersion { NSString *buildVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"]; if (buildVersion) { return buildVersion; }else{ return @""; } } + (BOOL)isNonEmpty:(NSString *)string { if (!string) { return NO; } NSMutableCharacterSet *emptyStringSet = [[NSMutableCharacterSet alloc] init]; [emptyStringSet formUnionWithCharacterSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]]; [emptyStringSet formUnionWithCharacterSet: [NSCharacterSet characterSetWithCharactersInString: @" "]]; if ([string length] == 0) { return NO; } NSString* str = [string stringByTrimmingCharactersInSet:emptyStringSet]; return [str length] > 0; } + (NSString *)deviceId { NSString *idfa = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString]; NSString *idfv = [[[UIDevice currentDevice] identifierForVendor] UUIDString]; if (![idfa isEqualToString:@"00000000-0000-0000-0000-000000000000"]) { return idfa; } return idfv; } @end