Ios 意外的应用商店拒绝:缺少NSMotionUsageDescription和NSContactUsageDescription的Info.Plist

Ios 意外的应用商店拒绝:缺少NSMotionUsageDescription和NSContactUsageDescription的Info.Plist,ios,xcode,cordova,ionic-framework,app-store,Ios,Xcode,Cordova,Ionic Framework,App Store,我已经提交了11个相关(功能完全相同)的cordova应用程序,这些应用程序都很好,经过多次迭代。突然,我从苹果那里得到了一个拒绝(更新): 缺少Info.plist密钥-此应用尝试访问 没有使用说明的隐私敏感数据。应用程序的 Info.plist必须包含带有 向用户解释应用程序如何使用此数据的字符串值 缺少Info.plist密钥-此应用尝试访问 没有使用说明的隐私敏感数据。应用程序的 Info.plist必须包含带有字符串的NSMotionUsageDescription密钥 向用户解释应用

我已经提交了11个相关(功能完全相同)的cordova应用程序,这些应用程序都很好,经过多次迭代。突然,我从苹果那里得到了一个拒绝(更新):

缺少Info.plist密钥-此应用尝试访问 没有使用说明的隐私敏感数据。应用程序的 Info.plist必须包含带有 向用户解释应用程序如何使用此数据的字符串值

缺少Info.plist密钥-此应用尝试访问 没有使用说明的隐私敏感数据。应用程序的 Info.plist必须包含带有字符串的NSMotionUsageDescription密钥 向用户解释应用程序如何使用此数据的值

自最初发布以来,我没有添加任何功能。然而,我注意到,当爱奥尼亚生成Xcode项目时,我刚刚创建的一个全新应用程序自动卡在这些Plist条目中

我认为这是因为我是用iOS 9目标创建的,而以前所有的应用程序都是用iOS 8目标创建的

我的问题是:这是iOS 9的突然要求吗?如果我正在使用这些东西,我怎么才能知道我的应用程序中需要它们

我担心这些会以许可请求或通知的形式向用户显示,这是不可取的

以下是我的插件列表:

com.dawsonloudon.videoplayer 1.0.0 "VideoPlayer"
com.passslot.cordova.plugin.passbook 0.1.0 "Passbook"
com.telerik.plugins.nativepagetransitions 0.6.5 "Native Page Transitions"
com.unarin.cordova.beacon 3.4.1 "Proximity Beacon Plugin"
cordova-plugin-app-event 1.2.0 "Application Events"
cordova-plugin-appavailability 0.4.2 "AppAvailability"
cordova-plugin-badge 0.7.2 "Badges"
cordova-plugin-bluetooth-serial 0.4.5 "Bluetooth Serial"
cordova-plugin-camera 2.1.1 "Camera"
cordova-plugin-console 1.0.7 "Console"
cordova-plugin-customurlscheme 4.1.5 "Custom URL scheme"
cordova-plugin-device 1.1.1 "Device"
cordova-plugin-facebook4 1.7.4 "Facebook Connect"
cordova-plugin-file 4.1.1 "File"
cordova-plugin-file-transfer 1.5.0 "File Transfer"
cordova-plugin-geolocation 2.1.0 "Geolocation"
cordova-plugin-google-analytics 0.8.1 "Google Universal Analytics Plugin"
cordova-plugin-inappbrowser 1.3.0 "InAppBrowser"
cordova-plugin-network-information 1.2.0 "Network Information"
cordova-plugin-splashscreen 3.2.1 "Splashscreen"
cordova-plugin-statusbar 2.1.2 "StatusBar"
cordova-plugin-vibration 2.1.0 "Vibration"
cordova-plugin-whitelist 1.0.0 "Whitelist"
cordova-plugin-x-socialsharing 5.1.1 "SocialSharing"
cordova-sqlite-storage 2.0.4 "Cordova sqlite storage plugin"
cordova.plugins.diagnostic 3.6.5 "Diagnostic"
ionic-plugin-keyboard 2.2.1 "Keyboard"
jaeger.Html5Video 1.2.2 "Html5Video"
org.nypr.cordova.hockeyappplugin 0.1.0 "Device"
org.nypr.cordova.nslogger-cocoalumberjack-connector-plugin 0.1.0 "Device"
pushwoosh-cordova-plugin 6.5.3 "Pushwoosh"

您必须向info.plist添加一个属性,该属性的键为NSContactsUsageDescription,值为您向用户演示的文本,向用户解释您为什么要访问该属性。NSMotionUsageDescription也一样

它将自动成为隐私-运动使用说明。两个人都做,你就完了


我希望有帮助

自iOS 10以来,如果您的应用程序正在请求相关功能(),则必须在.plist中包含使用说明

因此,许多插件现在以某种形式包含这些键,包括列表中的一些插件。例如,cordova plugin camera允许指定
nsCamerauseDescription
并为其中许多设置默认占位符

但是,在.plist中包含这些密钥并不意味着它们包含的消息将自动作为权限请求显示给用户。只有当您通过插件调用相关的本机iOS方法时,才会显示它们。 例如,在
NSMotionUsageDescription
的情况下,仅当您调用诊断插件功能时,才会显示其中包含的消息

当iOS应用包含本机调用以使用需要UsageDescription的功能,但plist中不存在此类使用说明密钥时,会发生应用商店拒绝。 例如,在
NSMotionUsageDescription
的情况下,如果您的应用程序包含对本机函数的调用,但plist中不包含
NSMotionUsageDescription
,则在将二进制文件上载到iTunes Connect时,您的应用程序将被拒绝。 我假设苹果公司使用一些软件,在上传时扫描你的应用程序二进制文件,以检查对相关API函数的调用,并检查是否存在相应的UsageDescription plist条目

对于本机iOS应用程序,您只需删除(或不添加)对未使用的API函数的调用,即,如果您的应用程序不需要跟踪运动,则不包括对
CMMotionActivityManager.startActivityUpdatesToQueue的调用

但是,对于Cordova应用程序,您只需从本机代码中删除一步,本机代码包括安装插件。例如,如果将cordova诊断插件安装到cordova项目中,您的应用程序包含对
CMMotionActivityManager.startActivityUpdatesToQueue的调用,因为这是。如果你的应用程序真的调用了插件API函数,而插件API函数又调用了本机函数,这并不重要,事实上它存在于你的应用程序代码中。因此,
NSMotionUsageDescription
必须出现在.plist中,以防止应用商店拒绝,因此为什么cordova诊断插件会为该密钥添加占位符消息。但是,如上所述,除非您调用,否则该权限请求不会显示给用户


请注意,您可以使用-自定义插件添加的默认UsageDescription消息。

谢谢。我想我的问题更多的是为什么会有这种突然的需求,以及我如何发现我的应用程序的哪个部分正在使用这些。IE:NSMotionUsageDescription是请求位置服务的一部分吗?其中一个库可能使用CoreMotion