2

アドレスブックがios6.0のアプリによって最初にアクセスされたかどうかをどのように検出できるかを尋ねたい. アプリが再インストールされたかどうかに関係なく、システムは最初のインストールと最初の起動がアプリの最初の起動であるとのみ認識していることを知りました。問題は、アプリが UIAlertView を使用して AddressBook にアクセスできるようにユーザーに通知したいということですが、このアラートビューはシステムのアラートビューの直後に表示されます。この状態を回避するにはどうすればよいですか。どんな助けでも大歓迎です。

4

3 に答える 3

2

基本的に無視してABAddressBookRequestAccessWithCompletionください。それは役に立たない。データベースにアクセスできるかどうかを知りたい場合は、 に電話してABAddressBookGetAuthorizationStatus()ください。

さらなる議論

ABAddressBookRequestAccessWithCompletionユーザーからのアドレス帳へのアクセスを要求するようにドキュメントで言われています。しかし、そうではありません。私は今、それABAddressBookRequestAccessWithCompletionが役に立たないことを示します。次の 2 つの状況があります。

(1) まったく未知の新規アプリの場合ABAddressBookRequestAccessWithCompletionは、お手上げです: アプリがアドレス帳にアクセスしようとすると、自動的にユーザーにアクセスを要求しますので、ABAddressBookRequestAccessWithCompletion.

(2) ユーザーがアクセスを拒否または許可した場合、操作はABAddressBookRequestAccessWithCompletion不要です。呼び出しても何も起こりません。アクセス要求アラートを表示しません。

これABAddressBookRequestAccessWithCompletionは単なるバグであり、無視する必要があります。

主要な修正

編集iOS 6.1 では、この動作が変更されたようです。(iOS 6.0 での私のテストは有効だったと思いますが、有効であると信じるに足る十分な理由があります。) しかし、iOS 6.1 ではABAddressBookCreateWithOptions、認証アラートが表示されることはありません。それを表示させる唯一の方法は、 ABAddressBookRequestAccessWithCompletion!を使用することです。したがって、この機能は今や不可欠です。ABAddressBookGetAuthorizationStatusそのアクセスが不明な場合は、電話する必要ABAddressBookRequestAccessWithCompletionがあります。そうしないと、アクセスできません。

于 2012-12-02T17:36:58.793 に答える
1

私はこの方法で解決しました。

__block BOOL accessGranted;
- (IBAction)accessAddressBook:(id)sender {
    CFErrorRef  error;
    ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL,&error);

    ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
//        accessGranted = granted;
        if (!accessGranted && !granted) {
            UIAlertView * alertView = [[UIAlertView alloc]initWithTitle:@"Deny Access" message:@"Deny" delegate:self cancelButtonTitle:nil otherButtonTitles:@"cancel", nil];
            [alertView show];
            [alertView release];
        }
    });
}


- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if ([alertView.message isEqualToString:@"use contact"] || alertView.message == @"use contact") {
        accessGranted = YES;
    }
}
于 2012-10-10T01:22:54.947 に答える
0

ABAddressBookRequestAccessWithCompletion() を呼び出すと、システムはすでにアラートを表示しています。独自の文字列でシステム アプリを拡張するだけです。

InfoPlist.strings に以下が含まれている必要があります。

 "NSContactsUsageDescription" = "Tap 'OK' or this app is useless.";
于 2012-12-14T21:20:48.573 に答える