iOS: Contacts ํ๋ ์์ํฌ ํบ์๋ณด๊ธฐ
๊ฐ์
Contacts ํ๋ ์์ํฌ ํบ์๋ณด๊ธฐ
Contacts ํ๋ ์์ํฌ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํด์ ์ฌ์ฉ์์ ์ฐ๋ฝ์ฒ๋ฅผ ๊ฐ์ ธ์์ ํ ์ด๋ธ๋ทฐ๋ฅผ ํตํด ๋ณด์ฌ์ฃผ์.
๐จ ์ฌ์ฉ์์ ์ฐ๋ฝ์ฒ๋ฅผ ๊ฐ์ ธ์์ ๋ณด์ฌ์ฃผ๊ธฐ
UI ๊ตฌ์ฑํ๋ ๋ถ๋ถ์ ํจ์ค. ์ฝ๋๋ ์คํ ๋ฆฌ๋ณด๋๋ก ํ
์ด๋ธ๋ทฐ์ ์
๊ตฌ์ฑ์ ํด์ฃผ๋ฉด ๋๋ค. ์
์ ์คํ์ผ์ Subtitle
๋ก ์ง์ ํด์คฌ๋ค. ๋ฐ์ดํฐ๋ฅผ ๋ง์ด ๊ฐ์ ธ์์ ๋ณด์ฌ์ค ๊ฒ ์๋๋ผ์ ๊ฐ๋จํ๊ฒ ํ๋ค.
๊ทธ๋ค์์ผ๋ก Fetching Contacts ๋ฌธ๋จ์ ์๋ ์ฝ๋๋ฅผ ๊ทธ๋๋ก ๋ฐ๋ผ ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค.
override func viewDidLoad() {
super.viewDidLoad()
self.fetchContacts()
}
func fetchContacts() {
let store = CNContactStore()
do {
let predicate = CNContact.predicateForContacts(matchingName: "Appleseed")
let keysToFetch = [CNContactGivenNameKey, CNContactFamilyNameKey] as [CNKeyDescriptor]
let contacts =
try store.unifiedContacts(matching: predicate, keysToFetch: keysToFetch)
print("Fetched contacts: \(contacts)")
} catch {
print("Failed to fetch contact, error: \(error)")
// Handle the error
}
}
์คํํด๋ณด๋ฉด ์์ ๊ฐ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฑธ ๋ณผ ์ ์๋ค. ์๋ํ๋ฉด ์ฐ๋ฝ์ฒ๋ ๊ฐ์ธ์ ๋ณด์ ํด๋นํ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์์๊ฒ ๊ถํ์ ์์ฒญ๋ฐ์์ผ ํ๋ค.
Contacts ๋ฌธ์ ํ๋จ์๋ ๊ด๋ จ๋ ํ ํฝ์ ๋ณผ ์ ์๋๋ฐ, ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด Requesting Authorization to Access Contacts ๋ฌธ์๋ฅผ ๋ณด๋ฉด ๋๋ค.
์์ด๋ง ๋ด๋ ๋์ด ํ ๋์๊ฐ๋ค. @_@...
์ฑ์ ์ฌ์ฉ์๊ฐ ๊ถํ์ ๋ถ์ฌํ ๋๊น์ง ์ฐ๋ฝ์ฒ ํญ๋ชฉ์ ์ก์ธ์ค ํ ์ ์๋ค๊ณ ์ค๋ช
ํ๋ฉด์ ์ฌ์ฉ์์๊ฒ ์ก์ธ์ค ๊ถํ์ด ์๋์ง ํ์ธํ๋ ค๋ฉด authorizationStatus(for:)
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ผ๊ณ ์ฐ์ฌ์๋ค.
์กฐ๊ธ ๋ ๋ฐ์ผ๋ก ๋ด๋ ค์ ์ฝ์ด๋ณด๋ฉด, Info.plist
ํ์ผ์ NSContactsUsageDescription
ํค๋ฅผ ์ถ๊ฐํด์ผ ํ๋ค๊ณ ์ฐ์ฌ์๋ค. ์ด ํค์ ๊ฐ์ ์ฑ์ด ์ฌ์ฉ์์ ์ฐ๋ฝ์ฒ๋ก ์ํํ๋ ์์
์ ์ค๋ช
ํ๋ ๋ฌธ์์ด์ด๋ผ๊ณ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ค์์ผ๋ก๋ ์ฌ์ฉ์์๊ฒ ๊ถํ ์น์ธ ์์ฒญ์ ํ๋ ๋ฐฉ๋ฒ์ด ์ฐ์ฌ์๋ค. requestAccess(for:completionHandler:)
๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค๊ณ ํ๋ค. ํ์ํ ์ ๋ณด๋ฅผ ์ ๋ถ ์์๋์ผ๋ ๋ฌธ์ ๋ฅผ ๋ฌธ์์์ ์ ์ํ๋ ๋๋ก ์ฑ์ ์์ ํด๋ณธ๋ค.
๋จผ์ Info.plist
ํ์ผ์ NSContactsUsageDescription
ํค๋ฅผ ์ถ๊ฐํด์ผ ํ๋๋ฐ, ์ด๊ฒ๋ง ๋ด์ ๋ญ์ง ๋ชจ๋ฅผ ๊ฑฐ ๊ฐ์ง๋ง ์ ํ์์ ์น์ ํ๊ฒ ํด๋น ํค๊ฐ ์ค์ ๋ก ๋ฌด์จ ์ด๋ฆ์ ๊ฐ์ก๋์ง ๋ฌธ์๋ก ์ ๊ณตํ๊ณ ์๋ค.
Info.plist
์ ๋ค์๊ณผ ๊ฐ์ด ์ถ๊ฐํด์ค๋ค. ์ฌ์ฉ์์๊ฒ ์ด ๊ถํ์ด ์ ํ์ํ์ง ์ค๋ช
์ ๊ธฐ๋กํด์ผ ํ๋ค.
์ด๋ ๊ฒ ํ ๋ค์์ ๋ฐ๋ก ์ฐ๋ฝ์ฒ์ ์ ๊ทผํ๋ ๊ฒ ์๋๋ผ requestAccess(for:completionHandler:)
๋ฅผ ์ด์ฉํด ์ฌ์ฉ์์๊ฒ ์น์ธ ์์ฒญ์ ํ๋ค. ๊ถํ์ด ์์ผ๋ฉด ์ฐ๋ฝ์ฒ์ ์ ๊ทผํ๊ณ , ์์ผ๋ฉด ์ฌ์ฉ์์๊ฒ ๊ถํ ์์ฒญ์ ํ๋ค.
let store = CNContactStore()
override func viewDidLoad() {
super.viewDidLoad()
self.requestCNContactStoreAccess {
// ์น์ธ ์์ฒญ ์ฑ๊ณต์ ํ ์์
fetchContacts()
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
}
func requestCNContactStoreAccess(completion: @escaping () -> Void) {
self.store.requestAccess(for: .contacts) { (granted, error) in
// ์๋ฌ ๋ฐ์
if let error = error {
print(error.localizedDescription)
return
}
// ์ฌ์ฉ์์๊ฒ ์น์ธ ์์ฒญ ์ฑ๊ณต์ ํ์ถ
if granted {
completion()
}
}
}
์ด ๊ณผ์ ์์ fetchContacts
์ ์๋ store
๊ฐ์ฒด๋ฅผ ์ธ๋ถ๋ก ๋ณด๋๋ค.
requestCNContactStoreAccess
๋ฉ์๋๋ฅผ ๋ง๋ค๋ฉด์ ์ฒ์์ผ๋ก ํ์ถ ํด๋ก์ ๋ฅผ ์ฌ์ฉํด๋ดค๋ค. ์ด๋ ๊ฒ ์์ฑํ๋ ์ฝ๋๊ฐ ๊น๋ํด์ ธ์ ๊ฐ๋
์ฑ์ด ์ข์์ก๋ค.
์๋๋ fetch
์ request
๋ฅผ ๊ฐ์ด ํ๊ณ ์์๋๋ฐ ๋ฆฌํฉํ ๋ง์ ํด์ ๋ฉ์๋๋ฅผ ๋ถ๋ฆฌํ๋ค.
์ฌ์ฉ์ ์น์ธ ์์ฒญ๊ณผ ์ฐ๋ฝ์ฒ ์ ๋ณด๊น์ง ์ ๊ฐ์ ธ์ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๊ทธ๋ฐ๋ฐ ์ ์ฝ๋๋ ์ด๋ฆ์ด "Appleseed"์ธ ์ฌ๋์ ์ฐ๋ฝ์ฒ๋ง ๊ฐ๊ณ ์จ๋ค. ๋ชจ๋ ์ฐ๋ฝ์ฒ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๊ฒ fetchContacts()
๋ฉ์๋๋ฅผ ์์ ํด๋ณด์. ๊ทธ๋ฆฌ๊ณ ๊ฐ์ ธ์จ ์ ๋ณด๋ฅผ CNContact
๋ฐฐ์ด์ ์ ์ฅํ๋ค.
let store = CNContactStore()
var contatcs: Array<CNContact> = []
func fetchContacts() {
let keysToFetch = [CNContactGivenNameKey, CNContactFamilyNameKey] as [CNKeyDescriptor]
let request = CNContactFetchRequest(keysToFetch: keysToFetch)
do {
try self.store.enumerateContacts(with: request, usingBlock: { (contact, stopPointer) in
self.contacts.append(contact)
})
} catch {
print("Failed to fetch contact, error: \(error)")
}
}
์ฐ๋ฝ์ฒ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ๋ ๋ชจ๋ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ ์๋๋ผ keysToFetch
์ ์๋ ๊ฐ๋ง ๊ฐ๊ณ ์ค๊ธฐ ๋๋ฌธ์ ํ์ํ ๊ฐ์ ์ ์ด์ค์ผ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ง์ง ๋ง์ง๋ง์ผ๋ก.. ๊ฐ์ ธ์จ ๋ฐ์ดํฐ๋ฅผ ํ ์ด๋ธ๋ทฐ๋ฅผ ํตํด ๋ฟ๋ ค์ค๋ค.
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
return contacts.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cellIdentifier", for: indexPath)
let contact = contacts[indexPath.row]
cell.textLabel?.text = contact.familyName
cell.detailTextLabel?.text = contact.givenName
return cell
}
์์ฑ!
์ ํ ๊ฐ๋ฐ์ ๋ฌธ์๋ ์ง์ง ์ ์ ๋ฆฌ๋์ด์๋ค๋ ๊ฑธ ๋ ํ๋ฒ ๋๊ผ๋ค.
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote