2015-10-11 10 views
7

私は、メールアドレス/メールアドレスの電話番号などの連絡先プロパティをユーザーが選択できるように、連絡先のピッカービューコントローラにアクセスする必要のあるiOSアプリを持っています。CNContactProperty - iOS 9からメールを抽出します。

私が今行っている問題は、返されたデータを解析する方法を理解できないことです。 contactPicker didSelectContactPropertyメソッドを使用しましたが、必要なデータを解析できません。

-(void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperty:(CNContactProperty *)contactProperty { 

    CNLabeledValue *test = contactProperty.contact.emailAddresses.firstObject; 
    NSLog(@"%@", test); 

    NSLog(@"%@", contactProperty.contact.phoneNumbers); 
} 

あなたは上記のコードを実行する場合は、次の応答を取得:素晴らしいザッツ

2015-10-11 13:30:07.059 Actions[516:212765] <CNLabeledValue: 0x13656d090: identifier=21F2B1B2-8158-466B-9224-E2036CA07D28, label=_$!<Other>!$_, [email protected]> 2015-10-11 13:30:07.061 App_Name[516:212765] (
    "<CNLabeledValue: 0x13672a500: identifier=6697A0E9-3B91-4566-B26E-83B87979F816, label=_$!<Main>!$_, value=<CNPhoneNumber: 0x13672a660: countryCode=gb, digits=08000391010>>") 

のが、どのように私はそれから必要なデータを抽出していますか?なぜNSLogステートメントがデータを奇妙な形式で返すのですか?

お時間をありがとうございました。

答えて

14

戻り値はCNLabeledValueクラスです。あなたが電話番号を望んでいた値が、これはあなたが取得する方法をされた場合は、電子メール、たとえば、のために、それらから値を取得するためには、この

CNLabeledValue *emailValue = contactProperty.contact.emailAddresses.firstObject; 
NSString *emailString = email.value; 

を行うことので

CNLabeledValue *phoneNumberValue = contactProperty.contact.phoneNumbers.firstObject; 
CNPhoneNumber *phoneNumber = phoneNumberValue.value; 
NSString *phoneNumberString = phoneNumber.stringValue; 

返される値は、あなたはまた、電話番号や電子メールのラベルを取得することができ、CNLabeledValueある

NSString *emailLabel = emailValue.label; //This may be 'Work', 'Home', etc. 
NSString *phoneNumberLabel = phoneNumberValue.label; 
+0

わかりました。本当にありがとう。古いAddressBookフレームワークを使用してアップグレードしたので、これで苦労していました。もう一度ありがとう:) – Supertecnoboff

+1

ちょうど1つの質問、私は電話番号の電子メールアドレスのいずれかを選択するユーザーが期待しています。彼らが何を選択したかを確認するにはどうすればいいですか? – Supertecnoboff

+2

私はその情報が 'contactProperty.value'、' contactProperty.label'、 'contactProperty.key'などに格納されていると思います。私はそれらをそれぞれテストして、出力を見ます個人的に –

0
Here is swift version of Chris answer : 

func fatchContacts(store : CNContactStore) { 
    do 
    { 
    let groups = try store.groups(matching: nil) 
    let predicate = CNContact.predicateForContactsInGroup(withIdentifier: groups[0].identifier) 
    //let predicate = CNContact.predicateForContactsMatchingName("John") 
     let keyToFatch = [CNContactFormatter.descriptorForRequiredKeys(for: .fullName) ,CNContactEmailAddressesKey] as [Any] 
    let contacts = try store.unifiedContacts(matching: predicate, keysToFetch: keyToFatch as! [CNKeyDescriptor])   //------------------------------------------------------ 
    //-------------Get Here----------------------------------------- 
    print(contacts) 
    print(contacts[0]) 
     let formatter = CNContactFormatter() 
     print(formatter.string(from: contacts[0])) 
     print(contacts[0].givenName) 
     print(contacts[0].emailAddresses) 
     let emailValue : CNLabeledValue = contacts[0].emailAddresses.first!; 
     let email = emailValue.value 
     print(email) 




    } 
    catch{ 

    } 
} 


Just pass the CNContactStore object   
0

スイフト3.0の場合:

public func contactPicker(_ picker: CNContactPickerViewController, didSelect contact: CNContact) 
{ 
     if let emailValue : CNLabeledValue = contact.emailAddresses.first 
    { 
     txtEmail.text = emailValue.value as String 
    } 
    if let phoneNumber : CNLabeledValue = contact.phoneNumbers.first 
    { 
     txtMobno.text = phoneNumber.value.stringValue 
    } 
    txtFname.text = contact.givenName + " " + contact.familyName 

} 
関連する問題