首页 文章

在iOS 10测试版上联系地址簿崩溃

提问于
浏览
16

当点击地址簿中的任何联系人(在我的应用程序内)时,它在iOS 10测试版上崩溃并在iOS 9版本上运行良好;

这是崩溃日志

*** Terminating app due to uncaught exception 'CNPropertyNotFetchedException', reason: 'A property was not requested when contact was fetched.'
*** First throw call stack:
(0x1cf11a07 0x1c62af63 0x1cf1194d 0x246f0f4f 0x246c6a71 0x1ce355eb 0x1ce2e19b 0x246c69cf 0x246c6883 0x25e4a375 0x2538f283 0x254204ef 0x25420bb1 0xe9da97 0xe9da83 0xea2321 0x1cecf18f 0x1cecd477 0x1ce1e6bd 0x1ce1e549 0x1e54ebfd 0x21f961e3 0x21f90947 0x966c9 0x1ca9e507)
libc++abi.dylib: terminating with uncaught exception of type NSException

以下是在我的应用程序中打开地址簿的代码:

-(void)showContactPicker {
__weak RecieverSelectorViewController *weakSelf = self;
    ABPeoplePickerNavigationController* picker = [[ABPeoplePickerNavigationController alloc] init];
    picker.peoplePickerDelegate = self;
    picker.modalPresentationStyle = UIModalPresentationFullScreen;
    picker.modalTransitionStyle = UIModalPresentationPopover;
    [self presentViewController:picker
                       animated:YES
                     completion:^{
                         [weakSelf hideLoadingAnimation];

                         // animation to show view controller has completed.
                     }];
}



- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier {
    [self setSelectedPerson:person];
}

- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker didSelectPerson:(ABRecordRef)person {
    [self setSelectedPerson:person];
}

-(void)setSelectedPerson:(ABRecordRef)person {


    NSString *contactName = CFBridgingRelease(ABRecordCopyCompositeName(person));

    ABMultiValueRef phoneRecord = ABRecordCopyValue(person, kABPersonPhoneProperty);
    CFStringRef phoneNumber = ABMultiValueCopyValueAtIndex(phoneRecord, 0);

    self.isSenderReciever = NO;

    NSString *phone = [PorterUtils
                       extraLast10DigitsFromDigitString:[PorterUtils
                                                         extractNumberFromText:(__bridge_transfer NSString *)phoneNumber]];




    //Handling Social Media Contacts - Crash

    if(contactName.length>0 && phone.length>0){

      [self setRecieverName:contactName
                   number:phone];
       CFRelease(phoneRecord);
    }

}

它只在iOS 10公共测试版上崩溃 .

8 回答

  • 11

    首先在 info.plist 中添加 NSContactsUsageDescription 然后在AB请求访问块中显示控制器 .

    ABAddressBookRequestAccessWithCompletion(contactPicker, { success, error in
      if success {
        self.presentViewController(self.contactPicker, animated: true, completion: nil)
      }
    })
    
  • 2

    在我们提到为什么我们使用它之前,iOS 10不允许访问联系人 . 打开你的plist作为源代码在dict下面添加以下代码现在再次运行它 .

    <key>NSContactsUsageDescription</key>
    <string>$(PRODUCT_NAME) uses Contact</string>
    
  • 11

    IOS 10现在需要用户权限才能访问媒体库,照片,相机和其他硬件 . 解决方案是将他们的密钥添加到info.plist中,其中包含用户说明我们如何使用他们的数据,iOS早先已经需要权限来访问麦克风,摄像头和媒体库(iOS6,iOS7),但是从iOS10到应用程序如果您没有提供描述为什么要求获得许可,则会崩溃 .

    There is a list of all Cocoa Keys that you can specify in your Info.plist file

    Photo :

    Key       :  Privacy - Photo Library Usage Description    
    Value   :  $(PRODUCT_NAME) photo use
    

    Microphone :

    Key        :  Privacy - Microphone Usage Description    
    Value    :  $(PRODUCT_NAME) microphone use
    

    Camera :

    Key       :  Privacy - Camera Usage Description   
    Value   :  $(PRODUCT_NAME) camera use
    
  • 4

    将“隐私 - 联系人使用说明”添加到您的info.plist .

    Apple论坛也提出了同样的问题 . GWesley的原始答案如下 .

    Apple Forum thread

  • 0

    在iOS 9中不推荐使用Address Book API,而是支持面向对象的Contacts Framework .

    而不是使用ABPeoplePickerViewController,移动到CNContactPickerViewController .

  • 0

    检查您是否提供了有效的密钥

    @[CNContactFamilyNameKey, CNContactGivenNameKey, CNContactPhoneNumbersKey, CNContactEmailAddressesKey]
    

    当他们从CNContact对象请求时 .

    例如:如果你需要调用contact.emailAddresses,它必须从(CNContactEmailAddressesKey)数组中提供 .

  • 5

    尝试使用CNContactPickerViewController(iOS9及以上版本):

    添加ContactsUI.framework,导入框架,声明委托CNContactPickerDelegate .

    实施它(在Objective-C中):

    CNContactPickerViewController *peoplePicker = [[CNContactPickerViewController alloc] init];
        peoplePicker.delegate = self;
        NSArray *arrKeys = @[CNContactPhoneNumbersKey]; //display only phone numbers
        peoplePicker.displayedPropertyKeys = arrKeys;
        [self presentViewController:peoplePicker animated:YES completion:nil];
    

    委托示例:

    - (void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperty:(CNContactProperty *)contactProperty{ 
    
        CNPhoneNumber *phoneNumber = contactProperty.value;
        NSString *phoneStr = phoneNumber.stringValue;
    }
    
  • 0

    Swift 3

    // This example allows the display and selection of email addresses only.
    if #available(iOS 9.0, *) {
        let picker = CNContactPickerViewController()
        let arrKeys = [CNContactEmailAddressesKey] // array of properties to display
        picker.displayedPropertyKeys = arrKeys
        picker.delegate = self
        present(picker, animated: true, completion: nil)
    }
    

    代表示例

    @available(iOS 9.0, *)
        func contactPicker(_ picker: CNContactPickerViewController, didSelect contactProperty: CNContactProperty) {
            let emailAddress = contactProperty.value as? String     
        }
    

相关问题