可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I have a simple app running on ios simulator which will (at some point in the app), prompt the user to authorize the following:
- Location setting
- Address contact book
- Pictures/Albums
Because I am doing automation testing on the iOS simulator (several thousand on virtual machines), is there a way to force iOS simulator to have these permissions already set to yes when the app is installed?
I vaguely remember there was a way to manipulate this using a plist file associated with iOS simulator, but I'm not 100% sure if "its all in my head". I'm not finding much on google. I will appreciate any help.
回答1:
There's some discussion here on this topic. I'll quote the relevant portion for posterity:
For CoreLocation, you can just call the following private method at some point before your first use:
[CLLocationManager setAuthorizationStatus:YES forBundleIdentifier:[[NSBundle mainBundle] bundleIdentifier]]
Privacy alerts for contacts, photos and the calendar are handled differently. These can be set via TCCAccessSetForBundle
from TCC.framework
, but this function is not callable from within the same app whose privacy settings you're attempting to modify AFAICT.
Instead, you can just sign your app with these entitlements:
com.apple.private.tcc.allow.overridablekTCCServiceAddressBookkTCCServiceCalendarkTCCServicePhotos
To hide your app from the Simulator's Privacy Settings screens, replace com.apple.private.tcc.allow.overridable
with com.apple.private.tcc.allow
.
You probably don't want to include these entitlements in your AppStore build.
(Make sure to take this stuff out when you submit your app - or only include it in your debug target - because it won't pass app review.)
回答2:
Based on the comment by Felipe Sabino above I worked out the following. The permissions file of iOS for XCode 6 is stored at location: ~/Library/Developer/CoreSimulator/Devices//data/Library/TCC/TCC.db
. So we modify the db file using sqlite3 on the console.
Used the following Perl script from terminal. This could be done in any language really.
$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\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 }
This one overrides kTCCServiceAddressBook
permission, but there is also kTCCServiceCalendar
and kTCCServicePhotos
.