Unity自己莫名其妙添加了ACCESS_FINE_LOCATION权限的问题

文章目录

      • 一、前言:莫名其妙的ACCESS_FINE_LOCATION权限
      • 二、猜想与验证
        • 1、猜想
        • 2、验证猜想
      • 三、真相与解决
        • 1、真相
        • 2、解决办法
      • 四、结束语

一、前言:莫名其妙的ACCESS_FINE_LOCATION权限

嗨,大家好,我是新发。
最近上传包到Google Play被拒了,原因是apk中申请了ACCESS_FINE_LOCATION权限。
Unity自己莫名其妙添加了ACCESS_FINE_LOCATION权限的问题_第1张图片
事实上我们并没有使用地理位置相关的SDK,在AndroidManifest.xml中也没有申请这个权限。
但是打出包后,拆包发现确实多了ACCESS_FINE_LOCATION权限。
Unity自己莫名其妙添加了ACCESS_FINE_LOCATION权限的问题_第2张图片
为什么呢?
Unity自己莫名其妙添加了ACCESS_FINE_LOCATION权限的问题_第3张图片

二、猜想与验证

1、猜想

我想起了我之前写的这篇文章:《无需接入SDK即可在Unity中获取经纬度(Android/iOS),告诉我你的坐标》
我们通过Input.location即可获得地理位置的经纬度信息,在Android设备上,肯定是需要对应的权限的,而我们使用Input.location时并不需要手动在AndroidManifest.xml中申请对应的权限,这是怎么做到的?
直觉告诉我,Unity自己帮我们加上去的,为了验证这个猜想,我弄个小Demo测试一下。

2、验证猜想

首先,创建一个空工程,转Android平台,不写任何代码,打包apk
Unity自己莫名其妙添加了ACCESS_FINE_LOCATION权限的问题_第4张图片
将打出来的apk拖到AndroidStudio中,可以直接查看包内的AndroidManifest.xml,可以看到,没有申请ACCESS_FINE_LOCATION权限。
Unity自己莫名其妙添加了ACCESS_FINE_LOCATION权限的问题_第5张图片
接着,回到Unity中,我们创建一个脚本,在脚本中访问一下Input.location,如下:
Unity自己莫名其妙添加了ACCESS_FINE_LOCATION权限的问题_第6张图片

using UnityEngine;

public class Main : MonoBehaviour
{
     
    void Start()
    {
     
        var location = Input.location;
    }
}

然后重新打包apk,再使用AndroidStudio查看打出来的apkAndroidManifest.xml
好家伙,真的自己加上了ACCESS_FINE_LOCATION权限。
Unity自己莫名其妙添加了ACCESS_FINE_LOCATION权限的问题_第7张图片
猜想验证成功,也就是说,只要引用了Input.location,打包apkUnity就会自动加上ACCESS_FINE_LOCATION权限。

事实上,在Unity手册中也有提到这个。见这里:https://docs.unity3d.com/Manual/android-manifest.html
Unity自己莫名其妙添加了ACCESS_FINE_LOCATION权限的问题_第8张图片

三、真相与解决

1、真相

根据我们上面的结论,回到提审Google Play的项目工程中,查找Input.location的引用,发现,居然是tolua的锅。
因为工程中使用了tolua框架,里面为Input类生成了UnityEngine_InputWrap类,在UnityEngine_InputWrap中引用了Input.location

// UnityEngine_InputWrap.cs

[MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]
static int get_location(IntPtr L)
{
     
	try
	{
     
		ToLua.PushObject(L, UnityEngine.Input.location);
		return 1;
	}
	catch(Exception e)
	{
     
		return LuaDLL.toluaL_exception(L, e);
	}
}

关于tolua框架的使用,可以参见我之前写的这篇文章:《Unity使用tolua框架教程: LuaFramewrk》

2、解决办法

解决办法就是把UnityEngine_InputWrap中的get_location注释掉,

// UnityEngine_InputWrap.cs

// 不要引用Input.location,否则会自动引入ACCESS_FINE_LOCATION权限
// L.RegVar("location", get_location, null);

// ...

/* 不要引用Input.location,否则会自动引入ACCESS_FINE_LOCATION权限
[MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]
static int get_location(IntPtr L)
{
	try
	{
		ToLua.PushObject(L, UnityEngine.Input.location);
		return 1;
	}
	catch(Exception e)
	{
		return LuaDLL.toluaL_exception(L, e);
	}
}
*/

接着,将UnityEngine_InputWrap.cs移动到LuaFramework/ToLua/BaseType目录中,
再接着,把CustomSettings.cs中的_GT(typeof(Input))注释掉。

// CustomSettings.cs

// 不要主动生成`UnityEngine_InputWrap类,移动到BaseType目录中
//_GT(typeof(Input)),  

最后,记得在LuaState.cs中加上UnityEngine_InputWrap.Register(this);

// LuaState.cs

BeginModule("UnityEngine");
// ...
UnityEngine_InputWrap.Register(this);
// ...
EndModule();

四、结束语

完毕。
喜欢Unity的同学,不要忘记点击关注,如果有什么Unity相关的技术难题,也欢迎留言或私信~

你可能感兴趣的:(Unity3D,unity,location,权限,地理位置,tolua)