簡體   English   中英

如何獲取iOS 6中用戶的聯系人列表?

[英]How do I get a list of the user's contacts in iOS 6?

我使用以下代碼已有幾年了,並且一直可以正常工作,但是在iOS 6上似乎不再可用。 如何獲取iOS 6設備上所有聯系人的列表?

ABAddressBookRef myAddressBook = ABAddressBookCreate();
        NSMutableArray *people = (__bridge_transfer NSMutableArray *)ABAddressBookCopyArrayOfAllPeople(myAddressBook);
        CFRelease(myAddressBook);

        // repeat through all contacts in the inital array we loaded
        for(int i=0; i<[people count]; i++)
        {
            NSString *aName;
            NSString *firstName = (__bridge_transfer NSString *)ABRecordCopyValue((__bridge ABRecordRef)([people objectAtIndex:i]), kABPersonFirstNameProperty);
            NSString *lastName = (__bridge_transfer NSString *)ABRecordCopyValue((__bridge ABRecordRef)([people objectAtIndex:i]), kABPersonLastNameProperty);

            if (([firstName isEqualToString:@""] || [firstName isEqualToString:@"(null)"] || firstName == nil) &&
                ([lastName isEqualToString:@""] || [lastName isEqualToString:@"(null)"] || lastName == nil))
            {
                // do nothing
            }
            else 
            {
                aName = [NSString stringWithFormat:@"%@ %@", firstName, lastName];

                if ([firstName isEqualToString:@""] || [firstName isEqualToString:@"(null)"] || firstName == nil)
                {
                    aName = [NSString stringWithFormat:@"%@", lastName];
                }

                if ([lastName isEqualToString:@""] || [lastName isEqualToString:@"(null)"] || lastName == nil)
                {
                    aName = [NSString stringWithFormat:@"%@", firstName];
                }

                [self.tableItems addObject:aName];
            }

        }

        [self.tableItems sortUsingSelector:@selector(compare:)];

在ios6中,您需要請求讀取通訊簿的權限,否則將得到nil。 使用這樣的東西:

- (BOOL)askContactsPermission {
    __block BOOL ret = NO;
    if (ABAddressBookRequestAccessWithCompletion != NULL) { // we're on iOS6

        dispatch_semaphore_t sema = dispatch_semaphore_create(0);
        ABAddressBookRef addressBook = ABAddressBookCreate();
        ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
            ret = granted;
            dispatch_semaphore_signal(sema);
        });
        if (addressBook) {
            CFRelease(addressBook);
        }

        dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
        dispatch_release(sema);
    }
    else { // we're on iOS5 or older
        ret = YES;
    }

    return ret;
}

如果此方法返回否,那么運氣不好,您將無法訪問AB。 我在這里用信號燈鎖定,因為如果用戶不允許使用AB,我不想繼續使用我的應用程序。 還有其他方法,只需檢查API。

您確實需要征求用戶的許可,這將在您觸發時提示用戶。 這是使用執行塊來處理結果的另一種方法,如果需要從通用代碼中查詢當前的訪問狀態,也可以使版本的使用不可知。

我像這樣實現一個訪問管理器

AppContactsAccessManager.h

#import <AddressBook/AddressBook.h>

typedef enum
{
    kABAuthStatusNotDetermined = 0,
    kABAuthStatusRestricted,
    kABAuthStatusDenied,
    kABAuthStatusAuthorized,
    kABAuthStatusPending,
}AddressBookAuthStatus;

typedef void (^AddressbookRequestHandler)(ABAddressBookRef addressBookRef, BOOL available);

@interface AppContactsAccessManager : NSObject
{
     AddressBookAuthStatus status;
}
- (void) requestAddressBookWithCompletionHandler:(AddressbookRequestHandler)handler;
- (AddressBookAuthStatus) addressBookAuthLevel;

@end

AppContactsAccessManager.m

@implementation AppContactsAccessManager

- (BOOL) isStatusAvailable:(AddressBookAuthStatus)theStatus
{
    return (theStatus == kABAuthStatusAuthorized || theStatus == kABAuthStatusRestricted);
}

- (void) requestAddressBookWithCompletionHandler:(AddressbookRequestHandler)handler
{
    ABAddressBookRef addressBookRef = NULL;

    if([self isiOS6]){
        addressBookRef = ABAddressBookCreateWithOptions(nil, nil);
        ABAuthorizationStatus curStatus = ABAddressBookGetAuthorizationStatus();
        if(curStatus == kABAuthorizationStatusNotDetermined)
        {
            status = kABAuthStatusPending;
            ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error) {
                status = ABAddressBookGetAuthorizationStatus();
                if(handler != NULL){
                    handler(addressBookRef, [self isStatusAvailable:status]);
                }
            });
        }else
        {
            status = curStatus;
            dispatch_async(dispatch_get_current_queue(), ^{
                if(handler != NULL){
                    handler(addressBookRef, [self isStatusAvailable:status]);
                }
            });
        }
    }else
    {
        addressBookRef = ABAddressBookCreate();
        status = kABAuthStatusAuthorized;
        dispatch_async(dispatch_get_current_queue(), ^{
            if(handler != NULL){
                handler(addressBookRef, [self isStatusAvailable:status]);
            }
            });
        }
}

- (AddressBookAuthStatus) addressBookAuthLevel
{
        return status;
}

@end

用法如下所示:

AppContactsAccessManager* accessMgr = [AppContactsAccessManager new];
[accessMgr requestAddressBookWithCompletionHandler:^(ABAddressBookRef theAddressBookRef, BOOL available) {
    // do your addressbook stuff in here
}];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM