2015-02-10 17 views
7

Tôi có một ứng dụng đơn giản chạy trên ios giả lập mà sẽ (tại một số điểm trong ứng dụng), nhắc nhở người dùng cho phép như sau:iOS Alerts phép - loại bỏ hoặc surpressing

  1. Location thiết
  2. Địa chỉ xúc cuốn sách
  3. Hình/Album

Bởi vì tôi đang làm thử nghiệm tự động hóa trên giả lập iOS (vài ngàn trên máy ảo), là có một cách để buộc iOS mô phỏng để có những pe rmissions đã được đặt thành có khi ứng dụng được cài đặt?

Tôi mơ hồ nhớ có một cách để thao tác điều này bằng cách sử dụng tệp plist được liên kết với trình mô phỏng iOS, nhưng tôi không chắc chắn 100% nếu "tất cả trong đầu của tôi". Tôi không tìm thấy nhiều trên google. Tôi sẽ đánh giá cao sự giúp đỡ nào.

+1

Không phải là câu trả lời, nhưng một con đường có thể là kiểm tra cơ sở dữ liệu quyền tại '~/Library/Developer/CoreSimulator/Devices//data/Library/TCC/TCC.db' có thể cung cấp cho bạn gợi ý về cách cập nhật cơ sở dữ liệu sqlite trước khi bạn bắt đầu kiểm tra.Xin vui lòng cho chúng tôi biết nếu điều đó làm việc ra :) –

+1

@ FelipeSabino tôi đã thử nó và nó đã làm việc. Tôi đặt những gì tôi đã làm dưới đây –

+0

@ FelipeSabino giải pháp của bạn làm việc tuyệt vời cho Dịch vụ vị trí. Bạn cũng biết cơ sở dữ liệu kiểm soát cảnh báo notificaiton? –

Trả lời

5

Dựa trên những nhận xét của Felipe Sabino ở trên tôi đã làm việc sau đây. Tệp quyền của iOS cho XCode 6 được lưu trữ tại vị trí: ~/Library/Developer/CoreSimulator/Devices/<device>/data/Library/TCC/TCC.db. Vì vậy, chúng tôi sửa đổi tệp db bằng cách sử dụng sqlite3 trên bảng điều khiển.

Sử dụng tập lệnh Perl sau từ thiết bị đầu cuối. Điều này có thể được thực hiện bằng bất kỳ ngôn ngữ nào.

$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 
} 

một này ghi đè kTCCServiceAddressBook phép, nhưng cũng là kTCCServiceCalendarkTCCServicePhotos.

+0

Có một số điều cần lưu ý: Trình mô phỏng bạn muốn sử dụng cần được khởi chạy ít nhất một lần (cơ sở dữ liệu được tạo sau đó). 'danh sách simctl' trả về kết quả có thể đọc được của con người, rất khó để phân tích cú pháp. Thay vì sử dụng 'tìm. -name TCC' (ở đâu "." là thư mục thiết bị) – TAKeanice

+2

Tôi đã làm việc đó trong https://github.com/SocialbitGmbH/SwiftAddressBook. Xem '.travis.yml' và kịch bản lệnh' allowAccess' để tham chiếu – TAKeanice

+0

Nhân tiện, để cấp quyền truy cập Thư viện iTunes, hãy sử dụng khóa 'kTCCServiceMediaLibrary' – yano

9

Có một số discussion here về chủ đề này. Tôi sẽ báo giá phần có liên quan cho hậu thế:

Đối CoreLocation, bạn chỉ có thể gọi phương thức tin sau tại một thời điểm nào trước khi sử dụng lần đầu tiên của bạn:

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

cảnh báo bảo mật cho danh bạ, hình ảnh và lịch được xử lý khác nhau. Chúng có thể được đặt qua TCCAccessSetForBundle từ TCC.framework, nhưng chức năng này không thể gọi được từ trong số cùng một ứng dụng có cài đặt bảo mật mà bạn đang cố gắng sửa đổi AFAICT.

Thay vào đó, bạn chỉ có thể đăng ký ứng dụng của bạn với những quyền lợi:

<?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> 

Để ẩn ứng dụng của bạn từ màn hình Cài đặt bảo mật của Simulator, thay com.apple.private.tcc.allow.overridable với com.apple.private.tcc.allow.

Có thể bạn không muốn bao gồm các quyền này trong bản dựng AppStore của mình.

(Hãy chắc chắn để đưa công cụ này ra khi bạn gửi ứng dụng của bạn - hoặc chỉ bao gồm nó trong mục tiêu debug của bạn -. Bởi vì nó sẽ không vượt qua rà soát ứng dụng)

+0

+1 Liên kết tốt. Cảm ơn. Thao tác này sẽ hoạt động đối với các phiên bản XCode cũ hơn. Phương pháp của họ dường như đã lỗi thời với XCode mới. Tôi hiện đang xem xét một cách khác để giải quyết vấn đề này dựa trên nhận xét của https://stackoverflow.com/users/429521 ở trên. –

+0

@Jai Bạn đang gặp phải lỗi nào với phương pháp này? –

+0

Các vấn đề giống với những người dùng gặp phải trong liên kết bạn đã đăng. Các cảnh báo vẫn hiển thị trên màn hình. Tôi nghĩ nó là do XCode cuối cùng hoạt động khác nhau. Tuy nhiên, người dùng trên đã đề cập đến tệp db. Điều này dường như hoạt động (đối với các cảnh báo địa chỉ/lịch/ảnh). Tôi hiện đang cố gắng làm điều này thông qua một kịch bản shell. Đối với cảnh báo vị trí, tôi đã triển khai danh mục để bỏ qua tất cả cùng nhau. Tôi không thể sử dụng phương pháp không có giấy tờ cho ứng dụng này. –

Các vấn đề liên quan