簡體   English   中英

IOS 聯系郵政地址 Xamarin.Forms

[英]IOS contact postal address in Xamarin.Forms

我正在 Xamarin.Forms 項目中編寫 C# 應用程序,該項目顯示聯系人姓名和街道地址。 我無法從 CNContact 中提取地址並將聯系人地址分配給字符串。

這將是顯而易見的,但我被困住了!

    public List<Contact> GetContacts()
    {
        contactList = new List<Contact>();

        var store = new Contacts.CNContactStore();

        var ContainerId = new CNContactStore().DefaultContainerIdentifier;
        var predicate = CNContact.GetPredicateForContactsInContainer(ContainerId);

        var fetchKeys = new NSString[] { CNContactKey.Identifier, CNContactKey.GivenName, CNContactKey.FamilyName, CNContactKey.Birthday, CNContactKey.PostalAddresses, CNContactKey.ImageData };

        NSError error;

        var IPhoneContacts = store.GetUnifiedContacts(predicate, fetchKeys, out error);

        foreach(var c in IPhoneContacts)
        {
            var contact = new Contact();

            contact.FirstName = c.GivenName;
            contact.FamilyName = c.FamilyName;

            if(c.PostalAddresses.Length !=0)
            {
                contact.StreetAddress = CNPostalAddressFormatter.GetStringFrom(c.PostalAddresses, CNPostalAddressFormatterStyle.MailingAddress);
            };

            contactList.Add(contact);
        }

        return contactList;
    }

獲取 iOS 中的現有聯系人

首先,您需要在Info.plist添加關注權限:

<key>NSContactsUsageDescription</key>  
<string>This app requires contacts access to function properly.</string>

在此處輸入圖像描述

其次,您可以創建一個 model 包含的需求聯系信息如下:

public class ContactModel
{
    public IList PhoneNumbers { get; set; }
    public string GivenName { get; set; }
    public string FamilyName { get; set; }
}

第三,創建一個函數來獲取信息:

public List<ContactModel> ReadContacts()
{
    var response = new List<ContactModel>();
    try
    {
        //We can specify the properties that we need to fetch from contacts  
        var keysToFetch = new[] {
    CNContactKey.PhoneNumbers, CNContactKey.GivenName, CNContactKey.FamilyName,CNContactKey.PostalAddresses,CNContactKey.PhoneNumbers
};
        //Get the collections of containers  
        var containerId = new CNContactStore().DefaultContainerIdentifier;
        //Fetch the contacts from containers  
        using (var predicate = CNContact.GetPredicateForContactsInContainer(containerId))
        {
            CNContact[] contactList;
            using (var store = new CNContactStore())
            {
                contactList = store.GetUnifiedContacts(predicate, keysToFetch, out
                    var error);
            }
            //Assign the contact details to our view model objects  
            response.AddRange(from item in contactList
                                where item?.EmailAddresses != null
                                select new ContactModel
                                {
                                    PhoneNumbers = item.PhoneNumbers,
                                    PostalAddresses = CNPostalAddressFormatter.GetStringFrom(item.PostalAddresses[0].Value, CNPostalAddressFormatterStyle.MailingAddress),
                                    GivenName = item.GivenName,
                                    FamilyName = item.FamilyName
                                });
        }
    }
    catch (Exception e)
    {
        Console.WriteLine(e);
        throw;
    }
    return response;
}

、調用func:

List<ContactModel> contacts = ReadContacts();
ContactModel contactVm;
for (int i = 0; i < contacts.Count; i++)
{
    contactVm = contacts[i];
    Console.WriteLine("Contact is : " + contactVm.FamilyName);
    Console.WriteLine("Contact is : " + contactVm.GivenName);
    Console.WriteLine("Contact is : " + contactVm.PostalAddresses);
}

...
Contact is : Taylor
Contact is : David
Contact is : 1747 Steuart Street
Tiburon CA 94920
USA

、截圖如下:

在此處輸入圖像描述

====================================Udate============== ========================

您的代碼應修改如下:

public List<Contact> GetContacts()
{
    contactList = new List<Contact>();

    var store = new Contacts.CNContactStore();

    var ContainerId = new CNContactStore().DefaultContainerIdentifier;
    var predicate = CNContact.GetPredicateForContactsInContainer(ContainerId);

    var fetchKeys = new NSString[] { CNContactKey.Identifier, CNContactKey.GivenName, CNContactKey.FamilyName, CNContactKey.Birthday, CNContactKey.PostalAddresses, CNContactKey.ImageData };

    NSError error;

    var IPhoneContacts = store.GetUnifiedContacts(predicate, fetchKeys, out error);

    foreach(var c in IPhoneContacts)
    {
        var contact = new Contact();

        contact.FirstName = c.GivenName;
        contact.FamilyName = c.FamilyName;

        if(c.PostalAddresses.Length !=0)
        {
            contact.StreetAddress = CNPostalAddressFormatter.GetStringFrom(c.PostalAddresses[0].Value, CNPostalAddressFormatterStyle.MailingAddress);
        };

        contactList.Add(contact);
    }

    return contactList;
}

方法CNPostalAddressFormatter.GetStringFrom的屬性postalAddress是一種對象( Contacts.CNPostalAddress ),但是c.PostalAddresses是一種 Array。

public static string GetStringFrom (Contacts.CNPostalAddress postalAddress, Contacts.CNPostalAddressFormatterStyle style);

在此處輸入圖像描述

問題是CNPostalAddressFormatter.GetStringFrom()方法需要一個CNPostalAddress object 作為參數,但您傳遞的是單個聯系人的所有地址,因為PostalAddresses屬性是一個CNLabeledValue<ValueType>對象的數組。

您應該做的是遍歷所有地址,或者默認情況下只取第一個地址。 真的取決於你想要達到的目標。

例如,這將獲得第一個CNPostalAddress

contact.StreetAddress = CNPostalAddressFormatter.GetStringFrom(c.PostalAddresses[0].Value, CNPostalAddressFormatterStyle.MailingAddress);

此外,如果您想知道地址(家庭、工作等)的 label,您可以這樣獲取:

c.PostalAddresses[0].Label

那么實際的CNPostalAddress object 又是這樣的:

c.PostalAddresses[0].Value

暫無
暫無

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

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