web-dev-qa-db-ja.com

iOS 10ベータ版で連絡先アドレス帳がクラッシュする

アドレス帳(アプリ内)の連絡先をクリックすると、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パブリックベータでのみクラッシュします。

18
Bangalore

Address Book APIは、よりオブジェクト指向の Contacts Framework を支持して、iOS 9で廃止されました。

ABPeoplePickerViewControllerを使用する代わりに、 CNContactPickerViewController に移動します。

11
erdekhayser

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;
}
11
Elad

Info.plistに「Privacy-Contacts Usage Description」を追加します。

同じ質問がApple Forumsで提起されました。GWesleyによる元の回答は以下のとおりです。

Appleフォーラムスレッド

5
Amith Shaju

次のような有効なキーを提供したかどうかを確認します

@[CNContactFamilyNameKey, CNContactGivenNameKey, CNContactPhoneNumbersKey, CNContactEmailAddressesKey]

cNContactオブジェクトから要求しているとき。

例:contact.emailAddressesを呼び出す必要がある場合は、(CNContactEmailAddressesKey)配列から提供する必要があります。

4
Subhash

iOS 10では、なぜ使用するのかを説明するまで連絡先にアクセスできません。ソースコードとしてplistを開き、dictの下に次のコードを追加して、もう一度実行します。

<key>NSContactsUsageDescription</key>
<string>$(PRODUCT_NAME) uses Contact</string>
4
user3189586

IOS 10では、メディアライブラリ、写真、カメラ、およびこれらのような他のハードウェアにアクセスするためのユーザー権限が必要になりました。この解決策は、データをどのように使用しているかを説明するキーをinfo.plistに追加することです.iOSはすでにマイク、カメラ、およびメディアライブラリにアクセスするためのアクセス許可を必要としました(iOS6、iOS7)が、iOS10以降はアプリ許可を求めている理由の説明を提供しないとクラッシュします。

Info.plistファイルで指定できるすべてのCocoaキーのリストがあります

写真:

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

マイク:

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

カメラ:

Key       :  Privacy - Camera Usage Description   
Value   :  $(PRODUCT_NAME) camera use
1
user1374

Swift

// 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     
    }
1
Luke Bartolomeo

最初にinfo.plistNSContactsUsageDescriptionを追加し、次にのようなAB要求アクセスブロックでコントローラーを提示します。

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