Unity关于IOS授权应用可追踪用户事件(ATT授权)
因为ios升级到14版本之后,强制要求app授权AppTrackingTransparency。所以需要在Unity导出的xCode项目执行以下操作:
1.Plugin/iOS文件夹下,创建一个.mm文件(后缀自己加,先创建一个txt文件即可)copy以下内容:
#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;
}
}
}
2.在脚步文件夹下,创建一个ATTAuth.cs文件,这个是要挂在GameObject上的。copy以下内容:
[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));
}
3.场景中创建一个物体,取名为IOSMethod。把ATTAuth.cs脚本挂到该物体上。
4.调用ATT弹窗的地方写下面的代码:
if (Application.platform == RuntimePlatform.IPhonePlayer)
{
int curStatus = ATTAuth.GetAppTrackingAuthorizationStatus());
if(curStatus == 0)
{
ATTAuth.RequestTrackingAuthorizationWithCompletionHandler((status) =>
{
Debug.Log("ATT status :" + status);
});
}
}
5.使用xCode打开导出后的项目,在主工程中找到Build Phases -> Link Binary With Libraries 点击下面的+ 添加AppTrackingTransparency.framework, 如下图:
6,在XCode中,选中Info.plist,点击+号,新增 Privacy - Tracking Usage Description:
如果已经有此字段,可以不用管。
注意iOS系统13及以下,运行app时会找不到ATT库,需要判断一下版本,然后把AppTrackingTransparency.framework的 Status选择为Optional.