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:
21
YuMi/Tools/YYUtility/CarrierIdentifier.h
Normal file
21
YuMi/Tools/YYUtility/CarrierIdentifier.h
Normal file
@@ -0,0 +1,21 @@
|
||||
//
|
||||
// CarrierIdentifier.h
|
||||
// YYMobileFramework
|
||||
//
|
||||
// Created by wuwei on 14-5-30.
|
||||
// Copyright (c) 2014年 YY Inc. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
// 运营商类型
|
||||
typedef NS_ENUM(NSUInteger, CarrierIdentifier)
|
||||
{
|
||||
CarrierIdentifier_Unknown = 0, // 未知, 网络不可用(未插SIM卡/无信号/飞行模式)
|
||||
|
||||
CarrierIdentifier_ChinaMobile = 1, // 中国移动
|
||||
CarrierIdentifier_ChinaUnicom = 2, // 中国联通
|
||||
CarrierIdentifier_ChinaTelecom = 3, // 中国电信
|
||||
|
||||
CarrierIdentifier_Otherwise = 0x0000FFFF, // 其他运营商
|
||||
};
|
173
YuMi/Tools/YYUtility/YYUtility+App.m
Normal file
173
YuMi/Tools/YYUtility/YYUtility+App.m
Normal file
@@ -0,0 +1,173 @@
|
||||
//
|
||||
// YYUtility+App.m
|
||||
// YYMobileFramework
|
||||
//
|
||||
// Created by wuwei on 14-5-30.
|
||||
// Copyright (c) 2014年 YY Inc. All rights reserved.
|
||||
//
|
||||
|
||||
#import "YYUtility.h"
|
||||
#import <CoreTelephony/CTTelephonyNetworkInfo.h> //为判断网络制式的主要文件
|
||||
#import <CoreTelephony/CTCarrier.h> //添加获取客户端运营商 支持
|
||||
#import "ClientConfig.h"
|
||||
|
||||
|
||||
|
||||
|
||||
@implementation YYUtility (App)
|
||||
|
||||
+ (id)valueInPlistForKey:(NSString *)key{
|
||||
NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
|
||||
return [infoDictionary objectForKey:key];
|
||||
}
|
||||
|
||||
+ (NSString *)appVersion{
|
||||
static NSString *appVersion = nil;
|
||||
if (!appVersion) {
|
||||
appVersion = [self valueInPlistForKey:@"CFBundleShortVersionString"];
|
||||
}
|
||||
return appVersion;
|
||||
}
|
||||
+(NSString *)getLanguage{
|
||||
NSString *language = [[[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"] firstObject];
|
||||
return language;
|
||||
|
||||
}
|
||||
+ (NSString *)appName {
|
||||
#ifdef DEBUG
|
||||
NSString *isProduction = [[NSUserDefaults standardUserDefaults]valueForKey:@"kIsProductionEnvironment"];
|
||||
if([isProduction isEqualToString:@"YES"]){
|
||||
return @"youmi";
|
||||
}
|
||||
return @"molistar";
|
||||
|
||||
#else
|
||||
return @"youmi";
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
+ (NSString *)appBuild{
|
||||
static NSString *appBuild = nil;
|
||||
if (!appBuild) {
|
||||
appBuild = [self valueInPlistForKey:(NSString *)kCFBundleVersionKey];
|
||||
}
|
||||
return appBuild;
|
||||
}
|
||||
|
||||
+ (NSString *)appBundleId{
|
||||
static NSString *appBundleId = nil;
|
||||
if (!appBundleId) {
|
||||
appBundleId = [self valueInPlistForKey:(NSString *)kCFBundleIdentifierKey];
|
||||
}
|
||||
return appBundleId;
|
||||
}
|
||||
|
||||
|
||||
+ (NSString *)svnVersion{
|
||||
static NSString *svnVersion = nil;
|
||||
if (!svnVersion) {
|
||||
svnVersion = [self valueInPlistForKey:@"SvnBuildVersion"];
|
||||
}
|
||||
return svnVersion;
|
||||
}
|
||||
|
||||
static NSString * const kMobileFrameworkResourceBundleName = @"YYMobileFrameworkRes";
|
||||
|
||||
+ (NSURL *)URLForMobileFrameworkResourceBundle{
|
||||
return [[NSBundle mainBundle] URLForResource:kMobileFrameworkResourceBundleName
|
||||
withExtension:@"bundle"];
|
||||
}
|
||||
|
||||
+ (NSString *)pathForMobileFrameworkResourceBundle{
|
||||
return [[NSBundle mainBundle] pathForResource:kMobileFrameworkResourceBundleName
|
||||
ofType:@"bundle"];
|
||||
}
|
||||
|
||||
+ (NSString *)buildType{
|
||||
#ifdef DEBUG
|
||||
NSString *isProduction = [[NSUserDefaults standardUserDefaults]valueForKey:@"kIsProductionEnvironment"];
|
||||
if([isProduction isEqualToString:@"YES"]){
|
||||
return @"RELEASE";
|
||||
}
|
||||
return @"DEBUG";
|
||||
#else
|
||||
return @"RELEASE";
|
||||
#endif
|
||||
}
|
||||
|
||||
+ (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)fileURL{
|
||||
if (![[NSFileManager defaultManager] fileExistsAtPath:[fileURL path]]) {
|
||||
NSLog(@"File %@ dosen't exist!", fileURL);
|
||||
return NO;
|
||||
}
|
||||
|
||||
NSError *error = nil;
|
||||
BOOL result = [fileURL setResourceValue:[NSNumber numberWithBool:YES]
|
||||
forKey:NSURLIsExcludedFromBackupKey
|
||||
error:&error];
|
||||
if (!result) {
|
||||
NSLog(@"Error excluding '%@' from backup, error: %@.", fileURL, error);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static NSString *_from = nil;
|
||||
|
||||
+ (NSString *)getAppSource{
|
||||
if (_from == nil) {
|
||||
if (isEnterprise == NO) {
|
||||
_from = ISTestFlight ? PI_Test_Flight : @"molistar_enterprise"; // 企业包
|
||||
}else {
|
||||
_from = [ClientConfig shareConfig].isTF == YES ? PI_Test_Flight : PI_App_Source; // Test_Flight包或appstore App Store包
|
||||
}
|
||||
}
|
||||
|
||||
return _from;
|
||||
}
|
||||
|
||||
+ (BOOL)isFromAppStore{
|
||||
if([[[YYUtility getAppSource] lowercaseString] isEqualToString:@"appstore"]){
|
||||
return YES;
|
||||
}
|
||||
return NO;
|
||||
}
|
||||
|
||||
|
||||
+ (NSString *)removeSpaceAndNewline:(NSString *)str{
|
||||
NSString *temp = [str stringByReplacingOccurrencesOfString:@" " withString:@""];
|
||||
temp = [temp stringByReplacingOccurrencesOfString:@"\r" withString:@""];
|
||||
temp = [temp stringByReplacingOccurrencesOfString:@"\n" withString:@""];
|
||||
return temp;
|
||||
}
|
||||
/// 获取运营商信息
|
||||
+ (YYUtilityTelephonType)getOperatorInfomation {
|
||||
CTTelephonyNetworkInfo *info = [[CTTelephonyNetworkInfo alloc] init];
|
||||
//NSLog(@"info = %@", info);
|
||||
CTCarrier *carrier = [info subscriberCellularProvider];
|
||||
//NSLog(@"carrier = %@", carrier);
|
||||
if (carrier == nil) {
|
||||
return YYUtilityTelephonType_Link_Unknown;
|
||||
}
|
||||
NSString *code = [carrier mobileNetworkCode];
|
||||
if (code == nil) {
|
||||
return YYUtilityTelephonType_Link_Unknown;
|
||||
}
|
||||
if ([code isEqualToString:@"00"] || [code isEqualToString:@"02"] || [code isEqualToString:@"07"]) {
|
||||
return YYUtilityTelephonType_Move;
|
||||
} else if ([code isEqualToString:@"01"] || [code isEqualToString:@"06"]) {
|
||||
return YYUtilityTelephonType_Link_Together;
|
||||
} else if ([code isEqualToString:@"03"] || [code isEqualToString:@"05"]) {
|
||||
return YYUtilityTelephonType_Link_Telegraphy;
|
||||
} else if ([code isEqualToString:@"20"]) {
|
||||
return YYUtilityTelephonType_Link_Tietong;
|
||||
}
|
||||
return YYUtilityTelephonType_Link_Unknown;
|
||||
}
|
||||
|
||||
@end
|
97
YuMi/Tools/YYUtility/YYUtility+Carrier.m
Normal file
97
YuMi/Tools/YYUtility/YYUtility+Carrier.m
Normal file
@@ -0,0 +1,97 @@
|
||||
//
|
||||
// YYUtility+Carrier.m
|
||||
// YYFoundation
|
||||
//
|
||||
// Created by wuwei on 14-5-30.
|
||||
// Copyright (c) 2014年 YY Inc. All rights reserved.
|
||||
//
|
||||
|
||||
#import "YYUtility.h"
|
||||
#import <CoreTelephony/CTCarrier.h>
|
||||
#import <CoreTelephony/CTTelephonyNetworkInfo.h>
|
||||
#import "CarrierIdentifier.h"
|
||||
@import CoreTelephony;
|
||||
|
||||
/*
|
||||
* The most update-to-date list of MNC&MCC is fetched
|
||||
* from the website below: http://www.mcc-mnc.com
|
||||
*/
|
||||
// MCCs
|
||||
static NSString * const kMobileCountryCode_China = @"460"; // 中国
|
||||
|
||||
// MNCs
|
||||
static NSSet * kMobileNetworkCodes_ChinaMobile; // 移动
|
||||
static NSSet * kMobileNetworkCodes_ChinaUnicom; // 联通
|
||||
static NSSet * kMobileNetworkCodes_ChinaTelecom; // 电信
|
||||
|
||||
@implementation YYUtility (Carrier)
|
||||
|
||||
+ (void)load
|
||||
{
|
||||
if (self == [YYUtility self]) {
|
||||
kMobileNetworkCodes_ChinaMobile = [NSSet setWithObjects:@"00", @"02", @"07", nil]; // 中国移动
|
||||
kMobileNetworkCodes_ChinaUnicom = [NSSet setWithObjects:@"01", @"06", nil]; // 中国联通
|
||||
kMobileNetworkCodes_ChinaTelecom = [NSSet setWithObjects:@"03", @"05", nil]; // 中国电信
|
||||
}
|
||||
}
|
||||
|
||||
+ (NSString *)carrierName
|
||||
{
|
||||
return [self carrier].carrierName;
|
||||
}
|
||||
|
||||
+ (NSInteger)carrierIdentifier
|
||||
{
|
||||
return [self identifierOfCarrier:[self carrier]];
|
||||
}
|
||||
|
||||
+ (CTCarrier *)carrier
|
||||
{
|
||||
return [[CTTelephonyNetworkInfo alloc] init].subscriberCellularProvider;
|
||||
}
|
||||
+(NSString *)getMobileCountryCode{
|
||||
CTCarrier *carrier = [[CTTelephonyNetworkInfo alloc] init].subscriberCellularProvider;
|
||||
NSString *code = carrier.mobileCountryCode;
|
||||
return code;
|
||||
}
|
||||
+ (NSInteger)identifierOfCarrier:(CTCarrier *)carrier
|
||||
{
|
||||
// CTTelephonyNetworkInfo *networkInfo = [[CTTelephonyNetworkInfo alloc] init];
|
||||
// if (@available(iOS 16, *)) {
|
||||
// carrier = networkInfo.serviceSubscriberCellularProviders;
|
||||
// }
|
||||
|
||||
CarrierIdentifier identifier = CarrierIdentifier_Unknown;
|
||||
do {
|
||||
if (carrier.mobileCountryCode == nil || carrier.mobileNetworkCode == nil)
|
||||
{
|
||||
identifier = CarrierIdentifier_Unknown;
|
||||
break;
|
||||
}
|
||||
|
||||
if ([carrier.mobileCountryCode isEqualToString:kMobileCountryCode_China])
|
||||
{
|
||||
if ([kMobileNetworkCodes_ChinaMobile containsObject:carrier.mobileNetworkCode])
|
||||
{
|
||||
identifier = CarrierIdentifier_ChinaMobile;
|
||||
break;
|
||||
}
|
||||
else if ([kMobileNetworkCodes_ChinaUnicom containsObject:carrier.mobileNetworkCode])
|
||||
{
|
||||
identifier = CarrierIdentifier_ChinaUnicom;
|
||||
break;
|
||||
}
|
||||
else if ([kMobileNetworkCodes_ChinaTelecom containsObject:carrier.mobileNetworkCode])
|
||||
{
|
||||
identifier = CarrierIdentifier_ChinaTelecom;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
identifier = CarrierIdentifier_Otherwise;
|
||||
|
||||
} while (0);
|
||||
|
||||
return identifier;
|
||||
}
|
||||
@end
|
488
YuMi/Tools/YYUtility/YYUtility+Device.m
Normal file
488
YuMi/Tools/YYUtility/YYUtility+Device.m
Normal file
@@ -0,0 +1,488 @@
|
||||
//
|
||||
// YYUtility+Device.m
|
||||
// YYMobileFramework
|
||||
//
|
||||
// Created by wuwei on 14-5-30.
|
||||
// Copyright (c) 2014年 YY Inc. All rights reserved.
|
||||
//
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
#import <AVFoundation/AVFoundation.h>
|
||||
#import <AssetsLibrary/AssetsLibrary.h>
|
||||
|
||||
#import "YYUtility.h"
|
||||
#import <sys/utsname.h>
|
||||
#import <arpa/inet.h>
|
||||
#import <net/if.h>
|
||||
#import <ifaddrs.h>
|
||||
#import "YYReachability.h"
|
||||
#import <AdSupport/ASIdentifierManager.h>
|
||||
|
||||
#import <ifaddrs.h>
|
||||
#import <net/if_dl.h>
|
||||
#import <sys/socket.h>
|
||||
#import "SSKeychain.h"
|
||||
#import "GCDHelper.h"
|
||||
|
||||
|
||||
#if !defined(IFT_ETHER)
|
||||
#define IFT_ETHER 0x6
|
||||
#endif
|
||||
|
||||
#define kIOSCellular @"pdp_ip0"
|
||||
#define kIOSWifi @"en0"
|
||||
#define kIPAddrV4 @"ipv4"
|
||||
#define kIPAddrV6 @"ipv6"
|
||||
#define kAppName @"yym51ip"
|
||||
|
||||
@implementation YYUtility (Device)
|
||||
|
||||
+ (NSString *)modelName
|
||||
{
|
||||
static NSString *modelName = nil;
|
||||
if (!modelName) {
|
||||
struct utsname systemInfo;
|
||||
uname(&systemInfo);
|
||||
modelName = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
|
||||
}
|
||||
return modelName;
|
||||
}
|
||||
|
||||
+ (NSString *)systemVersion
|
||||
{
|
||||
// 调用非常频繁,主要在cleanSpecialText中
|
||||
static NSString* _systemVersion = nil;
|
||||
static dispatch_once_t onceToken;
|
||||
dispatch_once(&onceToken, ^{
|
||||
_systemVersion = [UIDevice currentDevice].systemVersion;;
|
||||
});
|
||||
|
||||
if (_systemVersion) {
|
||||
return _systemVersion;
|
||||
}
|
||||
|
||||
return [UIDevice currentDevice].systemVersion;
|
||||
}
|
||||
|
||||
+ (NSString *)identifierForVendor
|
||||
{
|
||||
static NSString *idfv = nil;
|
||||
if (!idfv) {
|
||||
idfv = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
|
||||
}
|
||||
return idfv;
|
||||
}
|
||||
|
||||
+ (NSString *)deviceID
|
||||
{
|
||||
NSString *deviceID = @"";
|
||||
if (!deviceID || deviceID.length == 0) {
|
||||
deviceID = [YYUtility identifierForVendor];
|
||||
}
|
||||
|
||||
if (!deviceID) {
|
||||
deviceID = @"";
|
||||
}
|
||||
|
||||
return deviceID;
|
||||
}
|
||||
|
||||
+ (NSInteger)networkStatus
|
||||
{
|
||||
return (self.reachability.currentReachabilityStatus);
|
||||
}
|
||||
|
||||
+ (YYReachability *)reachability
|
||||
{
|
||||
static YYReachability *reachability = nil;
|
||||
static dispatch_once_t onceToken;
|
||||
dispatch_once(&onceToken, ^{
|
||||
reachability = [YYReachability reachabilityForInternetConnection];
|
||||
});
|
||||
return reachability;
|
||||
}
|
||||
|
||||
|
||||
+ (void)checkCameraAvailable:(void (^)(void))available denied:(void(^)(void))denied restriction:(void(^)(void))restriction
|
||||
{
|
||||
available = available ? : ^{};
|
||||
denied = denied ? : ^{};
|
||||
restriction = restriction ? : ^{};
|
||||
|
||||
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
|
||||
{
|
||||
// iOS7下,需要检查iPhone的隐私和访问限制项
|
||||
AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
|
||||
switch (authStatus) {
|
||||
case AVAuthorizationStatusAuthorized:
|
||||
{
|
||||
available();
|
||||
break;
|
||||
}
|
||||
case AVAuthorizationStatusDenied:
|
||||
{
|
||||
// [设置->隐私->相机]中禁止了YY访问相机
|
||||
denied();
|
||||
break;
|
||||
}
|
||||
case AVAuthorizationStatusRestricted:
|
||||
{
|
||||
// NOTE: 这个跟[设置-通用-访问限制]似乎没有关系
|
||||
restriction();
|
||||
break;
|
||||
}
|
||||
case AVAuthorizationStatusNotDetermined:
|
||||
{
|
||||
[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
|
||||
|
||||
dispatch_main_sync_safe(^{
|
||||
if (granted)
|
||||
{
|
||||
available();
|
||||
}
|
||||
else
|
||||
{
|
||||
denied();
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
}];
|
||||
}
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
restriction();
|
||||
}
|
||||
}
|
||||
|
||||
+ (void)checkAssetsLibrayAvailable:(void (^)(void))available denied:(void(^)(void))denied restriction:(void(^)(void))restriction
|
||||
{
|
||||
available = available ? : ^{};
|
||||
denied = denied ? : ^{};
|
||||
restriction = restriction ? : ^{};
|
||||
|
||||
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary] ||
|
||||
[UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum]) {
|
||||
ALAuthorizationStatus author = [ALAssetsLibrary authorizationStatus];
|
||||
if (author == ALAuthorizationStatusNotDetermined) {
|
||||
ALAssetsLibrary *assetLibrary = [[ALAssetsLibrary alloc] init];
|
||||
[assetLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
|
||||
if (*stop) {
|
||||
available();
|
||||
return;
|
||||
}
|
||||
*stop = TRUE;
|
||||
} failureBlock:^(NSError *error) {
|
||||
denied();
|
||||
}];
|
||||
}else if (author == ALAuthorizationStatusDenied) {
|
||||
denied();
|
||||
}else if(author == ALAuthorizationStatusRestricted) {
|
||||
restriction();
|
||||
}else if(author == ALAuthorizationStatusAuthorized) {
|
||||
available();
|
||||
}
|
||||
}else {
|
||||
restriction();
|
||||
}
|
||||
}
|
||||
|
||||
+ (void)checkMicPrivacy:(void(^)(BOOL succeed))resultBlock
|
||||
{
|
||||
[[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL granted) {
|
||||
if (resultBlock) {
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
resultBlock(granted);
|
||||
});
|
||||
}
|
||||
}];
|
||||
}
|
||||
|
||||
+ (NSString *)deviceUniqueIdentification {
|
||||
// SSKeychain
|
||||
NSString * currentDeviceUUIDStr = [SSKeychain passwordForService:@" " account:@"uuid"];
|
||||
if (currentDeviceUUIDStr == nil || [currentDeviceUUIDStr isEqualToString:@""])
|
||||
{
|
||||
NSUUID * currentDeviceUUID = [UIDevice currentDevice].identifierForVendor;
|
||||
currentDeviceUUIDStr = currentDeviceUUID.UUIDString;
|
||||
currentDeviceUUIDStr = [currentDeviceUUIDStr stringByReplacingOccurrencesOfString:@"-" withString:@""];
|
||||
currentDeviceUUIDStr = [currentDeviceUUIDStr lowercaseString];
|
||||
[SSKeychain setPassword: currentDeviceUUIDStr forService:@" "account:@"uuid"];
|
||||
}
|
||||
return currentDeviceUUIDStr;
|
||||
}
|
||||
|
||||
+ (NSString *)ipAddress
|
||||
{
|
||||
return [self ipAddress:YES];
|
||||
}
|
||||
|
||||
+ (NSString *)ipAddress:(BOOL)preferIPv4
|
||||
{
|
||||
NSArray *searchArray = preferIPv4 ?
|
||||
@[ kIOSWifi @"/" kIPAddrV4, kIOSWifi @"/" kIPAddrV6, kIOSCellular @"/" kIPAddrV4, kIOSCellular @"/" kIPAddrV6 ] :
|
||||
@[ kIOSWifi @"/" kIPAddrV6, kIOSWifi @"/" kIPAddrV4, kIOSCellular @"/" kIPAddrV6, kIOSCellular @"/" kIPAddrV4 ] ;
|
||||
|
||||
NSDictionary *addresses = [self getIpAddresses];
|
||||
|
||||
__block NSString *addr;
|
||||
[searchArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
|
||||
addr = addresses[obj];
|
||||
if (addr) {
|
||||
*stop = YES;
|
||||
}
|
||||
}];
|
||||
return addr ? : @"0.0.0.0";
|
||||
}
|
||||
|
||||
+ (NSDictionary *)getIpAddresses
|
||||
{
|
||||
NSMutableDictionary *addresses = [NSMutableDictionary dictionary];
|
||||
|
||||
// retrieve the current interfaces - return 0 on success
|
||||
struct ifaddrs *interfaces;
|
||||
if (!getifaddrs(&interfaces)) {
|
||||
// Loop through linked list of interfaces
|
||||
struct ifaddrs *interface;
|
||||
for (interface = interfaces; interface; interface = interface->ifa_next) {
|
||||
if (!(interface -> ifa_flags & IFF_UP)) {
|
||||
continue;
|
||||
}
|
||||
const struct sockaddr_in *addr = (const struct sockaddr_in *)interface->ifa_addr;
|
||||
char addrBuf[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 2];
|
||||
if (addr && (addr->sin_family == AF_INET || addr->sin_family == AF_INET6)) {
|
||||
NSString *ifaName = [NSString stringWithUTF8String:interface->ifa_name];
|
||||
NSString *ifaType;
|
||||
if (addr->sin_family == AF_INET) {
|
||||
if (inet_ntop(AF_INET, &addr->sin_addr, addrBuf, INET_ADDRSTRLEN)) {
|
||||
ifaType = kIPAddrV4;
|
||||
}
|
||||
} else {
|
||||
const struct sockaddr_in6 *addr6 = (const struct sockaddr_in6 *)interface->ifa_addr;
|
||||
if (inet_ntop(AF_INET6, &addr6->sin6_addr, addrBuf, INET6_ADDRSTRLEN)) {
|
||||
ifaType = kIPAddrV6;
|
||||
}
|
||||
}
|
||||
if (ifaType) {
|
||||
NSString *key = [NSString stringWithFormat:@"%@/%@", ifaName, ifaType];
|
||||
addresses[key] = [NSString stringWithUTF8String:addrBuf];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// free memory
|
||||
freeifaddrs(interfaces);
|
||||
return addresses;
|
||||
}
|
||||
|
||||
+ (NSString *)macAddresss
|
||||
{
|
||||
static NSMutableString *macAddress = nil;
|
||||
|
||||
if ([macAddress length] > 0) {
|
||||
return macAddress;
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
struct ifaddrs* addrs;
|
||||
if ( getifaddrs( &addrs ) )
|
||||
break;
|
||||
|
||||
const struct ifaddrs *cursor = addrs;
|
||||
while ( cursor )
|
||||
{
|
||||
if ( ( cursor->ifa_addr->sa_family == AF_LINK )
|
||||
&& strcmp( "en0", cursor->ifa_name ) == 0
|
||||
&& ( ( ( const struct sockaddr_dl * )cursor->ifa_addr)->sdl_type == IFT_ETHER ) )
|
||||
{
|
||||
const struct sockaddr_dl *dlAddr = ( const struct sockaddr_dl * )cursor->ifa_addr;
|
||||
const uint8_t *base = ( const uint8_t * )&dlAddr->sdl_data[dlAddr->sdl_nlen];
|
||||
|
||||
macAddress = [[NSMutableString alloc] initWithCapacity:64];
|
||||
|
||||
for ( int i = 0; i < dlAddr->sdl_alen; i++ )
|
||||
{
|
||||
if (i > 0) {
|
||||
[macAddress appendFormat:@"])%02X", base[i]];
|
||||
}
|
||||
else
|
||||
{
|
||||
[macAddress appendFormat:@"%02X", base[i]];
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
cursor = cursor->ifa_next;
|
||||
}
|
||||
freeifaddrs(addrs);
|
||||
} while (NO);
|
||||
|
||||
if (macAddress == nil) {
|
||||
macAddress = [NSMutableString stringWithString:@""];
|
||||
}
|
||||
|
||||
return macAddress;
|
||||
}
|
||||
|
||||
+ (NSString *)idfa
|
||||
{
|
||||
static NSString *idfa = nil;
|
||||
if (!idfa) {
|
||||
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 6.0) {
|
||||
idfa = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
|
||||
} else {
|
||||
idfa = @"";
|
||||
}
|
||||
}
|
||||
return idfa;
|
||||
}
|
||||
|
||||
|
||||
+ (NSString*)modelType {
|
||||
|
||||
struct utsname systemInfo;
|
||||
|
||||
uname(&systemInfo);
|
||||
|
||||
NSString*platform = [NSString stringWithCString: systemInfo.machine encoding:NSASCIIStringEncoding];
|
||||
|
||||
if ([platform isEqualToString:@"iPhone1,1"]) return @"iPhone 2G";
|
||||
if ([platform isEqualToString:@"iPhone1,2"]) return @"iPhone 3G";
|
||||
if ([platform isEqualToString:@"iPhone2,1"]) return @"iPhone 3GS";
|
||||
if ([platform isEqualToString:@"iPhone3,1"]) return @"iPhone 4";
|
||||
if ([platform isEqualToString:@"iPhone3,2"]) return @"iPhone 4";
|
||||
if ([platform isEqualToString:@"iPhone3,3"]) return @"iPhone 4";
|
||||
if ([platform isEqualToString:@"iPhone4,1"]) return @"iPhone 4S";
|
||||
if ([platform isEqualToString:@"iPhone5,1"]) return @"iPhone 5";
|
||||
if ([platform isEqualToString:@"iPhone5,2"]) return @"iPhone 5";
|
||||
if ([platform isEqualToString:@"iPhone5,3"]) return @"iPhone 5c";
|
||||
if ([platform isEqualToString:@"iPhone5,4"]) return @"iPhone 5c";
|
||||
if ([platform isEqualToString:@"iPhone6,1"]) return @"iPhone 5s";
|
||||
if ([platform isEqualToString:@"iPhone6,2"]) return @"iPhone 5s";
|
||||
if ([platform isEqualToString:@"iPhone7,1"]) return @"iPhone 6 Plus";
|
||||
if ([platform isEqualToString:@"iPhone7,2"]) return @"iPhone 6";
|
||||
if ([platform isEqualToString:@"iPhone8,1"]) return @"iPhone 6s";
|
||||
if ([platform isEqualToString:@"iPhone8,2"]) return @"iPhone 6s Plus";
|
||||
if ([platform isEqualToString:@"iPhone8,4"]) return @"iPhone SE";
|
||||
if ([platform isEqualToString:@"iPhone9,1"]) return @"iPhone 7";
|
||||
if ([platform isEqualToString:@"iPhone9,2"]) return @"iPhone 7 Plus";
|
||||
if([platform isEqualToString:@"iPhone10,1"]) return @"iPhone 8";
|
||||
if([platform isEqualToString:@"iPhone10,4"]) return @"iPhone 8";
|
||||
if([platform isEqualToString:@"iPhone10,2"]) return @"iPhone 8 Plus";
|
||||
if([platform isEqualToString:@"iPhone10,5"]) return @"iPhone 8 Plus";
|
||||
if([platform isEqualToString:@"iPhone10,3"]) return @"iPhone X";
|
||||
if([platform isEqualToString:@"iPhone10,6"]) return @"iPhone X";
|
||||
if ([platform isEqualToString:@"iPhone11,8"]) return @"iPhone XR";
|
||||
if ([platform isEqualToString:@"iPhone11,2"]) return @"iPhone XS";
|
||||
if ([platform isEqualToString:@"iPhone11,6"]) return @"iPhone XS Max";
|
||||
if ([platform isEqualToString:@"iPhone11,4"]) return @"iPhone XS Max";
|
||||
if ([platform isEqualToString:@"iPhone12,1"]) return @"iPhone 11";
|
||||
if ([platform isEqualToString:@"iPhone12,3"]) return @"iPhone 11 Pro";
|
||||
if ([platform isEqualToString:@"iPhone12,5"]) return @"iPhone 11 Pro Max";
|
||||
if ([platform isEqualToString:@"iPhone12,8"]) return @"iPhone SE(2nd generation)";
|
||||
if ([platform isEqualToString:@"iPhone13,1"]) return @"iPhone 12 mini";
|
||||
if ([platform isEqualToString:@"iPhone13,2"]) return @"iPhone 12";
|
||||
if ([platform isEqualToString:@"iPhone13,3"]) return @"iPhone 12 Pro";
|
||||
if ([platform isEqualToString:@"iPhone13,4"]) return @"iPhone 12 Pro Max";
|
||||
if ([platform isEqualToString:@"iPhone14,4"]) return @"iPhone 13 mini";
|
||||
if ([platform isEqualToString:@"iPhone14,5"]) return @"iPhone 13";
|
||||
if ([platform isEqualToString:@"iPhone14,2"]) return @"iPhone 13 Pro";
|
||||
if ([platform isEqualToString:@"iPhone14,3"]) return @"iPhone 13 Pro Max";
|
||||
if ([platform isEqualToString:@"iPhone14,6"]) return @"iPhone SE (3rd generation)";
|
||||
if ([platform isEqualToString:@"iPhone14,7"]) return @"iPhone 14";
|
||||
if ([platform isEqualToString:@"iPhone14,8"]) return @"iPhone 14 Plus";
|
||||
if ([platform isEqualToString:@"iPhone15,2"]) return @"iPhone 14 Pro";
|
||||
if ([platform isEqualToString:@"iPhone15,3"]) return @"iPhone 14 Pro Max";
|
||||
if ([platform isEqualToString:@"iPhone15,4"]) return @"iPhone 15";
|
||||
if ([platform isEqualToString:@"iPhone15,5"]) return @"iPhone 15 Plus";
|
||||
if ([platform isEqualToString:@"iPhone16,1"]) return @"iPhone 15 Pro";
|
||||
if ([platform isEqualToString:@"iPhone16,2"]) return @"iPhone 15 Pro Max";
|
||||
if ([platform isEqualToString:@"iPod1,1"]) return @"iPod Touch 1G";
|
||||
if ([platform isEqualToString:@"iPod2,1"]) return @"iPod Touch 2G";
|
||||
if ([platform isEqualToString:@"iPod3,1"]) return @"iPod Touch 3G";
|
||||
if ([platform isEqualToString:@"iPod4,1"]) return @"iPod Touch 4G";
|
||||
if ([platform isEqualToString:@"iPod5,1"]) return @"iPod Touch 5G";
|
||||
if ([platform isEqualToString:@"iPad1,1"]) return @"iPad 1G";
|
||||
if ([platform isEqualToString:@"iPad2,1"]) return @"iPad 2";
|
||||
if ([platform isEqualToString:@"iPad2,2"]) return @"iPad 2";
|
||||
if ([platform isEqualToString:@"iPad2,3"]) return @"iPad 2";
|
||||
if ([platform isEqualToString:@"iPad2,4"]) return @"iPad 2";
|
||||
if ([platform isEqualToString:@"iPad2,5"]) return @"iPad Mini 1G";
|
||||
if ([platform isEqualToString:@"iPad2,6"]) return @"iPad Mini 1G";
|
||||
if ([platform isEqualToString:@"iPad2,7"]) return @"iPad Mini 1G";
|
||||
if ([platform isEqualToString:@"iPad3,1"]) return @"iPad 3";
|
||||
if ([platform isEqualToString:@"iPad3,2"]) return @"iPad 3";
|
||||
if ([platform isEqualToString:@"iPad3,3"]) return @"iPad 3";
|
||||
if ([platform isEqualToString:@"iPad3,4"]) return @"iPad 4";
|
||||
if ([platform isEqualToString:@"iPad3,5"]) return @"iPad 4";
|
||||
if ([platform isEqualToString:@"iPad3,6"]) return @"iPad 4";
|
||||
if ([platform isEqualToString:@"iPad4,1"]) return @"iPad Air";
|
||||
if ([platform isEqualToString:@"iPad4,2"]) return @"iPad Air";
|
||||
if ([platform isEqualToString:@"iPad4,3"]) return @"iPad Air";
|
||||
if ([platform isEqualToString:@"iPad4,4"]) return @"iPad Mini 2G";
|
||||
if ([platform isEqualToString:@"iPad4,5"]) return @"iPad Mini 2G";
|
||||
if ([platform isEqualToString:@"iPad4,6"]) return @"iPad Mini 2G";
|
||||
if ([platform isEqualToString:@"i386"]) return @"iPhone Simulator";
|
||||
if ([platform isEqualToString:@"x86_64"]) return @"iPhone Simulator";
|
||||
return platform;
|
||||
|
||||
}
|
||||
|
||||
// 当前设备是否低于, 等于 iPhone6
|
||||
+ (BOOL)isIphone6AndLow {
|
||||
struct utsname systemInfo;
|
||||
|
||||
uname(&systemInfo);
|
||||
|
||||
NSString*platform = [NSString stringWithCString: systemInfo.machine encoding:NSASCIIStringEncoding];
|
||||
if([platform isEqualToString:@"iPhone1,1"])return YES;
|
||||
|
||||
if([platform isEqualToString:@"iPhone1,2"])return YES;
|
||||
|
||||
if([platform isEqualToString:@"iPhone2,1"])return YES;
|
||||
|
||||
if([platform isEqualToString:@"iPhone3,1"])return YES;
|
||||
|
||||
if([platform isEqualToString:@"iPhone3,2"])return YES;
|
||||
|
||||
if([platform isEqualToString:@"iPhone3,3"])return YES;
|
||||
|
||||
if([platform isEqualToString:@"iPhone4,1"])return YES;
|
||||
|
||||
if([platform isEqualToString:@"iPhone5,1"])return YES;
|
||||
|
||||
if([platform isEqualToString:@"iPhone5,2"])return YES;
|
||||
|
||||
if([platform isEqualToString:@"iPhone5,3"])return YES;
|
||||
|
||||
if([platform isEqualToString:@"iPhone5,4"])return YES;
|
||||
|
||||
if([platform isEqualToString:@"iPhone6,1"])return YES;
|
||||
|
||||
if([platform isEqualToString:@"iPhone6,2"])return YES;
|
||||
|
||||
if([platform isEqualToString:@"iPhone7,1"])return YES;
|
||||
|
||||
if([platform isEqualToString:@"iPhone7,2"])return YES;
|
||||
|
||||
if ([platform isEqualToString:@"iPhone8,1"]) return YES;
|
||||
|
||||
if ([platform isEqualToString:@"iPhone8,3"]) return YES;
|
||||
|
||||
if ([platform isEqualToString:@"iPhone8,4"]) return YES;
|
||||
|
||||
if ([platform isEqualToString:@"iPhone9,1"]) return YES;
|
||||
|
||||
if ([platform isEqualToString:@"iPhone9,3"]) return YES;
|
||||
|
||||
return NO;
|
||||
}
|
||||
|
||||
@end
|
232
YuMi/Tools/YYUtility/YYUtility.h
Normal file
232
YuMi/Tools/YYUtility/YYUtility.h
Normal file
@@ -0,0 +1,232 @@
|
||||
//
|
||||
// YYUtility.h
|
||||
// YYMobileFramework
|
||||
//
|
||||
// Created by wuwei on 14/6/11.
|
||||
// Copyright (c) 2014年 YY.inc. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
typedef enum : NSUInteger {
|
||||
YYUtilityTelephonType_Move = 0,///移动
|
||||
YYUtilityTelephonType_Link_Together,///联通
|
||||
YYUtilityTelephonType_Link_Telegraphy,///电信
|
||||
YYUtilityTelephonType_Link_Tietong,///铁通
|
||||
YYUtilityTelephonType_Link_Unknown,///不知道的运营商
|
||||
} YYUtilityTelephonType;
|
||||
@class CTCarrier;
|
||||
|
||||
@interface YYUtility : NSObject
|
||||
|
||||
@end
|
||||
|
||||
/*==============================*/
|
||||
/* App Utilities */
|
||||
/*==============================*/
|
||||
@interface YYUtility (App)
|
||||
|
||||
/**
|
||||
* 从YYMobile-Info.plist中读取字段
|
||||
*
|
||||
* @param key 键
|
||||
*
|
||||
* @return 值
|
||||
*/
|
||||
+ (id)valueInPlistForKey:(NSString *)key;
|
||||
|
||||
/**
|
||||
* 获取App版本号, 从plist从读取CFBundleShortVersion
|
||||
*/
|
||||
+ (NSString *)appVersion;
|
||||
+(NSString *)getLanguage;
|
||||
/**
|
||||
* 获取AppBuild号, 从plist中读取CFBundleVersion
|
||||
*/
|
||||
+ (NSString *)appBuild;
|
||||
|
||||
/**
|
||||
* 当前构建出的版本在svn中的版本号
|
||||
*/
|
||||
+ (NSString *)svnVersion;
|
||||
|
||||
/**
|
||||
获取appName
|
||||
|
||||
@return app的名称
|
||||
*/
|
||||
+ (NSString *)appName;
|
||||
|
||||
/**
|
||||
* 获取bundle id
|
||||
*
|
||||
* @return bundle id
|
||||
*/
|
||||
+ (NSString *)appBundleId;
|
||||
|
||||
/**
|
||||
* 获取YYMobileFrameworkRes.bundle的URL
|
||||
*/
|
||||
+ (NSURL *)URLForMobileFrameworkResourceBundle;
|
||||
|
||||
/**
|
||||
* 获取YYMobileFrameworkRes.bundle的路径
|
||||
*/
|
||||
+ (NSString *)pathForMobileFrameworkResourceBundle;
|
||||
|
||||
+ (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)fileURL;
|
||||
|
||||
/**
|
||||
* 获取当前的构建类型(DEBUG/RELEASE)
|
||||
*
|
||||
* @return 构建类型
|
||||
*/
|
||||
+ (NSString *)buildType;
|
||||
|
||||
/**
|
||||
* 获取平台渠道
|
||||
*/
|
||||
+ (NSString *)getAppSource;
|
||||
|
||||
/**
|
||||
* 是否来自appstore
|
||||
*/
|
||||
+ (BOOL)isFromAppStore;
|
||||
/// 获取运营商信息
|
||||
+ (YYUtilityTelephonType)getOperatorInfomation;
|
||||
@end
|
||||
|
||||
/*==============================*/
|
||||
/* Carrier Utilities */
|
||||
/*==============================*/
|
||||
@interface YYUtility (Carrier)
|
||||
+(NSString *)getMobileCountryCode;
|
||||
|
||||
/**
|
||||
获取设备唯一标识
|
||||
|
||||
@return 唯一标识
|
||||
*/
|
||||
+ (NSString *)deviceUniqueIdentification;
|
||||
|
||||
/**
|
||||
* 获取运营商
|
||||
*/
|
||||
+ (CTCarrier *)carrier;
|
||||
|
||||
/**
|
||||
* 获取运营商类型
|
||||
*/
|
||||
+ (NSInteger)carrierIdentifier;
|
||||
|
||||
/**
|
||||
* 获取运营商名称
|
||||
*/
|
||||
+ (NSString *)carrierName;
|
||||
|
||||
/**
|
||||
* 从CTCarrier对象获取网络类型
|
||||
* @param carrier - CTCarrier对象
|
||||
* @return CarrierType
|
||||
*/
|
||||
+ (NSInteger)identifierOfCarrier:(CTCarrier *)carrier;
|
||||
|
||||
@end
|
||||
|
||||
/*==============================*/
|
||||
/* Device Utilities */
|
||||
/*==============================*/
|
||||
@interface YYUtility (Device)
|
||||
|
||||
/**
|
||||
* 获取modelName, 如iPhone5,2
|
||||
*/
|
||||
+ (NSString *)modelName;
|
||||
|
||||
|
||||
/**
|
||||
获取设备类型
|
||||
|
||||
@return 设备类型
|
||||
*/
|
||||
+ (NSString*)modelType;
|
||||
|
||||
/**
|
||||
* 获取系统版本
|
||||
*/
|
||||
+ (NSString *)systemVersion;
|
||||
|
||||
/**
|
||||
* 获取当前设备的 IDFV,IDFV 在某些情况下会变,不建议将其作为设备标识
|
||||
*/
|
||||
+ (NSString *)identifierForVendor NS_AVAILABLE_IOS(6_0);
|
||||
|
||||
/**
|
||||
* 获取当前的设备标识,会使用海度 SDK 中的 OpenUDID
|
||||
*
|
||||
* @return 海度 SDK 缓存的 OpenUDID
|
||||
*/
|
||||
+ (NSString *)deviceID;
|
||||
|
||||
/**
|
||||
* 获取当前网络状态
|
||||
*/
|
||||
+ (NSInteger)networkStatus;
|
||||
|
||||
/**
|
||||
* 获取当前IP地址
|
||||
*/
|
||||
+ (NSString *)ipAddress;
|
||||
|
||||
/**
|
||||
* 获取当前IP地址
|
||||
*
|
||||
* @param preferIPv4 优先取IPv4的地址
|
||||
*/
|
||||
+ (NSString *)ipAddress:(BOOL)preferIPv4;
|
||||
|
||||
/**
|
||||
* 检查Camera是否可用, 可用则调用available; 若隐私设置中禁用了本app对相机
|
||||
* 的访问, 则调用denied; 否则视为被限制, 调用restriction
|
||||
*
|
||||
* @param available 可用
|
||||
* @param denied 不可用
|
||||
* @param restriction 受限制
|
||||
*/
|
||||
+ (void)checkCameraAvailable:(void (^)(void))available denied:(void(^)(void))denied restriction:(void(^)(void))restriction;
|
||||
|
||||
/**
|
||||
* 检查相册是否可用, 可用则调用available; 若隐私设置中禁用了本app对相册
|
||||
* 的访问, 则调用denied; 否则视为被限制, 调用restriction
|
||||
*
|
||||
* @param available 可用
|
||||
* @param denied 不可用
|
||||
* @param restriction 受限制
|
||||
*/
|
||||
+ (void)checkAssetsLibrayAvailable:(void (^)(void))available denied:(void(^)(void))denied restriction:(void(^)(void))restriction;
|
||||
|
||||
/**
|
||||
检查麦克风权限
|
||||
|
||||
@param resultBlock 结果处理block
|
||||
*/
|
||||
+ (void)checkMicPrivacy:(void(^)(BOOL succeed))resultBlock;
|
||||
|
||||
+ (NSString *)macAddresss;
|
||||
+ (NSString *)idfa;
|
||||
|
||||
/**
|
||||
* 初始化信令sdk,imsdk所用到的appName
|
||||
*
|
||||
* @return app name
|
||||
*/
|
||||
+ (NSString *)appName;
|
||||
|
||||
|
||||
/**
|
||||
当前设备是否低于, 等于 iPhone6
|
||||
|
||||
@return 当前设备是否低于, 等于 iPhone6
|
||||
*/
|
||||
+ (BOOL)isIphone6AndLow;
|
||||
|
||||
@end
|
13
YuMi/Tools/YYUtility/YYUtility.m
Normal file
13
YuMi/Tools/YYUtility/YYUtility.m
Normal file
@@ -0,0 +1,13 @@
|
||||
//
|
||||
// YYUtility.m
|
||||
// YYMobileFramework
|
||||
//
|
||||
// Created by wuwei on 14-5-30.
|
||||
// Copyright (c) 2014年 YY Inc. All rights reserved.
|
||||
//
|
||||
|
||||
#import "YYUtility.h"
|
||||
|
||||
@implementation YYUtility
|
||||
|
||||
@end
|
Reference in New Issue
Block a user