Как получить электронную почту из контактов iPhone с помощью swift?
Я новичок в Свифте. Я использовал APAdressBook Framework для получения контактов в iPhone . Все работает нормально до IOS 8.4, но при проверке в IOS 9 на устройствах Simulator и iPhone он не обращается к контактам и даже не показывает предупреждающее сообщение, как если бы вы хотели получить доступ к контактам любого может ли столкнуться с такой проблемой, если да, пожалуйста, дайте мне ваш ценный ответ?
1 ответ
Apple Inc. представляет Contacts.framework
из iOS 9. Итак, было бы лучше использовать эту платформу для получения контактов.
Вот способ получить электронную почту или весь контакт из приложения Контакты.
добавлять Contacts.framework
к вашему проекту.
Создайте или добавьте новый файл типа header и дайте имя yourProjectName-Bridging-Header.h
записывать #import <Contacts/Contacts.h>
в файл и сохраните и установите соответствующий путь к этому файлу из настроек сборки.
Теперь создайте метод
func getAllContacts() {
let status = CNContactStore.authorizationStatusForEntityType(CNEntityType.Contacts) as CNAuthorizationStatus
if status == CNAuthorizationStatus.Denied {
let alert = UIAlertController(title:nil, message:"This app previously was refused permissions to contacts; Please go to settings and grant permission to this app so it can use contacts", preferredStyle:UIAlertControllerStyle.Alert)
alert.addAction(UIAlertAction(title:"OK", style:UIAlertActionStyle.Default, handler:nil))
self.presentViewController(alert, animated:true, completion:nil)
return
}
let store = CNContactStore()
store.requestAccessForEntityType(CNEntityType.Contacts) { (granted:Bool, error:NSError?) -> Void in
if !granted {
dispatch_async(dispatch_get_main_queue(), { () -> Void in
// user didn't grant access;
// so, again, tell user here why app needs permissions in order to do it's job;
// this is dispatched to the main queue because this request could be running on background thread
})
return
}
let arrContacts = NSMutableArray() // Declare this array globally, so you can access it in whole class.
let request = CNContactFetchRequest(keysToFetch:[CNContactIdentifierKey, CNContactEmailAddressesKey, CNContactBirthdayKey, CNContactImageDataKey, CNContactPhoneNumbersKey, CNContactFormatter.descriptorForRequiredKeysForStyle(CNContactFormatterStyle.FullName)])
do {
try store.enumerateContactsWithFetchRequest(request, usingBlock: { (contact:CNContact, stop:UnsafeMutablePointer<ObjCBool>) -> Void in
let arrEmail = contact.emailAddresses as NSArray
if arrEmail.count > 0 {
let dict = NSMutableDictionary()
dict.setValue((contact.givenName+" "+contact.familyName), forKey: "name")
let emails = NSMutableArray()
for index in 0...arrEmail.count {
let email:CNLabeledValue = arrEmail.objectAtIndex(index) as! CNLabeledValue
emails .addObject(email.value as! String)
}
dict.setValue(emails, forKey: "email")
arrContacts.addObject(dict) // Either retrieve only those contact who have email and store only name and email
}
arrContacts.addObject(contact) // either store all contact with all detail and simplifies later on
})
} catch {
return;
}
}
}
Вызовите этот метод, где вы хотите self.getAllContacts()
И когда вы хотите получить
for var index = 0; index < self.arrContacts.count; ++index {
let dict = self.arrContacts[index] as! NSDictionary
print(dict.valueForKey("name"))
print(dict.valueForKey("email"))
}