IOS 9 で連絡先を取得するために新しいフレームワーク Contacts を使用しています。また、IOS 8.0 から連絡先名を取得するために ABAddressBook フレームワークを使用していますが、IOS 8.0 アプリではクラッシュします。次のコードを使用して IOS のバージョンを確認しています
if #available(iOS 9.0, *)
{
/*push to Contacts framework */
}
else
{
/* push to ABAddressBook framework */
}
Swift 1.2では、このコードを使用して連絡先名を取得していますが、正常に動作しています
func processContactNames()
{
var errorRef: Unmanaged<CFError>?
var addressBook: ABAddressBookRef? = extractABAddressBookRef(ABAddressBookCreateWithOptions(nil, &errorRef))
var contactList: NSArray = ABAddressBookCopyArrayOfAllPeople(addressBook).takeRetainedValue()
contactLists = []
contactEmails = []
contactEmailDetails = []
for record:ABRecordRef in contactList
{
var contactDetails: NSDictionary! = processAddressbookRecord(record)
var emailAddresses: Array<String>! = contactDetails.valueForKey("emails") as! Array
if emailAddresses.count > 0
{
for email in emailAddresses
{
var emailDetails: NSDictionary! = ["email":email, "contactIndex":contactEmailDetails.count, "contactName":contactDetails.valueForKey("contactName") as! String, "photo":contactDetails.valueForKey("photo") as! UIImage]
contactEmailDetails.append(emailDetails)
contactEmails.append(email)
}
}
}
}
Swift 2.0ではこの関数を使用しています.xcode 7ではうまく機能しません.
func processAddressbookRecord(addressBookRecord: ABRecordRef)->NSDictionary
{
if var contactName: String = ABRecordCopyCompositeName(addressBookRecord)?.takeRetainedValue() as? String
{
var contactName: String = ""
contactName = ABRecordCopyCompositeName(addressBookRecord).takeRetainedValue() as! String
let emailAddresses: Array<String>! = processEmail(addressBookRecord)
let photo: UIImage! = processPhoto(addressBookRecord)
let contactDetails: NSDictionary! = ["contactName":contactName,"emails":emailAddresses,"photo":photo]
print(emailAddresses.count)
return contactDetails
}
}