2012-09-21 9 views
17

Trong ứng dụng tôi hiện đang phát triển có sự tương tác giữa người dùng và lịch người dùng, như những gì xảy ra trong nhiều ứng dụng, nội dung rất chuẩn. Tôi đang phải đối mặt với hộp thoại "Ứng dụng này không có quyền truy cập vào lịch của bạn. Bạn có thể bật quyền truy cập trong Cài đặt bảo mật" khi tôi cố gắng thực hiện các chức năng lịch đó nhưng ứng dụng của tôi không không xuất hiện trên cài đặt bảo mật của lịch thiết bị. Có một số api mới tôi cần sử dụng để yêu cầu người dùng cấp quyền truy cập không?Chức năng Lịch ứng dụng Không còn hoạt động trong ios 6

Cảm ơn bạn rất nhiều vì đã giúp tôi giải quyết vấn đề này bất kỳ ai có thể trợ giúp.

Trả lời

28

Tôi tin rằng tôi có cùng một vấn đề chính xác. Tôi đang triển khai Xây dựng nhà phát triển bình thường của ứng dụng tôi đang làm việc trên iPhone 4 của mình với iOS 6.

EDIT: Tôi cuối cùng đã giải quyết nó như thế này, tôi không tìm thấy thông tin trên web mà tôi tìm thấy trong các API.

Chạy phần sau để yêu cầu quyền. Đây rõ ràng là cuộc gọi và truy cập không đồng bộ sẽ không được cấp cho đến khi người dùng đã ủy quyền ứng dụng.

EKEventStore *es = [[EKEventStore alloc] init]; 
[es requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) { 
    /* This code will run when uses has made his/her choice */ 
}]; 

Ngoài ra, bạn có thể chỉ định ứng dụng đang cố gắng làm gì với thông tin trong Info.plist. Có một khóa được gọi là Bảo mật - Lịch sử dụng Mô tả (NSCalendarsUsageDescription) có thể chứa một mô tả chuỗi sẽ được hiển thị trong lời nhắc cho người dùng.

Dưới đây là chi tiết đầy đủ của vấn đề tôi gặp phải (cố định bằng cách trên):

Khi tôi cố gắng ATT một sự kiện vào lịch tôi thấy màn hình sau: Add Event error message

Khi Tôi mở cài đặt cho cài đặt bảo mật lịch, không có ứng dụng nào hiển thị: Settings, Privacy, Calendars

Tất cả điều này khiến tôi nghĩ rằng có một số cài đặt tôi phải đặt trong Info.plist t o cho phép truy cập lịch và yêu cầu người dùng cho phép khi khởi động. Tôi đã tìm kiếm trên web nhưng không tìm thấy gì cả.

@jloewy, tôi đoán đây là vấn đề tương tự bạn đang gặp phải?

+2

làm việc hoàn hảo, cảm ơn bạn! – JLoewy

0

Sẽ có cửa sổ bật lên yêu cầu người dùng cho phép trước khi cho phép ứng dụng truy cập thông tin lịch. Nếu bạn không cho phép ứng dụng truy cập vào lịch, bạn cần cho phép ứng dụng truy cập lịch một cách rõ ràng bằng cách đưa danh sách trắng vào ứng dụng trên cài đặt.

+0

Đó là những gì tôi nghĩ là tốt nhưng không. Tôi đã thử xóa các ứng dụng ra khỏi thiết bị và xây dựng lại nó, nhưng nó không bao giờ bật lên rằng hộp cho phép – JLoewy

+0

nó là trên phần riêng tư trên các thiết lập – serhats

9

Nếu bạn dự định hỗ trợ các thiết bị trước iOS 6, tôi sẽ thêm phần sau nếu không bạn sẽ gặp lỗi.

EKEventStore *store = [[EKEventStore alloc] init];  
if([store respondsToSelector:@selector(requestAccessToEntityType:completion:)]) { 
    [store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) { 
     /* This code will run when uses has made his/her choice */ 
    }]; 
} 
7

Nếu bạn muốn chờ đợi cho người sử dụng để đáp ứng các yêu cầu, người ta có thể thêm một số dòng mã để câu trả lời được chấp nhận:

__block BOOL accessGranted = NO; 

if([store respondsToSelector:@selector(requestAccessToEntityType:completion:)]) { 
    dispatch_semaphore_t sema = dispatch_semaphore_create(0); 
    [store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) { 
     accessGranted = granted; 
     dispatch_semaphore_signal(sema); 
    }]; 
    dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); 
} else { // we're on iOS 5 or older 
    accessGranted = YES; 
} 

if (accessGranted) { 
    // go on 
} 
+0

cảm ơn bạn đã giải pháp –

1

Nó sẽ yêu cầu sự cho phép chỉ một lần và cho lần sau nó nhớ lựa chọn. Nếu bạn không cho phép truy cập vào Lịch thì nó sẽ không hỏi lần sau và sẽ không cho phép thêm sự kiện vào Lịch.

Nếu bạn muốn đặt lại các cài đặt này, bạn phải xóa "Cài đặt bảo mật" và sau đó chỉ nó sẽ yêu cầu quyền khi ứng dụng của bạn cố truy cập lịch bằng API RequestAccessToEntityType.

http://developer.apple.com/library/ios/#documentation/EventKit/Reference/EKEventStoreClassRef/Reference/Reference.html

+0

Vui lòng xem xét thêm liên kết vào tài liệu. –

+0

@ Jeff - Cảm ơn bạn đã đề xuất. Đây là liên kết đến tài liệu về táo liên quan: http://developer.apple.com/library/ios/#documentation/EventKit/Reference/EKEventStoreClassRef/Reference/Reference.html – AnkitJain