17

私が現在開発中のアプリでは、ユーザーとユーザーのカレンダーの間に相互作用があります。これは、多くのアプリで発生しているように、非常に標準的なものです。iOS 6 にアップグレードするまで正常に動作していました。同じカレンダー機能を実行しようとすると、「このアプリはカレンダーにアクセスできません。プライバシー設定でアクセスを有効にできます」というダイアログが表示されますが、アプリは実行します。デバイスのカレンダーのプライバシー設定には表示されません。ユーザーにアクセス許可を求めるために使用する必要がある新しい API はありますか?

この問題で私を助けてくれてありがとう。

4

5 に答える 5

28

まったく同じ問題があると思います。iOS 6 を搭載した iPhone 4 に、作業中のアプリの通常の開発者ビルドを展開しています。

編集:最終的にこのように解決しました.Web上で情報を見つけられませんでしたが、APIで見つけました.

以下を実行して許可をリクエストします。これは明らかに非同期呼び出しであり、ユーザーがアプリを承認するまでアクセスは許可されません。

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

さらに、アプリが Info.plist の情報を使用して何をしようとしているのかを指定できます。Privacy - Calendars Usage Description (NSCalendarsUsageDescription) というキーがあり、ユーザーへのプロンプトに表示される文字列の説明を含めることができます。

以下は、私が遭遇した問題の完全な詳細です(上記で修正されました):

イベントをカレンダーに添付しようとすると、次の画面が表示されます。 イベントエラーメッセージを追加

カレンダーのプライバシー設定を開くと、アプリが表示されません。 設定、プライバシー、カレンダー

これにより、カレンダーへのアクセスを有効にし、起動時にユーザーに許可を求めるために Info.plist に設定する必要がある設定があると思います。私はウェブを検索しましたが、何も見つかりませんでした。

@jloewy、これはあなたが抱えているのと同じ問題だと思いますか?

于 2012-09-24T10:54:32.537 に答える
9

iOS 6 より前のデバイスをサポートする予定がある場合は、次を追加します。そうしないと、エラーが発生します。

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 */
    }];
}
于 2012-10-09T17:27:45.537 に答える
7

ユーザーがリクエストに応答するのを待ちたい場合は、受け入れられた回答にいくつかのコード行を追加できます。

__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
}
于 2012-12-17T15:22:47.800 に答える
1

一度だけ許可を求め、次回はその選択を記憶します。カレンダーへのアクセスを許可しない場合、次回は確認されず、予定をカレンダーに追加することもできません。

これらの設定をリセットする場合は、「プライバシー設定」を削除する必要があります。その後、アプリが RequestAccessToEntityType API を使用してカレンダーにアクセスしようとすると、アクセス許可が要求されます。

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

于 2012-12-29T20:14:11.800 に答える
0

アプリケーションがカレンダー情報にアクセスできるようにする前に、ユーザーに許可を求めるポップアップが表示されます。アプリケーションがカレンダーにアクセスすることを許可していない場合は、設定でアプリケーションをホワイトリストに登録して、アプリケーションがカレンダーにアクセスすることを明示的に許可する必要があります。

于 2012-09-21T21:13:10.627 に答える