UIDevice+Addtion.m 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. //
  2. // UIDevice+Addtion.m
  3. // Talk
  4. //
  5. // Created by 梁汇丰 on 2025/4/16.
  6. //
  7. #import "UIDevice+Addtion.h"
  8. #import <CoreTelephony/CTTelephonyNetworkInfo.h>
  9. #import <CoreTelephony/CTCarrier.h>
  10. //IP地址需求库
  11. #import <sys/socket.h>
  12. #import <sys/sockio.h>
  13. #import <sys/ioctl.h>
  14. #import <net/if.h>
  15. #import <arpa/inet.h>
  16. @implementation UIDevice (Addtion)
  17. /// 顶部安全区高度
  18. + (CGFloat)safeDistanceTop {
  19. if (@available(iOS 13.0, *)) {
  20. NSSet *set = [UIApplication sharedApplication].connectedScenes;
  21. UIWindowScene *windowScene = [set anyObject];
  22. UIWindow *window = windowScene.windows.firstObject;
  23. return window.safeAreaInsets.top;
  24. } else if (@available(iOS 11.0, *)) {
  25. UIWindow *window = [UIApplication sharedApplication].windows.firstObject;
  26. return window.safeAreaInsets.top;
  27. }
  28. return 0;
  29. }
  30. /// 底部安全区高度
  31. + (CGFloat)safeDistanceBottom {
  32. if (@available(iOS 13.0, *)) {
  33. NSSet *set = [UIApplication sharedApplication].connectedScenes;
  34. UIWindowScene *windowScene = [set anyObject];
  35. UIWindow *window = windowScene.windows.firstObject;
  36. return window.safeAreaInsets.bottom;
  37. } else if (@available(iOS 11.0, *)) {
  38. UIWindow *window = [UIApplication sharedApplication].windows.firstObject;
  39. return window.safeAreaInsets.bottom;
  40. }
  41. return 0;
  42. }
  43. /// 顶部状态栏高度(包括安全区)
  44. + (CGFloat)statusBarHeight {
  45. if (@available(iOS 13.0, *)) {
  46. NSSet *set = [UIApplication sharedApplication].connectedScenes;
  47. UIWindowScene *windowScene = [set anyObject];
  48. UIStatusBarManager *statusBarManager = windowScene.statusBarManager;
  49. return statusBarManager.statusBarFrame.size.height;
  50. } else {
  51. return [UIApplication sharedApplication].statusBarFrame.size.height;
  52. }
  53. }
  54. /// 导航栏高度
  55. + (CGFloat)navigationBarHeight {
  56. return 44.0f;
  57. }
  58. /// 状态栏+导航栏的高度
  59. + (CGFloat)navigationFullHeight {
  60. return [UIDevice statusBarHeight] + [UIDevice navigationBarHeight];
  61. }
  62. /// 底部导航栏高度
  63. + (CGFloat)tabBarHeight {
  64. return 49.0f;
  65. }
  66. /// 底部导航栏高度(包括安全区)
  67. + (CGFloat)tabBarFullHeight {
  68. return [UIDevice statusBarHeight] + [UIDevice safeDistanceBottom];
  69. }
  70. +(NSString *)networkInfo{
  71. CTTelephonyNetworkInfo *info = [[CTTelephonyNetworkInfo alloc] init];
  72. NSString *isoCountryCode = @"";
  73. if (@available(iOS 12.0, *)) {
  74. NSDictionary *cellularDict = [info serviceSubscriberCellularProviders];
  75. for (CTCarrier *carrier in cellularDict.allValues) {
  76. isoCountryCode = [carrier isoCountryCode]; // cn
  77. if(isoCountryCode == nil || isoCountryCode.length == 0){
  78. continue;
  79. }
  80. NSString *mcc = [carrier mobileCountryCode]; // 国家码 如:460
  81. NSString *mnc = [carrier mobileNetworkCode]; // 网络码 如:01
  82. NSString *name = [carrier carrierName]; // 运营商名称,中国联通
  83. // BOOL allowsVOIP = [carrier allowsVOIP];// YES
  84. NSDictionary *radioAccessTechnology = info.serviceCurrentRadioAccessTechnology; // 无线连接技术,如CTRadioAccessTechnologyLTE
  85. // NSDictionary *dict = info.serviceCurrentRadioAccessTechnology;
  86. // DLog(@"=====>> mcc:%@ mnc:%@ name:%@ isoCountryCode:%@ radioAccessTechnology:%@",mcc,mnc,name,isoCountryCode,radioAccessTechnology);
  87. // NSString *str = [NSString stringWithFormat:@"=====>> mcc:%@ mnc:%@ name:%@ isoCountryCode:%@ radioAccessTechnology:%@",mcc,mnc,name,isoCountryCode,radioAccessTechnology];
  88. // [MJKToast showText:str duration:10 onView:kAppDelegate.window];
  89. }
  90. }else{
  91. NSDictionary *carrier = [info serviceSubscriberCellularProviders];
  92. // DLog(@"carrier:%@",carrier);
  93. // NSString *mcc = [carrier mobileCountryCode]; // 国家码 如:460 📢没卡的情况下这个没有值
  94. // NSString *mnc = [carrier mobileNetworkCode]; // 网络码 如:01 📢没卡的情况下这个没有值
  95. // NSString *name = [carrier carrierName]; // 运营商名称,中国联通 *没卡的情况有值
  96. // isoCountryCode = [carrier isoCountryCode]; // cn 📢没卡的情况下这个没有值
  97. //
  98. // NSString *radioAccessTechnology = info.currentRadioAccessTechnology; // 无线连接技术,如CTRadioAccessTechnologyLTE 📢飞行模式下这个没有值
  99. // NSString *str = [NSString stringWithFormat:@"=====>> mcc:%@ mnc:%@ name:%@ isoCountryCode:%@ radioAccessTechnology:%@",mcc,mnc,name,isoCountryCode,radioAccessTechnology];
  100. //
  101. // DLog(@"=====>> mcc:%@ mnc:%@ name:%@ isoCountryCode:%@ radioAccessTechnology:%@",mcc,mnc,name,isoCountryCode,radioAccessTechnology);
  102. }
  103. return isoCountryCode;
  104. }
  105. /// 获取当前的系统语言
  106. + (NSString *)deviceCurrentLanguage{
  107. NSString *languageCode = [NSLocale preferredLanguages][0];// 返回的也是国际通用语言Code+国际通用国家地区代码
  108. NSString *countryCode = [NSString stringWithFormat:@"-%@", [[NSLocale currentLocale] objectForKey:NSLocaleCountryCode]];//国家代码
  109. if (languageCode) {
  110. languageCode = [languageCode stringByReplacingOccurrencesOfString:countryCode withString:@""];
  111. }
  112. // DLog(@"languageCode : %@", languageCode);
  113. return languageCode;
  114. }
  115. @end