当前可以唯一标识设备,用于程序的数据收集和统计的ID
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"
有两种方式:
一种是直接在手机设置“Setting -> Ads”中查询,如上图所示。
但是对于国内Android系统是没有谷歌服务的,在重新安装了Google三件套后依然无法在系统设置中找到“Google”或者“Ads”选项,此时是无法直接从手机设置中获取到GAID的,需要借助第三方软件才能查看到,这里推荐google play store 的“AAID”:
string GetAdvertisingId()
{
string advertisingId = "DEFAULT";
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic("currentActivity");
AndroidJavaClass jc2 = new AndroidJavaClass("com.google.android.gms.ads.identifier.AdvertisingIdClient");
AndroidJavaObject jo2 = jc2.CallStatic("getAdvertisingIdInfo", jo);
if (jo2 != null)
{
//获取广告id:
advertisingId = jo2.Call("getId");
if (string.IsNullOrEmpty(advertisingId))
advertisingId = "none";
//获取广告跟踪状态:当为false时,则无法根据用户行为定向推送广告,但看到的广告数量并不会减少
adTrackLimited = jo2.Call("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
//该方法已验证,可以正常得到返回结果,用于获取当前设备的google play服务状态
int CheckGooglePlayServiceAvailable()
{
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic("currentActivity");
AndroidJavaClass jc2 = new AndroidJavaClass("com.google.android.gms.common.GoogleApiAvailability");
AndroidJavaObject jo2 = jc2.CallStatic("getInstance");
int code = jo2.Call("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设备上,该广告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数据为空。
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”即会重新开始解析依赖。弹出如下窗口则代表解析依赖成功