#import "IosTools.h"
#import <ifaddrs.h>
#import <net/if.h>
#import <sys/utsname.h>
//#define KIsiPhoneX ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1125, 2436), [[UIScreen mainScreen] currentMode].size) : NO)
//#define kSCREEN_WIDTH ([UIScreen mainScreen].bounds.size.width)
//#define kSCREEN_HEIGHT ([UIScreen mainScreen].bounds.size.height)
////iPhone X
//#define iPhoneX (kSCREEN_WIDTH == 375.f && kSCREEN_HEIGHT == 812.f)
#if defined (__cplusplus)
extern "C" {
#endif
//char*分配内存
char* StringCopy (const char* string)
{
if (string == NULL)
return NULL;
char* res = (char*)malloc(strlen(string) + 1);
strcpy(res, string);
return res;
}
char* GetImei ()
{
NSLog(@"GetImei");
NSString *uuid = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
char* id=[uuid UTF8String];
return StringCopy(id);
}
//获取设备自定义名称
char* GetDeviceName()
{
NSString *deviceName = [[UIDevice currentDevice] name];
NSLog(@"GetDeviceName:::::::::::::::::::::::::::::::%@",deviceName);
return StringCopy([deviceName UTF8String]);
}
float GetBatteryLevel ()
{
[UIDevice currentDevice].batteryMonitoringEnabled = YES;
float batteryLevel = [[UIDevice currentDevice] batteryLevel];
return batteryLevel;
}
// show toast
void ShowToastE(char*str)
{
NSString* content = [[NSString alloc] initWithUTF8String:str];
[[[ZFToast alloc] init] popUpToastWithMessage:content];
}
//复制到剪贴板
void SetClipboardE(char* str)
{
NSString* content = [[NSString alloc] initWithUTF8String:str];
UIPasteboard*pasteboard = [UIPasteboard generalPasteboard];
pasteboard.string=content;
ShowToastE("复制成功");
}
//open url
void OpenWebViewE(char*_url)
{
NSString* url = [[NSString alloc] initWithUTF8String:_url];
[[UIApplication sharedApplication]openURL:[NSURL URLWithString:url]];
}
//获取wifi信号强度
int GetWifiSignalStrength(){
if (![[IosTools Instance] isWiFiEnabled]) {
return 1;
}
NSLog(@"GetDeviceName:::::::::::::::::::::::::::::::%@",[[IosTools Instance] GetDeviceModelName]);
// NSString *deviceName = [[UIDevice currentDevice] systemName];
// NSLog(@"GetDeviceName:::::::::::::::::::::::::::::::%@",deviceName);
// NSLog(@"phone height:%f",[[UIScreen mainScreen] fixedCoordinateSpace].bounds.size.height);
// return [[IosTools Instance] getWifiSignalStrength];
UIApplication *app = [UIApplication sharedApplication];
NSLog(@"app::::%@",app);
if(app==NULL)
{
return 0;
}
// NSArray *subviews = [[[app valueForKey:@"statusBar"] valueForKey:@"foregroundView"] subviews];
NSArray *subviews = nil;
id statusBar = [[UIApplication sharedApplication] valueForKey:@"statusBar"];
if ([statusBar isKindOfClass:NSClassFromString(@"UIStatusBar_Modern")]) {
subviews = [[[statusBar valueForKey:@"statusBar"] valueForKey:@"foregroundView"] subviews];
} else {
subviews = [[statusBar valueForKey:@"foregroundView"] subviews];
}
NSString *dataNetworkItemView = nil;
for (id subview in subviews) {
if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]]) {
dataNetworkItemView = subview;
break;
}
}
int signalStrength = [[dataNetworkItemView valueForKey:@"_wifiStrengthBars"] intValue];
NSLog(@"signal %d", signalStrength);
return signalStrength;
}
//获取网络类型
int GetNetworkType()
{
UIApplication *app = [UIApplication sharedApplication];
NSArray *subviews = [[[app valueForKeyPath:@"statusBar"] valueForKeyPath:@"foregroundView"] subviews];
for (id subview in subviews) {
if ([subview isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) {
int networkType = [[subview valueForKeyPath:@"dataNetworkType"] intValue];
switch (networkType) {
case 0:
NSLog(@"NONE");
break;
case 1:
NSLog(@"2G");
break;
case 2:
NSLog(@"3G");
break;
case 3:
NSLog(@"4G");
break;
case 5:
{
NSLog(@"WIFI");
}
break;
default:
break;
}
return networkType;
}
}
return 0;
}
//get start applink
char* GetStartApplinkUrlE()
{
NSString* url=[UnityAppController GetStartApplink];
char* _url="";
if(url)
{
_url=[url UTF8String];
}
NSLog(@"GetStartApplinkUrlE:::%@",url);
return StringCopy(_url);
}
//ios pay
void IAPInit()
{
[[IosTools Instance] IAPInit];
}
void BuyProduct(char* _productId,char* _userId)
{
NSString* productId = [[NSString alloc] initWithUTF8String:_productId];
NSString* userId = [[NSString alloc] initWithUTF8String:_userId];
[[IosTools Instance] BuyProduct:productId userId:userId];
}
void FinishTransaction(char* _transactionIdentifier)
{
NSString* transactionIdentifier = [[NSString alloc] initWithUTF8String:_transactionIdentifier];
[[IosTools Instance] FinishTransaction:transactionIdentifier];
}
#if defined (__cplusplus)
}
#endif
@implementation IosTools
+(instancetype)Instance {
static dispatch_once_t onceToken;
static IosTools *instance;
dispatch_once(&onceToken, ^{
instance = [[IosTools alloc] init];
});
return instance;
}
//苹果支付
-(void)IAPInit
{
[PurchaseSDK.Instance Init:self];
}
-(void)OnPayResult:(NSString*)res{
char* result=[res UTF8String];
UnitySendMessage("Service", "OnPayResult", result);
}
-(void) BuyProduct:(NSString*) productId userId:(NSString*)userId
{
[[PurchaseSDK Instance] BuyProduct:productId Quantity:1 SignId:userId];
}
-(void) FinishTransaction:(NSString*) transactionIdentifier
{
[[PurchaseSDK Instance] FinishTransaction:transactionIdentifier];
}
- (BOOL) isWiFiEnabled {
NSCountedSet * cset = [NSCountedSet new];
struct ifaddrs *interfaces;
if( ! getifaddrs(&interfaces) ) {
for( struct ifaddrs *interface = interfaces; interface; interface = interface->ifa_next) {
if ( (interface->ifa_flags & IFF_UP) == IFF_UP ) {
[cset addObject:[NSString stringWithUTF8String:interface->ifa_name]];
}
}
}
return [cset countForObject:@"awdl0"] > 1 ? YES : NO;
}
- (NSString *)getNetworkType
{
UIApplication *app = [UIApplication sharedApplication];
id statusBar = [app valueForKeyPath:@"statusBar"];
NSString *network = @"";
NSArray *children;
NSString *state = [[NSString alloc] init];
if ([self IsIphoneX]) {
// iPhone X
// NSLog(@"IsIphoneX:::type:::::::");
// id statusBarView = [statusBar valueForKeyPath:@"statusBar"];
// UIView *foregroundView = [statusBarView valueForKeyPath:@"foregroundView"];
// NSLog(@"foregroundView:::type:::::::%@",foregroundView);
// NSArray *subviews = [[foregroundView subviews][2] subviews];
// NSLog(@"subviews:::type:::::::%@",subviews);
// for (id subview in subviews) {
// NSLog(@"subview:::type:::::::%@",subview);
// if ([subview isKindOfClass:NSClassFromString(@"_UIStatusBarWifiSignalView")]) {
// network = @"WIFI";
// }else if ([subview isKindOfClass:NSClassFromString(@"_UIStatusBarStringView")]) {
// network = [subview valueForKeyPath:@"originalText"];
// }
// }
children = [[[[app valueForKeyPath:@"_statusBar"] valueForKeyPath:@"_statusBar"] valueForKeyPath:@"foregroundView"] subviews];
for (UIView *view in children) {
NSLog(@"UIVIEW::::::%@",view);
for (id child in view.subviews) {
//wifi
if ([child isKindOfClass:NSClassFromString(@"_UIStatusBarWifiSignalView")]) {
state = @"WIFI";
}
//2G 3G 4G
if ([child isKindOfClass:NSClassFromString(@"_UIStatusBarStringView")]) {
if ([[child valueForKey:@"_originalText"] containsString:@"G"]) {
state = [child valueForKey:@"_originalText"];
}
}
}
}
NSLog(@"iphone x net type::::::::%@",state);
// if (![state isStringValid]) {
// state = @"无网络";
// }
network=state;
}else {
// 非 iPhone X
UIView *foregroundView = [statusBar valueForKeyPath:@"foregroundView"];
NSArray *subviews = [foregroundView subviews];
for (id subview in subviews) {
if ([subview isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) {
int networkType = [[subview valueForKeyPath:@"dataNetworkType"] intValue];
switch (networkType) {
case 0:
network = @"NONE";
break;
case 1:
network = @"2G";
break;
case 2:
network = @"3G";
break;
case 3:
network = @"4G";
break;
case 5:
network = @"WIFI";
break;
default:
break;
}
}
}
}
if ([network isEqualToString:@""]) {
network = @"NO DISPLAY";
}
NSLog(@"getNetworkType;::::::::%@",network);
return network;
}
#pragma mark 获取Wifi信号强度
- (int)getWifiSignalStrength{
int signalStrength = 0;
// 判断类型是否为WIFI
if ([[self getNetworkType]isEqualToString:@"WIFI"]) {
UIApplication *app = [UIApplication sharedApplication];
id statusBar = [app valueForKey:@"statusBar"];
if ([self IsIphoneX]) {
// iPhone X
id statusBarView = [statusBar valueForKeyPath:@"statusBar"];
UIView *foregroundView = [statusBarView valueForKeyPath:@"foregroundView"];
NSArray *subviews = [[foregroundView subviews][2] subviews];
for (id subview in subviews) {
NSLog(@"subview::::::::%@",subview);
if ([subview isKindOfClass:NSClassFromString(@"_UIStatusBarWifiSignalView")]) {
signalStrength = [[subview valueForKey:@"_numberOfActiveBars"] intValue];
}
}
}else {
// 非 iPhone X
UIView *foregroundView = [statusBar valueForKey:@"foregroundView"];
NSArray *subviews = [foregroundView subviews];
NSString *dataNetworkItemView = nil;
for (id subview in subviews) {
if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]]) {
dataNetworkItemView = subview;
break;
}
}
signalStrength = [[dataNetworkItemView valueForKey:@"_wifiStrengthBars"] intValue];
}
}
NSLog(@"signal %d", signalStrength);
return signalStrength;
}
// 需要#import <sys/utsname.h>
- (NSString*)GetDeviceModelName
{
struct utsname systemInfo;
uname(&systemInfo);
NSString *deviceString = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
NSLog(@"deviceString:::::::::::::::::::::::::: %@", deviceString);
if ([deviceString isEqualToString:@"iPhone3,1"]) return @"iPhone 4";
if ([deviceString isEqualToString:@"iPhone3,2"]) return @"iPhone 4";
if ([deviceString isEqualToString:@"iPhone3,3"]) return @"iPhone 4";
if ([deviceString isEqualToString:@"iPhone4,1"]) return @"iPhone 4S";
if ([deviceString isEqualToString:@"iPhone5,1"]) return @"iPhone 5";
if ([deviceString isEqualToString:@"iPhone5,2"]) return @"iPhone 5 (GSM+CDMA)";
if ([deviceString isEqualToString:@"iPhone5,3"]) return @"iPhone 5c (GSM)";
if ([deviceString isEqualToString:@"iPhone5,4"]) return @"iPhone 5c (GSM+CDMA)";
if ([deviceString isEqualToString:@"iPhone6,1"]) return @"iPhone 5s (GSM)";
if ([deviceString isEqualToString:@"iPhone6,2"]) return @"iPhone 5s (GSM+CDMA)";
if ([deviceString isEqualToString:@"iPhone7,1"]) return @"iPhone 6 Plus";
if ([deviceString isEqualToString:@"iPhone7,2"]) return @"iPhone 6";
if ([deviceString isEqualToString:@"iPhone8,1"]) return @"iPhone 6s";
if ([deviceString isEqualToString:@"iPhone8,2"]) return @"iPhone 6s Plus";
if ([deviceString isEqualToString:@"iPhone8,4"]) return @"iPhone SE";
// 日行两款手机型号均为日本独占,可能使用索尼FeliCa支付方案而不是苹果支付
if ([deviceString isEqualToString:@"iPhone9,1"]) return @"国行、日版、港行iPhone 7";
if ([deviceString isEqualToString:@"iPhone9,2"]) return @"港行、国行iPhone 7 Plus";
if ([deviceString isEqualToString:@"iPhone9,3"]) return @"美版、台版iPhone 7";
if ([deviceString isEqualToString:@"iPhone9,4"]) return @"美版、台版iPhone 7 Plus";
if ([deviceString isEqualToString:@"iPhone10,1"]) return @"国行(A1863)、日行(A1906)iPhone 8";
if ([deviceString isEqualToString:@"iPhone10,4"]) return @"美版(Global/A1905)iPhone 8";
if ([deviceString isEqualToString:@"iPhone10,2"]) return @"国行(A1864)、日行(A1898)iPhone 8 Plus";
if ([deviceString isEqualToString:@"iPhone10,5"]) return @"美版(Global/A1897)iPhone 8 Plus";
if ([deviceString isEqualToString:@"iPhone10,3"]) return @"国行(A1865)、日行(A1902)iPhone X";
if ([deviceString isEqualToString:@"iPhone10,6"]) return @"美版(Global/A1901)iPhone X";
if ([deviceString isEqualToString:@"iPod1,1"]) return @"iPod Touch 1G";
if ([deviceString isEqualToString:@"iPod2,1"]) return @"iPod Touch 2G";
if ([deviceString isEqualToString:@"iPod3,1"]) return @"iPod Touch 3G";
if ([deviceString isEqualToString:@"iPod4,1"]) return @"iPod Touch 4G";
if ([deviceString isEqualToString:@"iPod5,1"]) return @"iPod Touch (5 Gen)";
if ([deviceString isEqualToString:@"iPad1,1"]) return @"iPad";
if ([deviceString isEqualToString:@"iPad1,2"]) return @"iPad 3G";
if ([deviceString isEqualToString:@"iPad2,1"]) return @"iPad 2 (WiFi)";
if ([deviceString isEqualToString:@"iPad2,2"]) return @"iPad 2";
if ([deviceString isEqualToString:@"iPad2,3"]) return @"iPad 2 (CDMA)";
if ([deviceString isEqualToString:@"iPad2,4"]) return @"iPad 2";
if ([deviceString isEqualToString:@"iPad2,5"]) return @"iPad Mini (WiFi)";
if ([deviceString isEqualToString:@"iPad2,6"]) return @"iPad Mini";
if ([deviceString isEqualToString:@"iPad2,7"]) return @"iPad Mini (GSM+CDMA)";
if ([deviceString isEqualToString:@"iPad3,1"]) return @"iPad 3 (WiFi)";
if ([deviceString isEqualToString:@"iPad3,2"]) return @"iPad 3 (GSM+CDMA)";
if ([deviceString isEqualToString:@"iPad3,3"]) return @"iPad 3";
if ([deviceString isEqualToString:@"iPad3,4"]) return @"iPad 4 (WiFi)";
if ([deviceString isEqualToString:@"iPad3,5"]) return @"iPad 4";
if ([deviceString isEqualToString:@"iPad3,6"]) return @"iPad 4 (GSM+CDMA)";
if ([deviceString isEqualToString:@"iPad4,1"]) return @"iPad Air (WiFi)";
if ([deviceString isEqualToString:@"iPad4,2"]) return @"iPad Air (Cellular)";
if ([deviceString isEqualToString:@"iPad4,4"]) return @"iPad Mini 2 (WiFi)";
if ([deviceString isEqualToString:@"iPad4,5"]) return @"iPad Mini 2 (Cellular)";
if ([deviceString isEqualToString:@"iPad4,6"]) return @"iPad Mini 2";
if ([deviceString isEqualToString:@"iPad4,7"]) return @"iPad Mini 3";
if ([deviceString isEqualToString:@"iPad4,8"]) return @"iPad Mini 3";
if ([deviceString isEqualToString:@"iPad4,9"]) return @"iPad Mini 3";
if ([deviceString isEqualToString:@"iPad5,1"]) return @"iPad Mini 4 (WiFi)";
if ([deviceString isEqualToString:@"iPad5,2"]) return @"iPad Mini 4 (LTE)";
if ([deviceString isEqualToString:@"iPad5,3"]) return @"iPad Air 2";
if ([deviceString isEqualToString:@"iPad5,4"]) return @"iPad Air 2";
if ([deviceString isEqualToString:@"iPad6,3"]) return @"iPad Pro 9.7";
if ([deviceString isEqualToString:@"iPad6,4"]) return @"iPad Pro 9.7";
if ([deviceString isEqualToString:@"iPad6,7"]) return @"iPad Pro 12.9";
if ([deviceString isEqualToString:@"iPad6,8"]) return @"iPad Pro 12.9";
if ([deviceString isEqualToString:@"iPad6,11"]) return @"iPad 5 (WiFi)";
if ([deviceString isEqualToString:@"iPad6,12"]) return @"iPad 5 (Cellular)";
if ([deviceString isEqualToString:@"iPad7,1"]) return @"iPad Pro 12.9 inch 2nd gen (WiFi)";
if ([deviceString isEqualToString:@"iPad7,2"]) return @"iPad Pro 12.9 inch 2nd gen (Cellular)";
if ([deviceString isEqualToString:@"iPad7,3"]) return @"iPad Pro 10.5 inch (WiFi)";
if ([deviceString isEqualToString:@"iPad7,4"]) return @"iPad Pro 10.5 inch (Cellular)";
if ([deviceString isEqualToString:@"AppleTV2,1"]) return @"Apple TV 2";
if ([deviceString isEqualToString:@"AppleTV3,1"]) return @"Apple TV 3";
if ([deviceString isEqualToString:@"AppleTV3,2"]) return @"Apple TV 3";
if ([deviceString isEqualToString:@"AppleTV5,3"]) return @"Apple TV 4";
if ([deviceString isEqualToString:@"i386"]) return @"Simulator";
if ([deviceString isEqualToString:@"x86_64"]) return @"Simulator";
return deviceString;
}
- (bool) IsIphoneX
{
struct utsname systemInfo;
uname(&systemInfo);
NSString *deviceString = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
NSLog(@"deviceString:::::::::::::::::::::::::: %@", deviceString);
if ([deviceString isEqualToString:@"iPhone10,3"]) return true;
if ([deviceString isEqualToString:@"iPhone10,6"]) return true;
return false;
}
- (void)dealloc {
}
@end