2012-09-21 4 views
17

In der App, die ich derzeit entwickle, gibt es eine Interaktion zwischen dem Benutzer und dem Benutzer Kalender, wie es in vielen Apps passiert, sehr Standard-Sachen. Es funktionierte gut, bis ich auf iOS 6 upgrade. Ich bin jetzt konfrontiert mit der "Diese App hat keinen Zugriff auf Ihre Kalender. Sie können den Zugriff in den Datenschutzeinstellungen aktivieren" -Dialog, wenn ich versuche, diese Kalenderfunktionen noch meine App durchzuführen nicht in den Datenschutzeinstellungen des Gerätekalenders angezeigt. Gibt es eine neue API, die ich verwenden muss, um den Benutzer um Zugriff zu bitten?App Kalender Funktionalität Nicht mehr in iOS 6

Vielen Dank für die Hilfe mit diesem Problem wer helfen kann.

Antwort

28

Ich glaube, ich habe genau das gleiche Problem. Ich stelle einen normalen Entwickler-Build der App, an der ich arbeite, auf meinem iPhone 4 mit iOS 6 bereit.

EDIT: Ich habe es endlich so gelöst, ich habe die Informationen im Web nicht gefunden, aber ich fand es in den APIs.

Führen Sie die folgenden Schritte aus, um eine Berechtigung anzufordern. Dies ist anscheinend ein asynchroner Anruf und der Zugriff wird erst gewährt, wenn der Benutzer die App autorisiert hat.

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

Außerdem können Sie angeben, was die App mit den Informationen in Info.plist zu tun versucht. Es gibt einen Schlüssel namens Privacy - Calendars Usage Description (NSCalendarsUsageDescription), der eine Zeichenfolgebeschreibung enthalten kann, die in der Eingabeaufforderung für den Benutzer angezeigt wird.

Im Folgenden sind die vollständigen Details des Problems I (durch die oben fest) gestoßen:

Wenn ich versuche, ein Ereignis in den Kalender att ich den folgenden Bildschirm sehen: Add Event error message

Wenn ich öffne die Einstellungen für die Kalenderdatenschutzeinstellungen, keine App ist sichtbar: Settings, Privacy, Calendars

Dies alles führt mich zu glauben, dass es eine Einstellung, die ich in Info.plist t setzen müssen o Aktivieren Sie den Kalenderzugriff und fragen Sie den Benutzer beim Starten nach einer Erlaubnis. Ich habe im Internet gesucht, aber nichts gefunden.

@jloewy, ich denke, das ist das gleiche Problem, das Sie haben?

+2

funktioniert perfekt, danke! – JLoewy

0

Es wird ein Popup angezeigt, in dem der Benutzer um Erlaubnis gefragt wird, bevor er der Anwendung den Zugriff auf die Kalenderinformationen ermöglicht. Wenn Sie der Anwendung den Zugriff auf den Kalender nicht gestattet haben, müssen Sie der Anwendung den Zugriff auf den Kalender explizit erlauben, indem Sie die Anwendung in den Einstellungen auf die weiße Liste setzen.

+0

Das ist, was ich dachte, aber es tut es nicht. Ich habe versucht, die App aus dem Gerät zu löschen und neu zu bauen, aber es erscheint nie diese Erlaubnis Box – JLoewy

+0

es ist auf der Privatsphäre Abschnitt Einstellungen – serhats

9

Wenn Sie Geräte vor iOS 6 unterstützen möchten, füge ich Folgendes hinzu: Andernfalls wird ein Fehler angezeigt.

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

Wenn Sie warten wollen für den Benutzer auf die Anforderung zu reagieren, könnte man einige Zeilen Code auf die akzeptierte Antwort hinzu:

__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

danke für die Lösung –

1

Es ist für die Erlaubnis nur einmal fragen und für das nächste Mal erinnert es sich an die Wahl. Wenn Sie den Zugriff auf den Kalender nicht zulassen, werden Sie beim nächsten Mal nicht gefragt und können kein Ereignis zum Kalender hinzufügen.

Wenn Sie diese Einstellungen zurücksetzen möchten, müssen Sie "Datenschutzeinstellungen" löschen und nur dann nach Berechtigungen fragen, wenn Ihre App versucht, mithilfe der API "RequestAccessToEntityType" auf den Kalender zuzugreifen.

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

+0

Bitte beachten Sie einen Link zur Dokumentation hinzuzufügen. –

+0

@Jeff - Vielen Dank für den Vorschlag. Hier ist der Link zur entsprechenden Apple-Dokumentation: http://developer.apple.com/library/ios/#documentation/EventKit/Reference/EKEventStoreClassRef/Reference/Reference.html – AnkitJain