chore: Initial clean commit

- Removed YuMi/Library/ (138 MB, not tracked)
- Removed YuMi/Resources/ (23 MB, not tracked)
- Removed old version assets (566 files, not tracked)
- Excluded Pods/, xcuserdata/ and other build artifacts
- Clean repository optimized for company server deployment
This commit is contained in:
edwinQQQ
2025-10-09 16:19:14 +08:00
commit a35a711be6
5582 changed files with 408913 additions and 0 deletions

View File

@@ -0,0 +1,64 @@
//
// NSString+Regex.h
// YUMI
//
// Created by YUMI on 2021/9/14.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface NSString (Utils)
///是否是正确的手机号
- (BOOL)isPhoneNumber;
///MD5加密
- (NSString *)MD5String;
+ (BOOL)versionCompareOldStr:(NSString *)first andNewStr: (NSString *)second;
///数字转化为万
+ (NSString *)getDealNumWithString:(NSString *)string;
///数字转化为十万
+(NSString *)getDealTenNumWithString:(NSString *)string;
+ (NSString *)formatNumberToKOrM:(NSString *)string;
///时间戳转化为需要显示的内容
+ (NSString *)stringWithTimeStamp:(NSString *)timeStamp;
///通过生日获取星座
+ (NSString *)calculateConstellationWithMonth:(long)time;
///通过生日获取星座
+ (NSString *)getCalculateConstellationTextWithMonth:(long)time;
///通过生日获取星座图片
+ (NSString *)getCalculateConstellationImageWithMonth:(long)time;
///得到年龄
+(NSString *)getAgeWithBirth:(long)birth;
///得到区号
+(NSString *)getCountryCode;
///产生唯一的key用于图片或文件上传
+ (NSString *)createUUID;
+ (BOOL)isEmpty:(NSString *)string;
//- (BOOL)isEmpty;
- (NSString *)pureURLString;
+ (NSString *)formatNumberToKOrM_NoRounding:(NSString *)string;
+ (NSString *)stringByRemovingRedundantZeros:(NSString *)string;
+ (NSString *)trimString:(NSString *)input lengthLimit:(NSInteger)limit;
+ (BOOL)isValidImageURL:(NSString *)url;
/// 检查字符串是否为图片格式(通过扩展名判断)
+ (BOOL)isImageFormat:(NSString *)url;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,555 @@
//
// NSString+Regex.m
// YUMI
//
// Created by YUMI on 2021/9/14.
//
#import "NSString+Utils.h"
#import <CommonCrypto/CommonDigest.h>
#import "LoginAreaModel.h"
@implementation NSString (Utils)
///
- (BOOL)isPhoneNumber{
NSString *regex =@"^((1[3-9][0-9])|(147)|(15[^4,\\D])|(18[0,5-9]))\\d{8}$";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
return [pred evaluateWithObject:self];
}
///MD5
- (NSString *)MD5String {
const char *cstr = [self UTF8String];
unsigned char result[16];
CC_MD5(cstr, (CC_LONG)strlen(cstr), 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]
];
}
+ (BOOL)versionCompareOldStr:(NSString *)first andNewStr: (NSString *)second{
if ([first compare:second options:NSNumericSearch] == NSOrderedAscending){
return NO;
}else if ([first compare:second options:NSNumericSearch] == NSOrderedSame){
return YES;
}else{
return YES;
}
}
+(NSString *)getDealTenNumWithString:(NSString *)string{
if (string.floatValue < 100000) {
return [NSString stringWithFormat:@"%@", string];
}
NSDecimalNumber *numberA = [NSDecimalNumber decimalNumberWithString:string];
NSDecimalNumber *numberB = [NSDecimalNumber decimalNumberWithString:@"1000"];
//NSDecimalNumberBehaviors 1.RoundingMode 2.scale 3.raiseOnExactness 4.raiseOnOverflow 4.raiseOnUnderflow 5.raiseOnDivideByZero 0
NSDecimalNumberHandler *roundingBehavior = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundDown scale:0 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:NO];
/// Multiply
NSDecimalNumber *numResult = [numberA decimalNumberByDividingBy:numberB withBehavior:roundingBehavior];
NSString *strResult = [numResult stringValue];
return [NSString stringWithFormat:@"%@k", strResult];
}
///
+ (NSString *)getDealNumWithString:(NSString *)string{
if (string.floatValue < 10000) {
return [NSString stringWithFormat:@"%@", string];
}
NSDecimalNumber *numberA = [NSDecimalNumber decimalNumberWithString:string];
NSDecimalNumber *numberB = [NSDecimalNumber decimalNumberWithString:@"10000"];
//NSDecimalNumberBehaviors 1.RoundingMode 2.scale 3.raiseOnExactness 4.raiseOnOverflow 4.raiseOnUnderflow 5.raiseOnDivideByZero 0
NSDecimalNumberHandler *roundingBehavior = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundDown scale:2 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:NO];
/// Multiply
NSDecimalNumber *numResult = [numberA decimalNumberByDividingBy:numberB withBehavior:roundingBehavior];
NSString *strResult = [numResult stringValue];
return [NSString stringWithFormat:YMLocalizedString(@"NSString_Utils4"), strResult];
}
+ (NSString *)formatNumberToKOrM:(NSString *)string {
//
NSDecimalNumber *thousand = [NSDecimalNumber decimalNumberWithString:@"1000"];
NSDecimalNumber *nine = [NSDecimalNumber decimalNumberWithString:@"9999"];
NSDecimalNumber *million = [NSDecimalNumber decimalNumberWithString:@"1000000"];
NSDecimalNumber *billion = [NSDecimalNumber decimalNumberWithString:@"1000000000"];
NSDecimalNumber *trillion = [NSDecimalNumber decimalNumberWithString:@"1000000000000"];
// NSDecimalNumber
NSDecimalNumber *number = [NSDecimalNumber decimalNumberWithString:string];
//
if ([number compare:nine] == NSOrderedAscending) {
// 10000
return [NSString stringWithFormat:@"%@", string];
} else if ([number compare:nine] != NSOrderedAscending && [number compare:million] == NSOrderedAscending) {
// 10000 9999999K
NSDecimalNumber *result = [number decimalNumberByDividingBy:thousand];
return [self formatResult:result withUnit:@"K"];//[NSString stringWithFormat:@"%.1fK", result.doubleValue];
} else if ([number compare:million] != NSOrderedAscending && [number compare:billion] == NSOrderedAscending) {
// 1000000M
NSDecimalNumber *result = [number decimalNumberByDividingBy:million];
return [self formatResult:result withUnit:@"M"];//[NSString stringWithFormat:@"%.1fM", result.doubleValue];
} else if ([number compare:billion] != NSOrderedAscending && [number compare:trillion] == NSOrderedAscending) {
// 亿 B
NSDecimalNumber *result = [number decimalNumberByDividingBy:billion];
return [self formatResult:result withUnit:@"B"];
} else {
// 亿
NSDecimalNumber *result = [number decimalNumberByDividingBy:trillion];
return [self formatResult:result withUnit:@"T"]; // T 亿 (Trillion)
}
}
+ (NSString *)formatNumberToKOrM_NoRounding:(NSString *)string {
//
NSDecimalNumber *thousand = [NSDecimalNumber decimalNumberWithString:@"1000"];
NSDecimalNumber *nine = [NSDecimalNumber decimalNumberWithString:@"9999"];
NSDecimalNumber *million = [NSDecimalNumber decimalNumberWithString:@"1000000"];
NSDecimalNumber *billion = [NSDecimalNumber decimalNumberWithString:@"1000000000"];
NSDecimalNumber *trillion = [NSDecimalNumber decimalNumberWithString:@"1000000000000"];
// NSDecimalNumber
NSDecimalNumber *number = [NSDecimalNumber decimalNumberWithString:string];
//
if ([number compare:nine] == NSOrderedAscending) {
// 10000
return [NSString stringWithFormat:@"%@", string];
} else if ([number compare:nine] != NSOrderedAscending && [number compare:million] == NSOrderedAscending) {
// 10000 9999999K
NSDecimalNumber *result = [number decimalNumberByDividingBy:thousand];
return [self truncateDecimal:result withUnit:@"K"];
} else if ([number compare:million] != NSOrderedAscending && [number compare:billion] == NSOrderedAscending) {
// 1000000M
NSDecimalNumber *result = [number decimalNumberByDividingBy:million];
return [self truncateDecimal:result withUnit:@"M"];
} else if ([number compare:billion] != NSOrderedAscending && [number compare:trillion] == NSOrderedAscending) {
// 亿 B
NSDecimalNumber *result = [number decimalNumberByDividingBy:billion];
return [self truncateDecimal:result withUnit:@"B"];
} else {
// 亿
NSDecimalNumber *result = [number decimalNumberByDividingBy:trillion];
return [self truncateDecimal:result withUnit:@"T"]; // T 亿 (Trillion)
}
}
//
+ (NSString *)truncateDecimal:(NSDecimalNumber *)decimal withUnit:(NSString *)unit {
//
NSString *decimalString = decimal.stringValue;
NSArray<NSString *> *components = [decimalString componentsSeparatedByString:@"."];
NSString *integerPart = components.firstObject;
NSString *decimalPart = components.count > 1 ? components[1] : @"";
if (decimalPart.length > 1) {
decimalPart = [decimalPart substringToIndex:1]; //
}
if (decimalPart.length == 0 || [decimalPart isEqualToString:@"0"]) {
// 0
return [NSString stringWithFormat:@"%@%@", integerPart, unit];
} else {
//
return [NSString stringWithFormat:@"%@.%@%@", integerPart, decimalPart, unit];
}
}
+ (NSString *)formatResult:(NSDecimalNumber *)result withUnit:(NSString *)unit {
// NSDecimalNumber
CGFloat floatValue = result.floatValue;
//
NSString *formattedString = [NSString stringWithFormat:@"%.2f", floatValue];
// .00 .0
if ([formattedString hasSuffix:@".00"]) {
formattedString = [formattedString substringToIndex:formattedString.length - 3]; // ".00"
} else if ([formattedString hasSuffix:@".0"]) {
formattedString = [formattedString substringToIndex:formattedString.length - 2]; // ".0"
}
return [NSString stringWithFormat:@"%@%@", formattedString, unit];
}
+ (NSString *)stringWithTimeStamp:(NSString *)timeStamp {
//
NSTimeInterval second = timeStamp.longLongValue / 1000;
NSDate *date = [NSDate dateWithTimeIntervalSince1970:second];
//NSdate
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"];
// 1010
NSDateFormatter *timeFormatter = [[NSDateFormatter alloc] init];
[timeFormatter setDateFormat:@"HH:mm"];
// 218
NSDateFormatter *dayFormatter = [[NSDateFormatter alloc] init];
[dayFormatter setDateFormat:YMLocalizedString(@"NSString_Utils0")];
//
NSDateFormatter *yearFormatter = [[NSDateFormatter alloc] init];
[yearFormatter setDateFormat:YMLocalizedString(@"NSString_Utils1")];
//
NSTimeInterval timeInterval = [date timeIntervalSinceNow];
timeInterval = -timeInterval;
long temp = 0;
NSString *result;
BOOL isSameDay = [[NSCalendar currentCalendar] isDateInToday:date]; //
// A. timeInterval < 1
if (timeInterval < 60) {
return [NSString stringWithFormat:@"%@", YMLocalizedString(@"NSString_Utils2")];
// B. 1 timeInterval <60n
} else if((temp = timeInterval/60) < 60){
return [NSString stringWithFormat:YMLocalizedString(@"NSString_Utils3"),temp];
// C. n60xx:xx
} else if((temp = temp/60) < 24 && isSameDay){
return [timeFormatter stringFromDate:date];
// C. n60xx:xx
} else if((temp = temp/60) < 24 && !isSameDay){
return [dayFormatter stringFromDate:date];
// D. mm-dd
} else if((temp = temp/30) < 30){
return [dayFormatter stringFromDate:date];
} else {
// E. yyyy-mm-dd
return [yearFormatter stringFromDate:date];
}
return result;
}
+ (NSString *)calculateConstellationWithMonth:(long)time
{
NSString *astroString = YMLocalizedString(@"XPMineHeadView0");
NSString *astroFormat = @"102123444543";
NSString *result;
NSInteger month = [NSString getMonth:time];
NSInteger day = [NSString getDay:time];
if (month<1 || month>12 || day<1 || day>31){
return YMLocalizedString(@"XPMineHeadView1");
}
if(month==2 && day>29)
{
return YMLocalizedString(@"XPMineHeadView2");
}else if(month==4 || month==6 || month==9 || month==11) {
if (day>30) {
return YMLocalizedString(@"XPMineHeadView3");
}
}
result=[NSString stringWithFormat:@"%@",[astroString substringWithRange:NSMakeRange(month*2-(day < [[astroFormat substringWithRange:NSMakeRange((month-1), 1)] intValue] - (-19))*2,2)]];
return [NSString stringWithFormat:YMLocalizedString(@"XPMineHeadView6"),result];
}
///
+ (NSString *)getCalculateConstellationImageWithMonth:(long)time{
NSString *astroString = YMLocalizedString(@"XPMineHeadView0");
NSString *astroFormat = @"102123444543";
NSString *result;
NSInteger month = [self getMonth:time];
NSInteger day = [self getDay:time];
if (month<1 || month>12 || day<1 || day>31){
return @"";
}
if(month==2 && day>29)
{
return @"";
}else if(month==4 || month==6 || month==9 || month==11) {
if (day>30) {
return @"";
}
}
result=[NSString stringWithFormat:@"%@",[astroString substringWithRange:NSMakeRange(month*2-(day < [[astroFormat substringWithRange:NSMakeRange((month-1), 1)] intValue] - (-19))*2,2)]];
NSDictionary *starDic = @{YMLocalizedString(@"XPMineHeadView9"):@"pi_capricorn",YMLocalizedString(@"XPMineHeadView10"):@"pi_water_bottle",YMLocalizedString(@"XPMineHeadView11"):@"pi_pisces",YMLocalizedString(@"XPMineHeadView12"):@"pi_aries",YMLocalizedString(@"XPMineHeadView13"):@"pi_taurus",YMLocalizedString(@"XPMineHeadView14"):@"pi_gemini",YMLocalizedString(@"XPMineHeadView15"):@"pi_cancer",YMLocalizedString(@"XPMineHeadView16"):@"pi_lion",YMLocalizedString(@"XPMineHeadView17"):@"pi_virgin",YMLocalizedString(@"XPMineHeadView18"):@"pi_libra",YMLocalizedString(@"XPMineHeadView19"):@"pi_scorpion",YMLocalizedString(@"XPMineHeadView20"):@"pi_shooter"};
return starDic[result];
}
///
+ (NSString *)getCalculateConstellationTextWithMonth:(long)time{
NSString *astroString = YMLocalizedString(@"XPMineHeadView0");
NSString *astroFormat = @"102123444543";
NSString *result;
NSInteger month = [self getMonth:time];
NSInteger day = [self getDay:time];
if (month<1 || month>12 || day<1 || day>31){
return @"";
}
if(month==2 && day>29)
{
return @"";
}else if(month==4 || month==6 || month==9 || month==11) {
if (day>30) {
return @"";
}
}
result=[NSString stringWithFormat:@"%@",[astroString substringWithRange:NSMakeRange(month*2-(day < [[astroFormat substringWithRange:NSMakeRange((month-1), 1)] intValue] - (-19))*2,2)]];
return result;
}
+(NSInteger) getMonth:(long )time
{
NSDate *date = [NSDate dateWithTimeIntervalSince1970:time/1000];
NSCalendar* calendar = [NSCalendar currentCalendar];
NSDateComponents* components = [calendar components:NSCalendarUnitMonth fromDate:date];
NSInteger month = components.month;
return month;
}
+ (NSInteger) getDay:(long) time
{
NSDate *date = [NSDate dateWithTimeIntervalSince1970:time/1000];
NSCalendar* calendar = [NSCalendar currentCalendar];
NSDateComponents* components = [calendar components:NSCalendarUnitDay fromDate:date];
NSInteger day = components.day;
return day;
}
+(NSString *)getAgeWithBirth:(long)birth{
if (birth == 0) {
return @" ";
}
NSDateComponents *components1 = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate dateWithTimeIntervalSince1970:birth/1000]];
NSInteger brithDateYear = [components1 year];
NSInteger brithDateDay = [components1 day];
NSInteger brithDateMonth = [components1 month];
//
NSDateComponents *components2 = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]]; NSInteger currentDateYear = [components2 year];
NSInteger currentDateDay = [components2 day]; NSInteger currentDateMonth = [components2 month]; //
NSInteger iAge = currentDateYear - brithDateYear - 1;
if ((currentDateMonth > brithDateMonth) || (currentDateMonth == brithDateMonth && currentDateDay >= brithDateDay)) {
iAge++;
}
return [NSString stringWithFormat:@" %ld ", iAge];
}
///
+(NSString *)getCountryCode{
//
NSString *path = [[NSBundle mainBundle] pathForResource:@"pi_area_info" ofType:@"json"];
//
NSData *data = [[NSData alloc] initWithContentsOfFile:path];
// JSON
NSError *error = nil;
NSDictionary *codeData = [NSJSONSerialization JSONObjectWithData:data
options:NSJSONReadingMutableLeaves
error:&error];
if (error) {
// NSLog(@"JSON Parsing Error: %@", error.localizedDescription);
}
NSArray *codeList = [LoginAreaModel modelsWithArray:codeData[@"RECORDS"]];
NSString *mccCode = [YYUtility getMobileCountryCode];
NSString *countryCode = @"";
if([mccCode isEqualToString:@"65535"]) {
return @"+886";
}
for (LoginAreaModel *obj in codeList) {
if([mccCode isEqualToString:obj.mcc]){
countryCode = obj.code;
break;
}
}
if(countryCode.length == 0) {
return @"+886";
}
return [NSString stringWithFormat:@"+%@",countryCode];
}
+(NSString *)createUUID{
CFUUIDRef uuid;
CFStringRef uuidText;
uuid = CFUUIDCreate(NULL);
uuidText = CFUUIDCreateString(NULL, uuid);
NSString *time = [NSDate getNowTimeTimestamp];
NSString *result = [NSString stringWithFormat:@"%@%@",uuidText,time];
return [result MD5String];
}
+ (BOOL)isEmpty:(NSString *)string {
if (string == nil || [string isKindOfClass:[NSNull class]]) {
return YES;
}
NSString *trimmedString = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
return trimmedString.length == 0;
}
- (NSString *)pureURLString {
NSString *encodingUrl = [self stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet characterSetWithCharactersInString:@"`#%^{}\"[]|\\<> "].invertedSet];
return encodingUrl;//[self stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
// NSURLComponents *components = [NSURLComponents componentsWithString:self];
// components.query = [components.query stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
// return components.string;
}
+ (NSString *)stringByRemovingRedundantZeros:(NSString *)string {
// 1.
if (!string || string.length == 0) {
return string;
}
// 2.
if ([string rangeOfString:@"."].location == NSNotFound) {
return string; //
}
// 3. 使NSDecimalNumber
NSDecimalNumber *decimalNumber = [NSDecimalNumber decimalNumberWithString:string];
if ([decimalNumber isEqual:[NSDecimalNumber notANumber]]) {
return string; //
}
// 4. 2
NSDecimalNumberHandler *handler = [NSDecimalNumberHandler
decimalNumberHandlerWithRoundingMode:NSRoundPlain
scale:2
raiseOnExactness:NO
raiseOnOverflow:NO
raiseOnUnderflow:NO
raiseOnDivideByZero:NO];
// 5.
NSDecimalNumber *roundedNumber = [decimalNumber decimalNumberByRoundingAccordingToBehavior:handler];
// 6.
NSString *formattedString = [roundedNumber stringValue];
// 7.
NSArray *components = [formattedString componentsSeparatedByString:@"."];
NSString *integerPart = components[0];
// 8.
if (components.count < 2) {
return integerPart;
}
NSString *fractionalPart = components[1];
// 9.
if (fractionalPart.length == 0) {
return integerPart;
}
// 10. 0
NSUInteger lastNonZeroIndex = NSNotFound;
for (NSInteger i = fractionalPart.length - 1; i >= 0; i--) {
if ([fractionalPart characterAtIndex:i] != '0') {
lastNonZeroIndex = i;
break;
}
}
// 11. 0
if (lastNonZeroIndex == NSNotFound) {
return integerPart;
} else {
// 12.
NSString *trimmedFraction = [fractionalPart substringToIndex:lastNonZeroIndex + 1];
return [NSString stringWithFormat:@"%@.%@", integerPart, trimmedFraction];
}
}
//+ (NSString *)stringByRemovingRedundantZeros:(NSString *)string {
// if (![string containsString:@"."]) {
// return string; //
// }
//
// //
// NSArray *components = [string componentsSeparatedByString:@"."];
// if (components.count > 2) {
// return string; // ()
// }
//
// NSString *integerPart = components[0];
// NSString *fractionalPart = components.count > 1 ? components[1] : @"";
//
// if (fractionalPart.length == 0) {
// return integerPart; //
// }
//
// // 0
// NSInteger lastNonZeroIndex = -1;
// for (NSInteger i = fractionalPart.length - 1; i >= 0; i--) {
// if ([fractionalPart characterAtIndex:i] != '0') {
// lastNonZeroIndex = i;
// break;
// }
// }
//
// if (lastNonZeroIndex == -1) {
// return integerPart; // 0
// } else {
// //
// NSString *trimmedFractionalPart = [fractionalPart substringToIndex:lastNonZeroIndex + 1];
// return [NSString stringWithFormat:@"%@.%@", integerPart, trimmedFractionalPart];
// }
//}
+ (NSString *)trimString:(NSString *)input lengthLimit:(NSInteger)limit {
if (input.length <= limit) {
return input;
} else {
NSString *trimmedString = [input substringToIndex:limit];
return [trimmedString stringByAppendingString:@"..."];
}
}
/// URL
+ (BOOL)isValidImageURL:(NSString *)url {
if ([NSString isEmpty:url]) {
return NO;
}
NSString *lowercaseURL = url.lowercaseString;
NSArray *imageExtensions = @[@"png", @"jpg", @"jpeg", @"gif", @"webp", @"bmp", @"svg"];
for (NSString *extension in imageExtensions) {
if ([lowercaseURL hasSuffix:extension]) {
return YES;
}
}
return NO;
}
///
+ (BOOL)isImageFormat:(NSString *)url {
if ([NSString isEmpty:url]) {
return NO;
}
NSString *lowercaseURL = url.lowercaseString;
NSArray *imageExtensions = @[@".png", @".jpg", @".jpeg", @".gif", @".webp", @".bmp", @".svg"];
for (NSString *extension in imageExtensions) {
if ([lowercaseURL hasSuffix:extension]) {
return YES;
}
}
return NO;
}
@end