[Unity]调用iOS(自己的插件)
之前调用iOS的SDK代码都是将Unity导出XCode工程,再将iOS代码拷贝到XCode工程目录下,手动在CompileSources中添加。但在接入MSDK和米大师,嫌大厂的麻烦,自己写了一套自动配置Xcode工程的代码。感觉略微了解XCode的配置。
在后续的对接中,大厂需要收集运营商和网络情况(Wifi/2G/3G/4G)这些数据,就尝试写个iOS的插件,减少手动操作的麻烦和出错概率。
经过网上一番搜索和自己动手测试后,得出结论:只需要将.h和.m文件拷入到Plugins/iOS目录下,后续在XCode中就不需要管了,如下图:

调用也跟之前接入SDK类似,先写个DllImport,然后就可以直接调用了,代码:
public class MobileUtility
{private static AndroidJavaObject m_apiInstance;private static AndroidJavaObject m_currentActivity;private static AndroidJavaObject m_assetManager;[DllImport("__Internal")]private static extern string iGetMobileCarrier();[DllImport("__Internal")]private static extern string iGetNetworkType();[DllImport("__Internal")]private static extern string iGetIDFA();[DllImport("__Internal")]private static extern float iGetNotchScreenSize();/// /// 获取安卓工具类实例/// /// private static AndroidJavaObject GetApiInstance(){
#if UNITY_ANDROID && !UNITY_EDITORif (null == m_apiInstance){var apiClass = new AndroidJavaClass("com.zp.utility.api");m_apiInstance = apiClass.CallStatic("instance");}
#endifreturn m_apiInstance;}/// /// 获取当前Activity/// /// private static AndroidJavaObject GetCurrentActivity(){
#if UNITY_ANDROID && !UNITY_EDITORif (null == m_currentActivity)m_currentActivity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic("currentActivity");
#endifreturn m_currentActivity;}/// /// 获取安卓的AssetManager,用于读取Unity中StreamingAsset中的文件/// /// private static AndroidJavaObject GetAssetManager(){
#if UNITY_ANDROID && !UNITY_EDITORif (null == m_assetManager){var currentActivity = GetCurrentActivity();if(currentActivity != null)m_assetManager = currentActivity.Call("getAssets");}
#endifreturn m_assetManager;}/// /// 获取手机imei/// /// public static string GetIMEIOrIDFA(){string result = "";
#if UNITY_ANDROID && !UNITY_EDITORvar currentActivity = GetCurrentActivity();AndroidJavaClass contextClass = new AndroidJavaClass("android.content.Context");string TELEPHONY_SERVICE = contextClass.GetStatic("TELEPHONY_SERVICE");AndroidJavaObject telephonyService = currentActivity.Call("getSystemService", TELEPHONY_SERVICE);var imei = telephonyService.Call("getDeviceId");result = imei;
#elif UNITY_IOS && !UNITY_EDITORresult = iGetIDFA();
#endifreturn result;}/// /// 运营商/// /// public static string GetMobileCarrier(){string mobileCarrier = "";
#if UNITY_ANDROID && !UNITY_EDITORvar currentActivity = GetCurrentActivity();var apiInstance = GetApiInstance();if (currentActivity != null && apiInstance != null)mobileCarrier = apiInstance.Call("GetMobileCarrier", currentActivity);
#elif UNITY_IOS && !UNITY_EDITORmobileCarrier = iGetMobileCarrier();
#endifreturn mobileCarrier;}/// /// WIFI 2G 3G 4G/// /// public static string GetNetworkType(){string networkType = "";
#if UNITY_ANDROID && !UNITY_EDITORvar currentActivity = GetCurrentActivity();var apiInstance = GetApiInstance();if (currentActivity != null && apiInstance != null)networkType = apiInstance.Call("GetNetworkType", currentActivity);
#elif UNITY_IOS && !UNITY_EDITORnetworkType = iGetNetworkType();
#endifreturn networkType;}/// /// 获取刘海屏宽度/// /// public static float GetNotchScreenSize(){float result = 0.0f;
#if UNITY_ANDROID && !UNITY_EDITOR
#elif UNITY_IOS && !UNITY_EDITORresult = iGetNotchScreenSize();
#endifreturn result;}/// /// 移动机型/// /// public static string GetMobileName(){return SystemInfo.deviceModel;}
}
iOS代码:
//
// Utility.m
// Unity-iPhone
//
// Created by 张平 on 2019/2/15.
//#import
#import
#import
#import
#import
#import "Reachability.h"char* iGetMobileCarrier()
{//获取本机运营商名称CTTelephonyNetworkInfo *info = [[CTTelephonyNetworkInfo alloc] init];CTCarrier *carrier = [info subscriberCellularProvider];//当前手机所属运营商名称NSString *mobile;//先判断有没有SIM卡,如果没有则不获取本机运营商if (!carrier.isoCountryCode) {NSLog(@"没有SIM卡");mobile = @"无运营商";}else{mobile = [carrier carrierName];}const char* output = [mobile UTF8String];// 是里如果直接返回_output是会报错的,因为它是是const,不能被返回。char* result = (char*)malloc(strlen(output)+1);strcpy(result, output);return result;
}char* iGetNetworkType()
{NSString *netconnType = @"";Reachability *reach = [Reachability reachabilityWithHostName:@"www.apple.com"];switch ([reach currentReachabilityStatus]) {case NotReachable:// 没有网络{netconnType = @"no network";}break;case ReachableViaWiFi:// Wifi{netconnType = @"Wifi";}break;case ReachableViaWWAN:// 手机自带网络{// 获取手机网络类型CTTelephonyNetworkInfo *info = [[CTTelephonyNetworkInfo alloc] init];NSString *currentStatus = info.currentRadioAccessTechnology;if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyGPRS"]) {netconnType = @"GPRS";}else if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyEdge"]) {netconnType = @"2.75G EDGE";}else if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyWCDMA"]){netconnType = @"3G";}else if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyHSDPA"]){netconnType = @"3.5G HSDPA";}else if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyHSUPA"]){netconnType = @"3.5G HSUPA";}else if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyCDMA1x"]){netconnType = @"2G";}else if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyCDMAEVDORev0"]){netconnType = @"3G";}else if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyCDMAEVDORevA"]){netconnType = @"3G";}else if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyCDMAEVDORevB"]){netconnType = @"3G";}else if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyeHRPD"]){netconnType = @"HRPD";}else if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyLTE"]){netconnType = @"4G";}}break;default:break;}const char* output = [netconnType UTF8String];// 是里如果直接返回_output是会报错的,因为它是是const,不能被返回。char* result = (char*)malloc(strlen(output)+1);strcpy(result, output);return result;
}char* iGetIDFA()
{NSString *idfa = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];const char* output = [idfa UTF8String];// 是里如果直接返回_output是会报错的,因为它是是const,不能被返回。char* result = (char*)malloc(strlen(output)+1);strcpy(result, output);return result;
}float iGetNotchScreenSize()
{//iOS 11 以下的默认不存在刘海儿(没有谁iphone X 刷回ios 10 系统吧。哈哈)if (__IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_11_0) {return 0.0f;}/* iPhone8 Plus UIEdgeInsets: {20, 0, 0, 0}* iPhone8 UIEdgeInsets: {20, 0, 0, 0}* iPhone XR UIEdgeInsets: {44, 0, 34, 0}* iPhone XS UIEdgeInsets: {44, 0, 34, 0}* iPhone XS Max UIEdgeInsets: {44, 0, 34, 0}*///ios 11 以上提供专门方法获取刘海儿高度UIEdgeInsets safeAreaInsets = UIApplication.sharedApplication.windows.firstObject.safeAreaInsets;CGFloat bottomSpace = 0;switch (UIApplication.sharedApplication.statusBarOrientation) {case UIInterfaceOrientationPortrait:{bottomSpace = safeAreaInsets.top;}break;case UIInterfaceOrientationLandscapeLeft:{bottomSpace = safeAreaInsets.left;}break;case UIInterfaceOrientationLandscapeRight:{bottomSpace = safeAreaInsets.right;} break;case UIInterfaceOrientationPortraitUpsideDown:{bottomSpace = safeAreaInsets.bottom;}break;default:bottomSpace = safeAreaInsets.bottom;break;}return (float)bottomSpace;
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
