本文主要是介绍Unity与IOS互调,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
这是篇笔记文章,为了做ios att授权,参考了别的博客。不过unity与ios互调原理类似。
1,创建一个.mm文件,里面写ios代码,然后放到unity工程的Plugin/iOS文件夹下。脚本名字自定义,内容示例如下:
#import <Foundation/Foundation.h>
#import <AppTrackingTransparency/AppTrackingTransparency.h>
#import "UnityInterface.h"extern "C" {void _RequestTrackingAuthorizationWithCompletionHandler() {if (@available(iOS 14, *)) {[ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {NSString *stringInt = [NSString stringWithFormat:@"%lu",(unsigned long)status];const char* charStatus = [stringInt UTF8String];UnitySendMessage("IOSMethod", "GetAuthorizationStatus", charStatus);}];} else {UnitySendMessage("IOSMethod", "GetAuthorizationStatus", "-1");}}int _GetAppTrackingAuthorizationStatus() {if (@available(iOS 14, *)) {return (int)[ATTrackingManager trackingAuthorizationStatus];} else {return -1;}}
}
如果没有这个文件夹的话,自己创建下就好了。具体函数内容可以自己更改。具体作用于unity依据的是这句话:
UnitySendMessage("IOSMethod", "GetAuthorizationStatus", charStatus);
它的含义是向unity场景中一个叫IOSMethod的物体调用GetAuthorizationStatus方法,并调用参数charStatus。
2,创建一个名为ATTAuth的C#脚本,用于调用IOS代码,脚本内容如下:
[DllImport("__Internal")]private static extern void _RequestTrackingAuthorizationWithCompletionHandler();[DllImport("__Internal")]private static extern int _GetAppTrackingAuthorizationStatus();private static Action<int> getAuthorizationStatusAction;/// <summary>/// 请求ATT授权窗口/// </summary>/// <param name="getResult"></param>public static void RequestTrackingAuthorizationWithCompletionHandler(Action<int> getResult){//-1:"ios版本低于14"//0: "ATT 授权状态待定";//1: "ATT 授权状态受限";//2: "ATT 已拒绝";//3: "ATT 已授权";Debug.Log("RequestTrackingAuthorizationWithCompletionHandler");getAuthorizationStatusAction = getResult;_RequestTrackingAuthorizationWithCompletionHandler();}/// <summary>/// 获取当前ATT授权状态/// </summary>/// <returns></returns>public static int GetAppTrackingAuthorizationStatus(){return _GetAppTrackingAuthorizationStatus();}public void GetAuthorizationStatus(string status){getAuthorizationStatusAction?.Invoke(int.Parse(status));}
这个脚本名字也可自己改,如果想调用IOS的方法,基本都得用到 [DllImport("__Internal")]标签,具体函数名及回调可以自己改。
3,在游戏场景中创建一个物体,取名为IOSMethod。把ATTAuth.cs脚本挂到该物体上。在需要调用ATT弹窗的地方写下面的代码:
if (Application.platform == RuntimePlatform.IPhonePlayer)
{int curStatus = ATTAuth.GetAppTrackingAuthorizationStatus());if(curStatus == 0){ATTAuth.RequestTrackingAuthorizationWithCompletionHandler((status) =>{Debug.Log("ATT status :" + status);});}
}
这一步就是为了方便unity调用IOS。
4,在xcode中加入相应的库和权限(改info.plist)。
比如添加att权限的话,首先在Link Binary with Libraries中添加AppTrackingTransparency.framework
然后文本打开info.plist,在其中添加
<key>NSUserTrackingUsageDescription</key>
<string>描述文本</string>
5,总结
IOS与unity开发语言写法上很相似,如果需要的话可以互相调用。目前总结的就这么多,有什么问题博客下联系。
这篇关于Unity与IOS互调的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!