我有一个在 ios 模拟器上运行的简单应用程序,它将(在应用程序中的某个位置)提示用户授权以下内容:
- 位置设置
- 地址通讯录
- 图片/专辑
因为我在 iOS 模拟器上进行自动化测试(虚拟机上有几千个),有没有办法强制 iOS 模拟器在安装应用程序时将这些权限设置为是?
我隐约记得有一种方法可以使用与 iOS 模拟器关联的 plist 文件来操作它,但我不能 100% 确定“这一切都在我的脑海中”。我在谷歌上找不到太多东西。
我有一个在 ios 模拟器上运行的简单应用程序,它将(在应用程序中的某个位置)提示用户授权以下内容:
因为我在 iOS 模拟器上进行自动化测试(虚拟机上有几千个),有没有办法强制 iOS 模拟器在安装应用程序时将这些权限设置为是?
我隐约记得有一种方法可以使用与 iOS 模拟器关联的 plist 文件来操作它,但我不能 100% 确定“这一切都在我的脑海中”。我在谷歌上找不到太多东西。
这里有一些关于这个话题的讨论。我将为后代引用相关部分:
对于 CoreLocation,您可以在第一次使用之前的某个时间点调用以下私有方法:
[CLLocationManager setAuthorizationStatus:YES forBundleIdentifier:[[NSBundle mainBundle] bundleIdentifier]]
联系人、照片和日历的隐私警报的处理方式不同。这些可以通过
TCCAccessSetForBundle
from 设置TCC.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 构建中包含这些权利。
(确保在提交应用程序时取出这些东西 - 或仅将其包含在调试目标中 - 因为它不会通过应用程序审查。)
根据上面 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
权限,但也有kTCCServiceCalendar
and kTCCServicePhotos
。