Xamarin iOS项目提交App Store时Info.plist定位权限问题求助
这种情况我之前也碰到过,罪魁祸首就是你用到的那些NuGet包——哪怕你自己没写一行定位相关的代码,它们的底层可能偷偷引用了CoreLocation框架的API,App Store的静态检测工具一抓到这些引用,就会强制要求你添加权限说明。下面是几个亲测有效的解决方法,按优先级排序:
第一步:清理不必要的NuGet包
先看看Plugin.Permissions是不是真的需要。Xamarin.Essentials本身已经内置了权限处理的API,如果你是为了处理相机/相册权限用的Plugin.Permissions,完全可以替换成Essentials的Permissions类。卸载掉Plugin.Permissions能减少很多不必要的API引用,大概率能解决问题。第二步:开启链接器优化(最有效)
Xamarin的链接器可以自动移除项目中没有被实际调用的代码,包括那些NuGet包里没用到的定位API。操作步骤很简单:- 右键你的iOS项目 → 选择「属性」
- 切换到「iOS Build」标签页
- 在「Linker Behavior」下拉菜单里,选择「Link All Assemblies」(如果担心兼容性问题,先试试「Link SDK Assemblies Only」,这个更温和)
- 重新编译打包提交,一般就能通过检测了。
注意:开启Link All Assemblies后,要全面测试你的应用,避免某些反射调用的代码被误删导致崩溃。如果遇到问题,可以在
Linker.xml里添加需要保留的类型。第三步:选择性禁用Xamarin.Essentials的定位模块
如果你必须保留Xamarin.Essentials,可以在初始化的时候明确禁用定位功能,这样Essentials就不会加载定位相关的代码了。在AppDelegate的FinishedLaunching方法里,把初始化代码改成这样:Xamarin.Essentials.Essentials.Initialize(enableGeolocation: false);这个方法需要Xamarin.Essentials 1.6+版本支持,如果你用的是旧版本,先升级到最新稳定版。
第四步:临时添加空描述(应急用)
如果上面的方法都来不及测试,先临时在Info.plist里加上这两个权限的描述,内容写清楚应用不使用定位,比如:NSLocationAlwaysUsageDescription:此应用不需要使用定位服务NSLocationWhenInUseUsageDescription:此应用不需要使用定位服务
虽然这只是权宜之计,但能先让你通过审核,之后再彻底解决问题。
第五步:手动排除CoreLocation框架
如果链接器还是没生效,可以在iOS项目的「iOS Build」标签页里,找到「Additional mtouch arguments」,添加:--linkskip=CoreLocation这个参数会告诉链接器不要链接CoreLocation框架,不过一定要确保你的应用真的完全没用到定位功能,否则运行时会抛出异常。
内容的提问来源于stack exchange,提问作者maciejka




