Контактный почтовый адрес IOS в Xamarin.Forms - PullRequest
0 голосов
/ 31 октября 2019

Я пишу приложение на C # в проекте Xamarin.Forms, которое отображает имя контакта и почтовый адрес. У меня проблемы с извлечением адреса из 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;
    }

Ответы [ 2 ]

0 голосов
/ 31 октября 2019

Проблема в том, что метод CNPostalAddressFormatter.GetStringFrom() ожидает один объект CNPostalAddress в качестве параметра, но вы передаете все адреса одного контакта, поскольку свойство PostalAddresses является массивомCNLabeledValue<ValueType> объектов.

Что вам нужно сделать, это перебрать все адреса или, возможно, просто взять первый по умолчанию. Действительно зависит от того, чего вы хотите достичь.

Например, это будет первое CNPostalAddress:

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

Также, если вы хотите узнать метку адреса (Home, Работа и т. Д.), Вы можете получить это так:

c.PostalAddresses[0].Label

Тогда фактический объект CNPostalAddress снова будет таким:

c.PostalAddresses[0].Value
0 голосов
/ 31 октября 2019

Извлечение существующих контактов в iOS:

Сначала , вам необходимо добавить разрешение на подписку в Info.plist:

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

enter image description here

Второй , вы можете создать модель, содержащую потребности контактную информациюследующим образом:

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

Пятый , снимок экрана следующим образом:

enter image description here

=================================== 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;
}

Свойство postalAddress метода CNPostalAddressFormatter.GetStringFrom - это тип объекта (Contacts.CNPostalAddress), однако c.PostalAddresses - это тип массива.

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

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...