由于缺少 NSCalendarsUsageDescription,iTunes Connect 上传被拒绝,二进制文件无效

Posted

技术标签:

【中文标题】由于缺少 NSCalendarsUsageDescription,iTunes Connect 上传被拒绝,二进制文件无效【英文标题】:iTunes Connect upload rejected with invalid binary because of missing NSCalendarsUsageDescription 【发布时间】:2017-01-19 06:48:09 【问题描述】:

我正在尝试使用 XCode 8 为现有应用上传更新。上传后我收到了这封电子邮件:

“此应用尝试访问隐私敏感数据而无需使用 描述。应用的 Info.plist 必须包含 NSCalendarsUsageDescription 键,带有一个字符串值,用于解释 用户应用程序如何使用这些数据。”

我知道 ios 10 的新隐私政策以及如何添加所需的说明。我的问题是:我没有在我的应用中使用日历。

有没有办法找出 Apple 认为我使用日历的原因?也许它被 Google 的 AdMobSDK 使用了?

【问题讨论】:

我猜当 Apple 扫描您的应用程序是否使用私有 API 时,它还会扫描对 EKEventStore requestAccessToEntityType:completion: 或相关方法的调用。你也可以试试。扫描您的应用或第 3 方框架。 你在使用任何第三方库吗? 我正在使用 GoogleAdMob SDK。没有别的 Admob SDK 也遇到了这个问题 另见***.com/questions/39383289/… 【参考方案1】:

如果您使用 EventKit 框架,这可能会触发您从 Apple 收到的自动拒绝。一种解决方案是删除该框架。

许多广告 SDK,例如 Tapjoy(11.8.1 之前的版本)和 AdMob,都将 EventKit 作为必需的框架。

如果您的应用程序中有 EventKit 框架,因为它是您的广告 SDK 所必需的,我已经看到通过对 .plist 文件的以下修改避免了这种拒绝:

<key>NSCalendarsUsageDescription</key>
<string>Some ad content may access calendar</string>

【讨论】:

【参考方案2】:

我已向 Google 发送了一封电子邮件,抱怨此问题,希望它会在 AdMob SDK 的未来版本中得到解决。在此之前,您可以通过将 NSCalendarsUsageDescription 添加到 info.plist 来解决问题。我也必须对 NSBluetoothPeripheralUsageDescription 做同样的事情。

编辑:添加 NSPhotoLibraryUsageDescription 非常重要,请参阅:https://groups.google.com/forum/#!category-topic/google-admob-ads-sdk/ios/UmeVUDrcDaw

2016 年 9 月 18 日更新:Google 发布了 7.11.0 版本,不再需要这些版本。

【讨论】:

这并不能真正回答您关于 Apple 为何认为您使用日历的问题。 Admob SDK 中的私有方法会尝试访问它。 Apple 正在检查应用程序中包含的所有代码 我也有蓝牙警告。我想知道 Google 想用蓝牙做什么 Google 确认这是 AdMob SDK 的问题:groups.google.com/forum/#!category-topic/google-admob-ads-sdk/… Google 是否有任何更改?【参考方案3】:

Stephen 和 Zachary Drake's 答案是对的 :)

在我这边,我的 xcode 项目每次都会生成,所以这是一种使用 PlistBuddy 从命令行设置这些值的方法(我还需要 NSCameraUsageDescription):

/usr/libexec/PlistBuddy -c "Add :NSCameraUsageDescription string" ./Info.plist || true
/usr/libexec/PlistBuddy -c "Set :NSCameraUsageDescription 'not used'" ./Info.plist

/usr/libexec/PlistBuddy -c "Add :NSCalendarsUsageDescription string" ./Info.plist || true
/usr/libexec/PlistBuddy -c "Set :NSCalendarsUsageDescription 'Some ad content may access calendar'" ./Info.plist

/usr/libexec/PlistBuddy -c "Add :NSPhotoLibraryUsageDescription string" ./Info.plist || true
/usr/libexec/PlistBuddy -c "Set :NSPhotoLibraryUsageDescription 'Some ad content may access photo library'" ./Info.plist

【讨论】:

没有评论的投反对票?。这个答案与Zachary Drake's answer 完全相同,但是当Unity3d 不支持从UI 添加这些时,使用命令行和上面的方法非常有用。 谢谢,这就是我一直在谷歌搜索的!具体来说:/usr/libexec/Plistbuddy -c "Set :NSBluetoothPeripheralUsageDescription 'Connects via BLE to user device'" ./Info.plist【参考方案4】:

使用 Xcode V9 和构建目标 IOS 10.0,我必须将其添加到 local.plist 而不是主应用 plist:

 
     "NSCalendarsUsageDescription" = "This App needs to use your calendar";
 

【讨论】:

以上是关于由于缺少 NSCalendarsUsageDescription,iTunes Connect 上传被拒绝,二进制文件无效的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 由于缺少调试目标

由于缺少位置权限,应用程序在启动时崩溃

由于缺少对象,DACPAC 无法部署

由于缺少 KIF 类,项目无法构建

“场景由于缺少入口点而无法访问并且没有...” - 解决此警告

由于缺少文件,快照无法使用