使用 AddressBook 框架时,iOS 11 上的应用程序崩溃?

Posted

技术标签:

【中文标题】使用 AddressBook 框架时,iOS 11 上的应用程序崩溃?【英文标题】:application crash on ios 11 when working with AddressBook framework? 【发布时间】:2017-11-05 09:30:47 【问题描述】:

我正在开发 voip 应用程序。获取联系人工作,但当我想拨打电话时,应用程序崩溃。

[ABSAddressBook 联系人]:发送到已释放实例的消息 0x1c1478180 警告:无法执行支持代码读取 Objective-C 类中的数据过程。这可能会降低质量 可用的类型信息。

在这一行发生了崩溃。

NSArray *lContacts = (NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);

    - (void) checkContactListForJogvoiceList 
//    if (![BundleLocalData isLoadingJogvoiceContactList]) 
//        [BundleLocalData setLoadingJogvoiceContactList:true];

        int maxPhoneNumberSubmit = 200;
        NSArray *lContacts = (NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);
        NSMutableDictionary *phoneNumberContactsDictionary = [[NSMutableDictionary alloc] init];
        NSMutableArray *allPhoneNumberList = [[NSMutableArray alloc] init];
        for (id lPerson in lContacts) 
            ABRecordRef person = (ABRecordRef)lPerson;
            NSArray *phoneList = [AppUtil getContactPhoneList:person];
            for (NSString* phoneNumber in phoneList) 
                NSMutableArray* contactList = phoneNumberContactsDictionary[phoneNumber];
                if (!contactList) 
                    contactList = [[NSMutableArray alloc] init];
                
                [contactList addObject:(__bridge ABRecordRef)person];
                phoneNumberContactsDictionary[phoneNumber] = contactList;
            
            [allPhoneNumberList addObjectsFromArray:phoneList];

            if (allPhoneNumberList.count >= maxPhoneNumberSubmit) 
                [self checkContactList:allPhoneNumberList phoneNumberContactsDictionary:phoneNumberContactsDictionary];
            
        

        if (allPhoneNumberList.count > 0) 
            [self checkContactList:allPhoneNumberList phoneNumberContactsDictionary:phoneNumberContactsDictionary];
        


        //        ABAddressBookUnregisterExternalChangeCallback(addressBook, sync_address_book, self);

//        [BundleLocalData setLoadingJogvoiceContactList:false];
//    


可能是因为地址簿框架在 ios9 中已弃用?我对吗? 我不想使用联系人框架。

【问题讨论】:

你是如何初始化addressBook的?由于许可问题,我认为它为零。在访问任何内容之前,您应该检查地址簿权限。 【参考方案1】:

根据 Apple doc ABAddressBookCreateWithOptions 使用地址簿功能 ABAddressBookCreateWithOptions 如果用户未授予权限,则返回 NULL。

在 iOS 6.0 及更高版本上,如果调用者无权访问通讯簿数据库:

对于链接到 iOS 6.0 及更高版本的应用程序,此函数返回 NULL。 对于与早期版本的 iOS 链接的应用程序,此函数返回一个空的只读数据库。

你应该关注这篇文章How do I correctly use ABAddressBookCreateWithOptions method in iOS 6?

【讨论】:

以上是关于使用 AddressBook 框架时,iOS 11 上的应用程序崩溃?的主要内容,如果未能解决你的问题,请参考以下文章

IOS:#import <AddressBook/AddressBookUI.h> 文件未找到

iOS学习笔记29-系统服务通讯录

如何从 Phonegap iOS 项目中删除未使用的框架和库?

通讯录

iOS调用系统通讯录(适配iOS9iOS10)(转载)

使用 iOS Addressbook api 搜索交换联系人