【问题标题】:iOS permission Alerts - removing or suppressingiOS 权限警报 - 删除或抑制
【发布时间】:2015-04-11 04:30:56
【问题描述】:

我有一个在 ios 模拟器上运行的简单应用程序,它将(在应用程序中的某个位置)提示用户授权以下内容:

  1. 位置设置
  2. 通讯录
  3. 图片/相册

因为我在 iOS 模拟器上进行自动化测试(虚拟机上有几千个),有没有办法强制 iOS 模拟器在安装应用程序时将这些权限设置为是?

我隐约记得有一种方法可以使用与 iOS 模拟器关联的 plist 文件来操作它,但我不能 100% 确定“这一切都在我的脑海中”。我在谷歌上找不到太多东西。

【问题讨论】:

  • 不是答案,但可能的方法是检查~/Library/Developer/CoreSimulator/Devices/<device>/data/Library/TCC/TCC.db 的权限数据库,这可能会提示您在开始测试之前如何更新该 sqlite 数据库。如果可行,请告诉我们:)
  • @FelipeSabino 我试过了,它奏效了。我把我所做的放在下面
  • @FelipeSabino 您的解决方案非常适合定位服务。您还知道控制通知警报的数据库吗?

标签: ios objective-c ios-simulator ios-permissions


【解决方案1】:

根据上面 Felipe Sabino 的评论,我制定了以下内容。 Xcode 6 的 iOS 权限文件存储在位置:~/Library/Developer/CoreSimulator/Devices/<device>/data/Library/TCC/TCC.db。所以我们在控制台使用sqlite3修改db文件。

从终端使用以下 Perl 脚本。这真的可以用任何语言来完成。

$folderLocations = `xcrun simctl list`; // running "xcrun simctl list" on terminal returns iOS device locations 
$currentUserID = `id -un`;              // get current user
chomp($currentUserID);                  // remove extra white space from user string
print "currentUserID: $currentUserID";  // debug logs

while($folderLocations =~ /iPad Air \((.{8}-.*?)\)/g) { // Use regex to loop through each iPad Air device found in $folderLocations. Insert the permissions in the database of each. 
    print "folderLocations <1>: $1\n";  // debug logs
    `sqlite3 /Users/$currentUserID/Library/Developer/CoreSimulator/Devices/$1/data/Library/TCC/TCC.db "insert into access values('kTCCServiceAddressBook','com.apple.store.MyApp', 0, 1, 0, 0)"`;
    print "\n";  // neat logs
}

这个覆盖kTCCServiceAddressBook权限,但也有kTCCServiceCalendarkTCCServicePhotos

【讨论】:

  • 有一些注意事项: 您要使用的模拟器需要至少启动一次(然后创建数据库)。 simctl list 返回人类可读的输出,很难解析。而是使用find . -name TCC(其中“.”是设备文件夹)
  • 我已经在 github.com/SocialbitGmbH/SwiftAddressBook 中解决了这个问题。请参阅 .travis.ymlallowAccess 脚本以供参考
  • 顺便说一句,要授予 iTunes 库访问权限,请使用密钥 kTCCServiceMediaLibrary
【解决方案2】:

关于这个话题有一些discussion here。我会为后代引用相关部分:

对于 CoreLocation,您只需调用以下私有方法 在您第一次使用之前的某个时间点:

[CLLocationManager setAuthorizationStatus:YES 
                      forBundleIdentifier:[[NSBundle mainBundle] bundleIdentifier]]

处理联系人、照片和日历的隐私警报 不同。这些可以通过TCCAccessSetForBundleTCC.framework,但是这个函数不能从 您尝试修改 AFAICT 的隐私设置的同一应用。

相反,您可以使用以下权利为您的应用签名:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.private.tcc.allow.overridable</key>
    <array>
        <string>kTCCServiceAddressBook</string>
        <string>kTCCServiceCalendar</string>
        <string>kTCCServicePhotos</string>
    </array>
</dict>
</plist>

要在模拟器的隐私设置屏幕中隐藏您的应用, 将com.apple.private.tcc.allow.overridable 替换为 com.apple.private.tcc.allow.

您可能不想在您的 AppStore 中包含这些权利 构建。

(确保在提交应用时取出这些东西 - 或仅将其包含在调试目标中 - 因为它不会通过应用审查。)

【讨论】:

  • +1 好链接。谢谢。这适用于旧版本的 XCode。然而,他们的方法在新的 XCode 中似乎已经过时了。我目前正在根据上面stackoverflow.com/users/429521 的评论寻找另一种解决此问题的方法。
  • @Jai 这种方法有什么错误?
  • 问题与您发布的链接中的用户遇到的问题相同。警报仍显示在屏幕上。我认为这是由于最后一个 XCode 的行为不同。然而,上面的用户提到了一个 db 文件。这似乎有效(对于地址/日历/照片警报)。我目前正在尝试通过 shell 脚本来做到这一点。对于位置警报,我实现了一个类别来一起绕过它。不幸的是,我无法为此应用程序使用未记录的方法。
  • @Jai 好的,我将在此问题开放 48 小时后发布赏金,以尝试获得更新的答案。
  • 知道如何以同样的方式获得授权通知吗?以下都不起作用:kTCCServiceNotifications、kTCCServiceNotification、kTCCServiceLocalNotification、kTCCServiceLocalNotifications
猜你喜欢
  • 2021-02-11
  • 2018-07-27
  • 1970-01-01
  • 2018-04-28
  • 2017-08-24
  • 1970-01-01
  • 2017-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多