Xamarin.iOS'ta Kişiler ve ContactsUI
Bu makale, bir Xamarin.iOS uygulamasındaki yeni Kişiler ve Kişiler kullanıcı arabirimi çerçeveleriyle çalışmayı kapsar. Bu çerçeveler, iOS'un önceki sürümlerinde kullanılan mevcut Adres Defteri ve Adres Defteri kullanıcı arabiriminin yerini almaktadır.
iOS 9'un tanıtmasıyla birlikte Apple, iOS 8 ve önceki sürümler tarafından kullanılan mevcut Adres Defteri ve Adres Defteri kullanıcı arabirimi çerçevelerinin yerini alan iki yeni çerçeve ve ContactsContactsUI yayımlamıştı.
İki yeni çerçeve aşağıdaki işlevleri içerir:
Kişiler - Kullanıcının kişi listesi verilerine erişim sağlar. Çoğu uygulama yalnızca salt okunur erişime ihtiyaç olduğundan, bu çerçeve iş parçacığı güvenli, salt okunur erişim için en iyi duruma getirilmiştir.
ContactsUI - iOS cihazlarda kişileri görüntülemek, düzenlemek, seçmek ve oluşturmak için Xamarin.iOS kullanıcı arabirimi öğelerini sağlar.
Önemli
iOS 8 (ve öncesi) tarafından kullanan mevcut ve çerçeveler iOS 9'da kullanım dışı bırakıldı ve mevcut AddressBookAddressBookUIContacts Xamarin.iOS uygulaması için mümkün olan en kısa sürede yeni ve çerçevelerle ContactsUI değiştirılmalıdır. Yeni uygulamalar çerçevelere karşı yazıldığına ilişkin bir senaryo.
Aşağıdaki bölümlerde bu yeni çerçevelere ve bunları bir Xamarin.iOS uygulamasında nasıl uygulayacağız?
Kişiler Çerçevesi
Kişiler Çerçevesi, kullanıcının iletişim bilgilerine Xamarin.iOS erişimi sağlar. Çoğu uygulama yalnızca salt okunur erişime ihtiyaç olduğundan, bu çerçeve iş parçacığı güvenli, salt okunur erişim için en iyi duruma getirilmiştir.
Kişi Nesneleri
sınıfı bir kişinin Ad, Adres veya İş Parçacığı Numaraları gibi özelliklerine iş parçacığı CNContact güvenli ve salt Telefon sağlar. CNContact ve gibi işlevler, birden çok salt okunur özellik NSDictionary koleksiyonu (adresler veya telefon numaraları gibi) içerir:
Birden çok değere (e-posta adresi veya telefon numarası gibi) sahip herhangi bir özellik için, bunlar bir nesne dizisi olarak temsil NSLabeledValue eder. NSLabeledValue , etiketin değeri kullanıcıya tanımladığı salt okunur bir etiket ve değer kümesi (örneğin Giriş veya İş e-postası) içeren iş parçacığı güvenli bir tupledir. Kişiler çerçevesi, uygulamanıza kullanabileceğiniz önceden tanımlanmış etiketler (ve statik sınıflar aracılığıyla) sağlar veya kendi ihtiyaçlarınıza göre özel etiketler CNLabelKeyCNLabelPhoneNumberKey tanımlama seçeneğiniz vardır.
Mevcut bir kişinin değerlerini ayarlaması (veya yenilerini oluşturması) gereken herhangi bir Xamarin.iOS uygulaması için, sınıfının ve alt sınıflarının NSMutableContact (örneğin) sürümünü CNMutablePostalAddress kullanın.
Örneğin, aşağıdaki kod yeni bir kişi oluşturacak ve bunu kullanıcının kişi koleksiyonuna ekleyecek:
// Create a new Mutable Contact (read/write)
var contact = new CNMutableContact();
// Set standard properties
contact.GivenName = "John";
contact.FamilyName = "Appleseed";
// Add email addresses
var homeEmail = new CNLabeledValue<NSString>(CNLabelKey.Home, new NSString("john.appleseed@mac.com"));
var workEmail = new CNLabeledValue<NSString>(CNLabelKey.Work, new NSString("john.appleseed@apple.com"));
contact.EmailAddresses = new CNLabeledValue<NSString>[] { homeEmail, workEmail };
// Add phone numbers
var cellPhone = new CNLabeledValue<CNPhoneNumber>(CNLabelPhoneNumberKey.iPhone, new CNPhoneNumber("713-555-1212"));
var workPhone = new CNLabeledValue<CNPhoneNumber>("Work", new CNPhoneNumber("408-555-1212"));
contact.PhoneNumbers = new CNLabeledValue<CNPhoneNumber>[] { cellPhone, workPhone };
// Add work address
var workAddress = new CNMutablePostalAddress()
{
Street = "1 Infinite Loop",
City = "Cupertino",
State = "CA",
PostalCode = "95014"
};
contact.PostalAddresses = new CNLabeledValue<CNPostalAddress>[] { new CNLabeledValue<CNPostalAddress>(CNLabelKey.Work, workAddress) };
// Add birthday
var birthday = new NSDateComponents()
{
Day = 1,
Month = 4,
Year = 1984
};
contact.Birthday = birthday;
// Save new contact
var store = new CNContactStore();
var saveRequest = new CNSaveRequest();
saveRequest.AddContact(contact, store.DefaultContainerIdentifier);
// Attempt to save changes
NSError error;
if (store.ExecuteSaveRequest(saveRequest, out error))
{
Console.WriteLine("New contact saved");
}
else
{
Console.WriteLine("Save error: {0}", error);
}
Bu kod bir iOS 9 cihazında çalıştır olursa kullanıcının koleksiyonuna yeni bir kişi eklenir. Örnek:
Kişi Biçimlendirme ve Yerelleştirme
Kişiler çerçevesi, içeriği biçimlendiren ve kullanıcıya görüntü için yerelleştirmeye yardımcı olan çeşitli nesneler ve yöntemler içerir. Örneğin, aşağıdaki kod bir kişi adını ve posta adresini görüntülenmek için doğru şekilde biçimlendirer:
Console.WriteLine(CNContactFormatter.GetStringFrom(contact, CNContactFormatterStyle.FullName));
Console.WriteLine(CNPostalAddressFormatter.GetStringFrom(workAddress, CNPostalAddressFormatterStyle.MailingAddress));
Uygulamanın kullanıcı arabiriminde görüntüleyecek özellik etiketleri için Contact çerçevesinin bu dizeleri yerelleştirmeye ilişkin yöntemleri de vardır. Bu da uygulamanın çalıştırta olduğu iOS cihazın geçerli yerel durumuna dayalıdır. Örnek:
// Localized properties
Console.WriteLine(CNContact.LocalizeProperty(CNContactOptions.Nickname));
Console.WriteLine(CNLabeledValue<NSString>.LocalizeLabel(CNLabelKey.Home));
Mevcut Kişileri Getirme
sınıfının bir örneğini CNContactStore kullanarak, kullanıcının kişi veritabanından iletişim bilgilerini getirebilirsiniz. , veritabanından kişileri ve grupları getirmek veya CNContactStore güncelleştirmek için gereken tüm yöntemleri içerir. Bu yöntemler zaman uyumlu olduğundan, kullanıcı arabirimini engellemesini engellemek için bunları bir arka plan iş parçacığında çalıştırmaniz önerilir.
Hazırlıkları (sınıfından) CNContact kullanarak, veritabanından kişileri getirirken döndürülen sonuçları filtreleyebilirsiniz. Yalnızca dizesini içeren kişileri getirmek Appleseed için aşağıdaki kodu kullanın:
// Create predicate to locate requested contact
var predicate = CNContact.GetPredicateForContacts("Appleseed");
Önemli
Genel ve bileşik terimler Kişiler çerçevesi tarafından desteklanmaz.
Örneğin, getirmeyi yalnızca ilgili kişinin GivenName ve FamilyName özellikleriyle sınırlamak için aşağıdaki kodu kullanın:
// Define fields to be searched
var fetchKeys = new NSString[] {CNContactKey.GivenName, CNContactKey.FamilyName};
Son olarak, veritabanında arama yapmak ve sonuçları geri almak için aşağıdaki kodu kullanın:
// Grab matching contacts
var store = new CNContactStore();
NSError error;
var contacts = store.GetUnifiedContacts(predicate, fetchKeys, out error);
Bu kod yukarıdaki Kişiler Nesnesi bölümünde oluşturduğum örnekten sonra çalıştırıldısa, az önce oluşturduğum "John Appleseed" ilgili kişisi geri döner.
Erişim Gizliliği ile İletişim Kurma
Son kullanıcılar, uygulama başına iletişim bilgilerine erişim izni verip reddedene kadar, uygulamasına ilk kez bir çağrıda bulundurarak uygulamanıza erişim izni vermelerini isteyen bir iletişim CNContactStore kutusu görüntülenir.
İzin isteği yalnızca bir kez, uygulama ilk kez çalıştır seçildiğinde ve sonraki çalıştırmalarda veya çağrısında kullanıcının o anda seçili olduğu CNContactStore izni kullanır.
Uygulamanızı, ilgili kişi veritabanına erişimi reddeden kullanıcının uygun şekilde işlemesi için tasarlamanız gerekir.
Kısmi Kişileri Getirme
Kısmi Kişi, ilgili kişi mağazasından yalnızca bazı kullanılabilir özelliklerin getiril olduğu bir kişidir. Daha önce getirilemedi özelliğine erişmeye çalışsanız, bu bir özel durumla sonuçlandır.
Örneğin veya yöntemlerini kullanarak, verilen bir kişinin istenen özele sahip olup IsKeyAvailableAreKeysAvailable olamay olduğunu kolayca kontrol CNContact edin. Örnek:
// Does the contact contain the requested key?
if (!contact.IsKeyAvailable(CNContactOption.PostalAddresses)) {
// No, re-request to pull required info
var fetchKeys = new NSString[] {CNContactKey.GivenName, CNContactKey.FamilyName, CNContactKey.PostalAddresses};
var store = new CNContactStore();
NSError error;
contact = store.GetUnifiedContact(contact.Identifier, fetchKeys, out error);
}
Önemli
sınıfının GetUnifiedContact ve yöntemleri yalnızca sağlanan getirme GetUnifiedContactsCNContactStoreGetUnifiedContact istenen özelliklerle sınırlı bir Kısmi Kişi getirir.
Birleşik Kişiler
Bir kullanıcı, kişi veritabanında (iCloud, Facebook veya Google Mail gibi) tek bir kişi için farklı iletişim bilgileri kaynaklarına sahip olabilir. iOS ve OS X uygulamalarına bu iletişim bilgileri otomatik olarak birlikte bağlanacak ve kullanıcıya tek bir Birleşik Kişi olarak görüntülenecektir:
Bu Birleşik Kişi, bağlantı iletişim bilgilerine kendi benzersiz tanımlayıcısını (gerekirse kişiyi yeniden almak için kullanılmalıdır) verilecek geçici, bellek içinde bir görünümdedir. Varsayılan olarak, Kişiler çerçevesi mümkün olduğunda bir Birleşik Kişi geri döner.
Kişi Oluşturma ve Güncelleştirme
Yukarıdaki Kişi Nesneleri bölümünde gördüğümüz gibi, daha sonra bir kullanarak kullanıcının kişi veritabanına yazılan yeni kişiler oluşturmak için bir ve örneği CNMutableContactCNSaveRequest kullanırsınız:
// Create a new Mutable Contact (read/write)
var contact = new CNMutableContact();
// Set standard properties
contact.GivenName = "John";
contact.FamilyName = "Appleseed";
// Save new contact
var store = new CNContactStore();
var saveRequest = new CNSaveRequest();
saveRequest.AddContact(contact, store.DefaultContainerIdentifier);
NSError error;
if (store.ExecuteSaveRequest(saveRequest, out error)) {
Console.WriteLine("New contact saved");
} else {
Console.WriteLine("Save error: {0}", error);
}
, CNSaveRequest birden çok kişi ve grup değişikliğini tek bir işlemde önbelleğe almak ve bu değişiklikleri üzerinde toplu olarak çalıştırmak için de CNContactStore kullanılabilir.
Bir getirme işlemiyle alınan değiştirilemeyen bir ilgili kişiyi güncelleştirmek için, önce değiştirerek ve kişi deposuna geri kaydederek değiştirilemeyen bir kopya talep edin. Örnek:
// Get mutable copy of contact
var mutable = contact.MutableCopy() as CNMutableContact;
var newEmail = new CNLabeledValue<NSString>(CNLabelKey.Home, new NSString("john.appleseed@xamarin.com"));
// Append new email
var emails = new NSObject[mutable.EmailAddresses.Length+1];
mutable.EmailAddresses.CopyTo(emails,0);
emails[mutable.EmailAddresses.Length+1] = newEmail;
mutable.EmailAddresses = emails;
// Update contact
var store = new CNContactStore();
var saveRequest = new CNSaveRequest();
saveRequest.UpdateContact(mutable);
NSError error;
if (store.ExecuteSaveRequest(saveRequest, out error)) {
Console.WriteLine("Contact updated.");
} else {
Console.WriteLine("Update error: {0}", error);
}
Değişiklik Bildirimlerine Başvur
Bir kişi her değiştirildiğinde, Kişi Deposu Varsayılan Bildirim CNContactStoreDidChangeNotification Merkezi'ne bir gönderisi yayınlar. Önbelleğe aldıysanız veya şu anda herhangi bir kişi görüntüleniyorsa, bu nesneleri Kişi Deposundan () yenilemeniz CNContactStore gerekir.
Kapsayıcılar ve Gruplar
Kullanıcının kişileri kullanıcının cihazında yerel olarak veya bir veya daha fazla sunucu hesabından cihaza eşitlenen kişiler olarak (Facebook veya Google gibi) var olabilir. Her kişi havuzunun kendi Kapsayıcısı vardır ve verilen kişi yalnızca bir kapsayıcıda mevcut olabilir.
Bazı Kapsayıcılar Kişiler'in bir veya daha fazla Grup veya Alt Grup halindedüzenlemesine olanak sağlar. Bu davranış, verilen bir Kapsayıcı için arka depoya bağlıdır. Örneğin, iCloud'da yalnızca bir Kapsayıcı vardır ancak çok sayıda Grup (Alt Grup yoktur) olabilir. Microsoft Exchange ise grupları desteklemez, ancak birden çok Kapsayıcıya sahip olabilir (her bir kapsayıcı Exchange klasörü).
ContactsUI Çerçevesi
Uygulamanın özel bir kullanıcı arabirimi sunmayacak olduğu durumlarda, Xamarin.iOS uygulamanıza kişi eklemek, düzenlemek, seçmek ve oluşturmak üzere kullanıcı arabirimi öğelerini sunmak için ContactsUI çerçevesini kullanabilirsiniz.
Apple'ın yerleşik denetimlerini kullanarak, Xamarin.iOS uygulamanıza Kişiler'i desteklemek için oluşturmanız gereken kod miktarını azaltmakla birlikte uygulamanın kullanıcılarına tutarlı bir arabirim sunabilirsiniz.
Kişi Seçici Görünüm Denetleyicisi
Kişi Seçici Görünüm Denetleyicisi ( ), kullanıcının kişinin Kişi Veritabanından bir Kişi veya Kişi özelliği seçmesi için standart Kişi Seçici CNContactPickerViewController Görünümünü yönetir. Kullanıcı bir veya daha fazla kişi (kullanımına bağlı olarak) öğesini seçer ve Kişi Seçici Görünüm Denetleyicisi seçiciyi görüntülemeden önce izin isteminde bulunanı seçmez.
sınıfını çağırmadan önce, kullanıcının hangi özellikleri seçerek Kişi Özellikleri'nin görüntü ve seçimini kontrol CNContactPickerViewController etmek için hangi hazırlıkları tanımlayabilirsiniz.
Kullanıcının seçiciyle etkileşimine yanıt vermek için sınıfından CNContactPickerDelegate devralan bir örneğini kullanın. Örnek:
using System;
using System.Linq;
using UIKit;
using Foundation;
using Contacts;
using ContactsUI;
namespace iOS9Contacts
{
public class ContactPickerDelegate: CNContactPickerDelegate
{
#region Constructors
public ContactPickerDelegate ()
{
}
public ContactPickerDelegate (IntPtr handle) : base (handle)
{
}
#endregion
#region Override Methods
public override void ContactPickerDidCancel (CNContactPickerViewController picker)
{
Console.WriteLine ("User canceled picker");
}
public override void DidSelectContact (CNContactPickerViewController picker, CNContact contact)
{
Console.WriteLine ("Selected: {0}", contact);
}
public override void DidSelectContactProperty (CNContactPickerViewController picker, CNContactProperty contactProperty)
{
Console.WriteLine ("Selected Property: {0}", contactProperty);
}
#endregion
}
}
Kullanıcının veritabanındaki kişilerden bir e-posta adresi seçmesine izin vermek için aşağıdaki kodu kullanabilirsiniz:
// Create a new picker
var picker = new CNContactPickerViewController();
// Select property to pick
picker.DisplayedPropertyKeys = new NSString[] {CNContactKey.EmailAddresses};
picker.PredicateForEnablingContact = NSPredicate.FromFormat("emailAddresses.@count > 0");
picker.PredicateForSelectionOfContact = NSPredicate.FromFormat("emailAddresses.@count == 1");
// Respond to selection
picker.Delegate = new ContactPickerDelegate();
// Display picker
PresentViewController(picker,true,null);
Kişi Görünümü Denetleyicisi
Kişi Görünümü Denetleyicisi ( CNContactViewController ) sınıfı, son kullanıcıya standart bir Kişi Görünümü sunmak için bir denetleyici sağlar. Kişi görünümü yeni, Bilinmeyen veya Mevcut kişileri görüntülenebilir ve doğru statik oluşturucu ( , , ) çağrılarak görünüm görüntülenmeden önce FromNewContact tür FromUnknownContactFromContact belirtilmelidir. Örneğin:
// Create a new contact view
var view = CNContactViewController.FromContact(contact);
// Display the view
PresentViewController(view, true, null);
Özet
Bu makalede bir Xamarin.iOS uygulamasında Kişi ve Kişi kullanıcı arabirimi çerçeveleriyle çalışmaya ayrıntılı bir bakış yer almaktadır. İlk olarak, Kişi çerçevesinin sağladığı farklı nesne türlerini ve bunları yeni kişiler oluşturmak veya var olan kişilere erişmek için nasıl kullanabileceğiniz ele alındı. Ayrıca mevcut kişileri seçmek ve iletişim bilgilerini görüntülemek için Kişi Arabirimi çerçevesini de inceledi.




