2016-11-21 6 views
0

Я хочу получить все контактные данные в iOS Xamarin. я использовал код ->https://developer.xamarin.com/recipes/ios/shared_resources/contacts/find_a_contact/Как получить запись всех контактов в ios xamarin

Код: Код

public override void ViewDidLoad() 
    { 
     base.ViewDidLoad(); 
     Util.CurrentView = this; 
     _View = this; 

     var predicate = CNContact.GetPredicateForContacts("Appleseed"); 
     var fetchKeys = new NSString[] { CNContactKey.GivenName, CNContactKey.FamilyName }; 
     var store = new CNContactStore(); 
     NSError error; 
     var contacts = store.GetUnifiedContacts(predicate, fetchKeys, out error); 
    } 

Ошибка:

This Error: Foundation.MonoTouchException: Objective-C exception thrown. Name: NSInvalidArgumentException Reason: +[CNContact predicateForContactsMatchingName:]: unrecognized selector sent to class 0x1a3e1ec

Я уже добавить [Export("predicateForContactsMatchingName:")], но это не помогло.

+0

не может воспроизвести. –

ответ

0

"Appleseed" - поисковый запрос, используемый в примере. Похоже, ваше несоответствие связано с тем, что ни один из контактов не соответствует предикату.

В любом случае, во время моей собственной реализации я столкнулся со многими проблемами. Ниже приведено полное решение для получения всех контактов в iOS Xamarin.

Первое: Добавить разрешение в info.plist

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

Второе: Создание модели для контактов Информация

В приведенном ниже примере я только добавить 3 поля

using System.Collections; 

/// <summary> 
/// 
/// </summary> 
namespace YourNameSpace 
{ 
    /// <summary> 
    /// 
    /// </summary> 
    public class UserContact 
    { 
     public UserContact() 
     { 
     } 

     /// <summary> 
     /// 
     /// </summary> 
     /// <param name="givenName"></param> 
     /// <param name="familyName"></param> 
     /// <param name="emailId"></param> 
     public UserContact(string givenName, string familyName, IList emailId) 
     { 
      GivenName = givenName; 
      FamilyName = familyName; 
      EmailId = emailId; 
     } 

     public bool IsSelected { get; set; } 
     public string GivenName { get; set; } 
     public string FamilyName { get; set; } 
     public IList EmailId { get; set; } 
    } 
} 

Третий: ознакомьтесь с контактными данными

public IEnumerable<UserContact> GetAllContactsAndEmails() 
     { 
      var keysTOFetch = new[] { CNContactKey.GivenName, CNContactKey.FamilyName, CNContactKey.EmailAddresses }; 
      NSError error; 
      CNContact[] contactList; 
      var ContainerId = new CNContactStore().DefaultContainerIdentifier; 
      using (var predicate = CNContact.GetPredicateForContactsInContainer(ContainerId)) 

      using (var store = new CNContactStore()) 
      { 
       contactList = store.GetUnifiedContacts(predicate, keysTOFetch, out error); 
      } 
      var contacts = new List<UserContact>(); 

      foreach (var item in contactList) 
      { 
       if (null != item && null != item.EmailAddresses) 
       { 
        contacts.Add(new UserContact 
        { 
         GivenName = item.GivenName, 
         FamilyName = item.FamilyName, 
         EmailId = item.EmailAddresses.Select(m => m.Value.ToString()).ToList() 
        }); 
       } 
      } 
      return contacts; 
     } 

Убедитесь, что вы включили контакт атрибуты вам нужно в KeysToFetch массиве