Unity中的设备唯一码GAID、IDFA,用于广告跟踪和数据统计

当前可以唯一标识设备,用于程序的数据收集和统计的ID

ANDROID:

国外:

GAID:广告id,即Google Advertising ID(GAID),是由Google Play service提供给用户的可以重置的唯一广告id,通常也被用来作为设备的唯一标识,用于数据收集。但用户手机上必须安装有google play服务,并且网络可以访问google,才可以获取到该id。(该广告id也被称为AAID —— Android Advertising ID)。由于可以被重置,因此是非永久性标识符

PS:这里的“重置”指的是在Android系统“设置”里,将Google服务将GAID重置,重置之后会生成一个新的GAID。卸载后重装某个应用并不会改变GAID值,只有在系统设置中执行指定操作后才会重置GAID。 GAID的作用在于对用户喜好进行跟踪,然后推送跟喜好相关的广告。开启或关闭该服务并不会减少广告的数量,只是关闭之后推送的广告是随机选择的,而不是根据用户喜好来推送相关内容的广告。

重置GAID:  "Setting" -> "Ads"

    

如何获取设备的GAID?

有两种方式:

一种是直接在手机设置“Setting -> Ads”中查询,如上图所示。

但是对于国内Android系统是没有谷歌服务的,在重新安装了Google三件套后依然无法在系统设置中找到“Google”或者“Ads”选项,此时是无法直接从手机设置中获取到GAID的,需要借助第三方软件才能查看到,这里推荐google play store 的“AAID”:

第二种则是通过代码获取:

 1.获取当前设备的GAID以及广告跟踪状态:

string GetAdvertisingId()
{
	string advertisingId = "DEFAULT";

	AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
	AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");

	AndroidJavaClass jc2 = new AndroidJavaClass("com.google.android.gms.ads.identifier.AdvertisingIdClient");
	AndroidJavaObject jo2 = jc2.CallStatic<AndroidJavaObject>("getAdvertisingIdInfo", jo);
	if (jo2 != null)
	{
		//获取广告id:
		advertisingId = jo2.Call<string>("getId");
		if (string.IsNullOrEmpty(advertisingId))
			advertisingId = "none";

		//获取广告跟踪状态:当为false时,则无法根据用户行为定向推送广告,但看到的广告数量并不会减少
		adTrackLimited = jo2.Call<bool>("isLimitAdTrackingEnabled");
	}

	return advertisingId;
}

运行结果如下:

PS:“isLimitAdTrackingEnabled”:是否限制跟踪用户行为以便投放相应广告,当为false时则无法根据用户行为来投放广告,但看到的广告数量不会减少。默认为false,表示可以会跟踪用户行为

注意:

1.如果只是为了获取安卓设备的GAID,则并不需要导入任何其他插件,只用在custom后的 mainTemplate.gradle的依赖关系中添加:implementation 'com.google.android.gms:play-services-ads-identifier:18.0.1'  即可

实际项目测试:使用Unity2018.4.1f1新建一个空项目,之后在Player Setting -> Publishing Setting中勾选“Custom Gradle Template”:

在新生成的文件“mainTemplate.gradle”中加入implementation 'com.google.android.gms:play-services-ads-identifier:18.0.1' 即可成功调用获取GAID的方法,项目源码:获取安卓设备广告id——GAID-Unity3D文档类资源-CSDN下载

2.C#方法中用到的java类“com.google.android.gms.ads.identifier.AdvertisingIdClient”是在“com.google.android.gms:play-services-ads-identifier”中,而不是“com.google.android.gms:play-services-ads”,所以不要填错依赖关系。

各个Google相关的信息与依赖关系可查阅官方Guide:https://developers.google.com/android/guides/setup

2.检测当前设备Google Play服务是否可用?

//该方法已验证,可以正常得到返回结果,用于获取当前设备的google play服务状态

