在项目用,由于使用Firebase和Facebook事件分析,需要收集IDFA作为用户的唯一标志位。但是在Unity调用原生获取IDFA时,出现是游戏卡死状态。
经过我多次尝试,发现如果在Unity加载初始资源时,调用原生代码获取IDFA时,可能会使加载资源的主线程阻塞,具体的原因我并不清楚,但是根据Log的信息看,是加载资源被中断了, 没有继续走下去!
改的方式,就是在加载资源完毕之后再去获取IDFA!
另外,加载完毕之后,再去设置Firebase和Facebook的UserID(IDFA),并不会影响收集事件附带UserID!
关于如何获取 IDFA,我是这么做的:
/// <summary>
/// 收集用户的IDFA,可以在 FacebookSDK/SDK/Editor/iOS/FBUnityInterface.mm 文件中添加下面的代码
/*
#import <AdSupport/ASIdentifierManager.h> //头文件
extern "C"{
const char* IOSSetUserIDWithIDFA(){
NSLog(@"Unity Call IOSSetUserIDWithIDFA");
NSString* userId = [[[ASIdentifierManager sharedManager]advertisingIdentifier]UUIDString];
NSString* strNone = @"00000000-0000-0000-0000-000000000000";
if(![userId isEqualToString:strNone]){
[FBSDKAppEvents setUserID:userId];
const char* msg = [userId UTF8String];
// strdup(const char *__s1) 复制mHost字符串,通过Malloc()进行空间分配
return strdup(msg);
}
return strdup("");
}
}
*/
/// 如果不需要自动收集,应该把 [FBSDKAppEvents activateApp] 注释掉
/// </summary>
然后在自己写的FB管理类里面加入对应的C#方法:
public class FBManager : MonoBehaviour {
#if UNITY_IPHONE && !UNITY_EDITOR
[DllImport("__Internal")]
private static extern string IOSSetUserIDWithIDFA ();
#endif
/// <summary>
/// 获取机器的 IDFA 码,用于识别用户的唯一ID
/// 可以在启动的时候获取
/// </summary>
/// <returns></returns>
public static string GetIOSUserIDWithIDFA(){
#if UNITY_IPHONE && !UNITY_EDITOR
return IOSSetUserIDWithIDFA();
#else
return "";
#endif
}
}