应用程序的 Info.plist 文件应包含一个 NSBluetoothAlwaysUsageDescription 键,而该键位于 plist 文件中
Posted
技术标签:
【中文标题】应用程序的 Info.plist 文件应包含一个 NSBluetoothAlwaysUsageDescription 键,而该键位于 plist 文件中【英文标题】:The app's Info.plist file should contain a NSBluetoothAlwaysUsageDescription key while the key is in the plist file 【发布时间】:2019-09-18 12:01:48 【问题描述】:首先,我想声明我已经查看了Stack Overflow post here,添加 iCoder 和 Deepak 中提到的任何一个都没有解决我的问题。
我正在使用 React-Native 开发我的应用程序,包括我找到的这个 React-Native-Permissions 包。他们的文档指出我应该添加他们的包启用的所有权限,例如位置,相机和那里提到的所有其他内容。完成此操作后,我可以将我的应用程序上传到商店并提交以供审核。
今天我到了办公室,看到有一些来自 Apple 的反馈。因此,在我完成反馈后,我想再次重新上传到商店(按照我应该做的那样增加内部版本号)。
现在我不断收到上面提到的标题中的消息,而我的 info.plist 中也有这样的消息
<key>NSBluetoothAlwaysUsageDescription</key>
<string>Our app does not request this permission or utilize this functionality but it is included in our info.plist since our app utilizes the react-native-permissions library, which references this permission in its code.</string>
编辑:
我希望澄清以下内容,以便找到我所面临问题的答案。标题中给出的错误是在上传到商店后直接发生的(所以我猜测实际的错误是系统自动检查的)。
下面的答案无法帮助我解决问题,因为自动系统检查不会检查更具描述性的字符串。我已经成功地将这个字符串用于 info.plist 中的其他元素。在此旁边,我发现人们使用这种策略成功地将他们的应用程序提交到应用程序商店的证据。正如 Gradner 在此链接 React Native Permission issue 266 后的评论所示
【问题讨论】:
描述字符串应该是不言自明的。尝试将您的描述字符串更改为指定您的应用程序需要此权限的原因。例如“我们的应用程序需要访问您的蓝牙才能通过蓝牙连接” 嗯,就是这样。由于我使用 ReactNativePermissions 包来处理权限,因此项目中有代码需要我将密钥添加到 info.plist。但是,我永远不会向用户请求此权限。为了澄清事情,我在上传后从自动检查中得到了这个错误,而不是审查过程提供的反馈 如果您的问题已得到解答,请确保接受并投票以供进一步参考。 @MikeSli - 我不使用 React-Native,但快速查看“权限”包和问题/讨论,我建议分叉存储库并删除你不使用的存储库'不使用(如蓝牙)。这样你就不必大惊小怪了。 @MikeSli - 我在上传构建时也遇到了同样的问题,所以首先我从info.plist
的下拉列表中添加了NSBluetoothPeripheralUsageDescription
然后他们也以同样的原因拒绝了二进制文件所以我做了什么将 info.plist 作为源代码打开,并将NSBluetoothPeripheralUsageDescription
替换为NSBluetoothAlwaysUsageDescription
键,最终被接受。
【参考方案1】:
如果您不使用蓝牙,
只需将其添加到您的 Info.plist 文件中:
<key>NSBluetoothAlwaysUsageDescription</key>
<string>Our app does not request this permission or utilize this functionality but it is included in our info.plist since our app utilizes the react-native-permissions library, which references this permission in its code.</string>
Apple 弃用了 NSBluetoothPeripheralUsageDescription 属性,转而支持 NSBluetoothAlwaysUsageDescription。
在此处查看详细信息: link to Apple docs
如果您使用的是蓝牙,
只需将其添加到您的 Info.plist 文件中:
<key>NSBluetoothAlwaysUsageDescription</key>
<string>Our app uses bluetooth to find, connect and transfer data between different devices</string>
【讨论】:
我不知道为什么这不是答案。 不知道,但多亏了这个,我得到了一个罕见的徽章:民粹主义者【参考方案2】:有人发布了一个对我有帮助的答案,但随后将其删除!套用答案:
在不知道是什么触发 Apple 错误的情况下将隐私密钥添加到 plist 并不是解决此问题的最佳方法。
就我而言,当我进行 grep 搜索时,我发现我的 project.pbxproj
中有一些对 CoreBluetooth.framework
的引用。我删除了引用,构建和 TestFlight 上传成功!
使用以下命令进行搜索:
grep -r -a CoreBluetooth.framework ProjectFolder
【讨论】:
我同意这个解决方案是考虑到用户的最佳方案。虽然目前这不是我使用的解决方案。当我为我的应用程序启动第一个带有错误修复的更新时,我会考虑这样做。或者我可能会考虑分叉回购并删除我不使用的权限。目前我认为上面的答案是最好的,所以我将其标记为正确的答案 我跑了grep -r -a CoreBluetooth.framework ./*
,但什么也没找到。只有使用 CoreBluetooth.framework 才会触发此警告,还是我必须查找其他短语?
这并不能真正解决问题?如果它在 info.plist 中,为什么它会抱怨权限?
上面的 grep 命令生成了一堵难以破译的文本墙,但这个命令更能帮助我找出哪个二进制文件有引用:grep -r -H --binary CoreBluetooth.framework ./*
【参考方案3】:
我找到了根本原因
我们在 plist 中有以下两个默认选项来输入蓝牙使用情况。
1.Privacy - 蓝牙外设使用说明 2.隐私 - 蓝牙始终使用说明
但 Xcode 将这个选项保存在源代码中,如下所示
1.NSBluetoothPeripheralUsageDescription 代替Privacy - 蓝牙外设使用说明
2.Privacy - Bluetooth Always Usage Description 而不是 Privacy - Bluetooth Always Usage Description
所以现在的重点是 NSBluetoothPeripheralUsageDescription 已弃用,它需要密钥“NSBluetoothAlwaysUsageDescription”
这是解决方案,在 Xcode 中将 plist 文件作为源代码打开,然后 复制粘贴下面的键值对
键:NSBluetoothAlwaysUsageDescription 值:此应用程序 需要蓝牙才能大声疾呼。
【讨论】:
嗯,这就是我必须将它们都包含在 info.plist 文件中才能工作的事情。尽管第一次在他们两个都在场的情况下上传它是行不通的。这可能是一个简单的错字,但在这些情况下,我总是复制这些值以确保它是正确的【参考方案4】:我不知道为什么第一次它不起作用,但是当我今天进入办公室时,我看到 Sumeet.Jain 发布的评论建议我应该更换
NSBluetoothPeripheralUsageDescription 键和 NSBluetoothAlwaysUsageDescription 键
这实际上会导致一个错误,如我们预期的那样缺少 NSBluetoothPeripheralUsageDescription。然后我将 NSBluetoothPeripheralUsageDescription 重新添加到我的 info.plist 中,现在我终于可以将我的应用程序上传到商店了。感谢所有帮助过我的人。
附言与昨天相比,我唯一能想到的不同之处在于,我现在使用 Xcode 添加了密钥,而不是仅在我用于 react-native 的编辑器中编辑 info.plist 文件。希望这对其他人有所帮助,因为它帮助了我
【讨论】:
【参考方案5】:好吧,我解决了这个问题。
如果您的应用使用蓝牙,则必须将其添加到 info.plist。
NSBluetoothAlwaysUsageDescription
我们的应用程序使用蓝牙...做某事...
如果您的应用不需要蓝牙但意外提示。
然后:
打开 Xcode: 去移除CoreBluetooth.framework:
-
-> 你的项目 -> 框架 -> CoreBluetooth.framework
-> yourproject -> Build Phases -> 键入 Search 以查找“蓝牙”(删除所有相关的“蓝牙”)
这对我有用! 希望能帮到你。
【讨论】:
【参考方案6】:当应用程序打开时,我能够成功删除蓝牙权限警报。就我而言,问题出在库“react-native-connectivity-status”上。我将库从版本“1.5.2”降级为“1.5.1”。
步骤如下:
改变
"react-native-connectivity-status": "^1.5.1",
到
"react-native-connectivity-status": "1.5.1",
然后运行以下命令:
rm -rf node_modules/
rm package-lock.json
npm i
cd ios/
rm -rf Pods/
pod install
【讨论】:
【参考方案7】:对于早于 iOS 13 的部署目标,将 NSBluetoothAlwaysUsageDescription 和 NSBluetoothPeripheralUsageDescription 添加到应用的信息属性列表文件中
字符串取决于你是否使用蓝牙。
<key>NSBluetoothAlwaysUsageDescription</key>
<string>Our app does not request this permission or utilize this functionality but it is included in our info.plist since our app utilizes some library, which references this permission in its code.</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>Our app does not request this permission or utilize this functionality but it is included in our info.plist since our app utilizes some library, which references this permission in its code.</string>
【讨论】:
以上是关于应用程序的 Info.plist 文件应包含一个 NSBluetoothAlwaysUsageDescription 键,而该键位于 plist 文件中的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS 上运行的 plist 文件出现问题:Info.plist:在第 44 行遇到意外元素(plist 只能包含一个对象)
Info.plist 中的 UIRequiredDeviceCapabilities 键设置为应用程序不会安装在 iPad 上
应用的 Info.plist 必须包含一个 NSContactsUsageDescription 键