int CheckGooglePlayServiceAvailable()
{
	AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
	AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");

	AndroidJavaClass jc2 = new AndroidJavaClass("com.google.android.gms.common.GoogleApiAvailability");
	AndroidJavaObject jo2 = jc2.CallStatic<AndroidJavaObject>("getInstance");

	int code = jo2.Call<int>("isGooglePlayServicesAvailable", jo);
	return code;

	// result codes from https://developers.google.com/android/reference/com/google/android/gms/common/ConnectionResult

	// 0 == success
	// 1 == service_missing
	// 2 == update service required
	// 3 == service disabled
	// 18 == service updating
	// 9 == service invalid
}

注意:以上方法中用到的java类:“com.google.android.gms.common.GoogleApiAvailability”需要导入Google Play Games插件到项目中才可以正常被调用。

https://github.com/playgameservices/play-games-plugin-for-unity

项目实测:Unity2018.4.1f1,GooglePlayGamesPlugin-0.10.14.unitypackage

运行结果:

 项目源码:获取安卓设备的googleplayservice状态以及GAID,和广告跟踪-Unity3D文档类资源-CSDN下载

国内:

1.IMEI:可以唯一标识一个设备,并且无法重置,是运营商识别入网设备信息的代码。世界上每一个IMEI都不相同。由于无法重置,因此是永久标识符。

由于IMEI具有唯一性和稳定性,因此当前国内大量使用的都是IMEI。但随着安卓版本升级,到Android 10后,由于Google在隐私保护上的加强,Android Q已经无法再获取到设备的IMEI码。

2.OAID:鉴于国内的特殊环境,无法使用GAID,并且随着安卓系统Android 10的普及,已经无法再获取到IMEI,所以近期由中国移动安全联盟开发的OAID——Open Anonymous Device Identifier,具有稳定性和唯一性,可以用来唯一标识设备。并且该ID还可以用于广告跟踪,可以被重置,所以通常也被用来替代国外的GAID,达到一样的效果。但目前直到Android 10后才逐渐被使用,下图为当前支持OAID的国内终端:

IOS:

与之相对应的,在IOS设备上,该广告id为“IDFA”,即Identifier For Advertising,是ios为每个用户设置的唯一广告id。由于IOS设备在国内外都可以正常使用,因此IOS设备都使用IDFA来作为唯一标识。

Unity为IOS提供了获取Advertising ID的方法:

//该方法当前尚没有在IOS设备上得到直接验证
Application.RequestAdvertisingIdentifierAsync(
            (string advertisingId, bool trackingEnabled, string error) =>
            { Debug.Log("advertisingId " + advertisingId + " " + trackingEnabled + " " + error); }
        );

注:ATT窗口 —— 为了加强用户隐私,IOS14推出ATT窗口:如因跟踪目的收集用户数据,需先取得用户授权才能得到该IOS设备的IDFA,否则应用获取到的IDFA数据为空。

PS:

1.导入GoogleMobileAds​​​​​​​插件后报错(本项目并不需要导入该插件,之所以遇到该问题是因为在开发时恰好碰到了,所以记录下):

导入谷歌广告的Unity插件时,默认会使用当前最新的版本 —— GoogleMobileAds-v7.0.0.unitypackage。但对于Unity的早期版本如Unity2018.4.1f1是不支持package中有对Timeline的依赖关系的,所以Unity2018.4.1f1导入当前最新版的“GoogleMobileAds-v7.0.0.unitypackage”后会报错:

解决办法:更新Unity版本,如换成Unity2019即可;或者下载GoogleMobileAds的早期版本,如

经测试,在Unity2018.4.1f1中导入“GoogleMobileAds-v3.18.3.unitypackage”后没有如上报错了

2.解析依赖失败:在手动解析依赖时,点击“Resolve”后没有反应

 出现这种情况有可能是因为:当第一次导入GoogleMobileAds-v3.18.3.unitypackage插件后,Unity会自动的解析依赖关系,但由于时间过长,那个展示解析进度的窗口被人为打断了。后面再次点击“Resolve”是没有反应的。此时查看“mainTemplate.gradle”发现没有任何改变,依赖关系都没有被添加进来,说明本次解析依赖没有成功。

解决办法:点击截图中的“Delete Resolved Libraries”,然后将项目关闭后再重新打开,再次点击“Resolve”即会重新开始解析依赖。弹出如下窗口则代表解析依赖成功

猜你喜欢

转载自blog.csdn.net/m0_47975736/article/details/123482768