C# IOS联系人的邮政地址(Xamarin.Forms)
我正在Xamarin.Forms项目中编写一个C#应用程序,其中显示联系人姓名和街道地址。我无法从CNContact中提取地址并将联系人地址分配给字符串 这将是显而易见的,但我被卡住了C# IOS联系人的邮政地址(Xamarin.Forms),c#,ios,xamarin,xamarin.forms,xamarin.ios,C#,Ios,Xamarin,Xamarin.forms,Xamarin.ios,我正在Xamarin.Forms项目中编写一个C#应用程序,其中显示联系人姓名和街道地址。我无法从CNContact中提取地址并将联系人地址分配给字符串 这将是显而易见的,但我被卡住了 public List<Contact> GetContacts() { contactList = new List<Contact>(); var store = new Contacts.CNContactStore();
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;
}
public List GetContacts()
{
contactList=新列表();
var store=新联系人。CNContactStore();
var ContainerId=新的CNContactStore().DefaultContainerIdentifier;
var predicate=CNContact.GetPredicateForContactsInContainer(ContainerId);
var fetchKeys=new NSString[]{CNContactKey.Identifier,CNContactKey.GivenName,CNContactKey.FamilyName,CNContactKey.Birthday,CNContactKey.PostalAddresses,CNContactKey.ImageData};
n误差;
var IPhoneContacts=store.GetUnifiedContacts(谓词、fetchkey、out错误);
foreach(IPhoneContacts中的var c)
{
var触点=新触点();
contact.FirstName=c.GivenName;
contact.FamilyName=c.FamilyName;
如果(c.PostalAddresses.Length!=0)
{
contact.StreetAddress=CNPostalAddressFormatter.GetStringFrom(c.postalAddress,CNPostalAddressFormatterStyle.MailingAddress);
};
联系人列表。添加(联系人);
}
返回联系人列表;
}
在iOS中:
首先,您需要在Info.plist
中添加跟随权限:
<key>NSContactsUsageDescription</key>
<string>This app requires contacts access to function properly.</string>
第三个,创建函数以获取信息:
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;
}
问题在于
CNPostalAddressFormatter.GetStringFrom()
方法需要单个对象作为参数,但您正在传递单个联系人的所有地址,因为该属性是CNLabeledValue
对象的数组
您应该做的是迭代所有地址,或者默认情况下只取第一个地址。这取决于你想要实现什么
例如,这将获得第一个CNPostalAddress
:
contact.StreetAddress = CNPostalAddressFormatter.GetStringFrom(c.PostalAddresses[0].Value, CNPostalAddressFormatterStyle.MailingAddress);
此外,如果您想知道地址标签(家庭、工作等),您可以这样获得:
c.PostalAddresses[0].Label
那么实际的CNPostalAddress
对象也是这样:
c.PostalAddresses[0].Value
我遇到的问题是街道地址,而不是电话号码。我编写的上述代码适用于联系人的所有其他元素。为了简化这个论坛的代码,我删除了图片和生日的代码。@Newbee抱歉没有指出原因。我会更新答案。蒂莫·萨洛姆基的答案是正确的。谢谢。你是最棒的!不客气,请记住将正确答案标记为已回答:)
public static string GetStringFrom (Contacts.CNPostalAddress postalAddress, Contacts.CNPostalAddressFormatterStyle style);
contact.StreetAddress = CNPostalAddressFormatter.GetStringFrom(c.PostalAddresses[0].Value, CNPostalAddressFormatterStyle.MailingAddress);
c.PostalAddresses[0].Label
c.PostalAddresses[0].Value