์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Decodable
- MongoDB
- DispatchQueue
- map
- ExpressJS
- Codable
- ์ฑ๋ง๋ค๊ธฐ
- SWiFT
- Encodable
- ์ง๋ฒ๋ณํ
- String.Index
- nodejs
- RxSwift
- CRUD
- ์๊ณ ๋ฆฌ์ฆ
- Figma
- UIRefreshController
- ios
- Cloud Firestore
- mongoose
- Filter
- Reduce
- Core Data
- Firestore CRUD
- components
- ์ฑ๋์์ธ
- Mac
- AVAudioPlayer
- Firestore
- ํ๋ก๊ทธ๋๋จธ์ค
- Today
- Total
Focus On Develop ๐ค๐ค
[Swift] Bento #1. iPhone ์ฐ๋ฝ์ฒ ๊ฐ์ ธ์ค๊ธฐ ๋ณธ๋ฌธ
[Swift] Bento #1. iPhone ์ฐ๋ฝ์ฒ ๊ฐ์ ธ์ค๊ธฐ
๋๋ฆฌ๋ฌ์ดํ 2021. 4. 27. 11:18ใ ใ ๋ ์ค๋๋ง์ ๊ธ์ ์จ๋ด ๋๋ค~~
์์ผ๋ก ์ข ์ข ์ฐ๋ฝ์ฒ ๊ฐ์ ธ์ค๊ธฐ, ์ด๋ฉ์ผ๋ณด๋ด๊ธฐ, ์ ํ๊ฑธ๊ธฐ, ์ฑ์คํํ๊ธฐ, ๋ก์ปฌNoti, ๋ณด์ ๋ฑ๋ฑ ์์ดํฐ์ OS๊ธฐ๋ฅ(?)์ ์ฌ์ฉํ๋ ๊ฒ๋ค์ ๋ํด์ ๋ช๊ฐ์ง๋ฅผ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํด์!!
์ด ํญ๋ชฉ๋ค์ ๊ฐ๋จํ Bento ์๋ฆฌ์ฆ! ๋ผ๊ณ ํ๊ณ ์์ํด๋ณผ๊ฒ์ ๐
์ฒซ๋ฒ์งธ ํฌ์คํ ์ ์ฐ๋ฝ์ฒ ๊ฐ์ ธ์ค๊ธฐ์ ๋๋ค!
๋จผ์ ํด๋ํฐ์ ์ฐ๋ฝ์ฒ์ ์ ๊ทผํ๋ ค๋ฉด, ์ฌ์ฉ์๊ฐ ๊ถํ์ ํ๋ฝํด์ผ ๋์!!
์ฑ ์ค์นํ๊ฑฐ๋, ์นด๋ฉ๋ผ๋ก ์ฐ์ผ๋ ค๊ณ ํ๊ฑฐ๋ ๋ฑ๋ฑ ํ ๋ ์ด๋ฐ๊ฑฐ ๋ง์ด ๋ณด์ จ์ฃ ~~?
์ด ๊ถํ์ ํ๋ํ๊ธฐ ์ํด, ํ๋ก์ ํธ ์ค์ ์ ํด์ค๋๋ค.
Info.plist์ ์ด ํญ๋ชฉ์ ์ถ๊ฐํด์ฃผ์ธ์!
์ ๋ ์ด๋ฐ ํน์ ๋ชฉ์ ์ ๊ฐ์ง๋ ๊ธฐ๋ฅ๋ค์ ํ๋กํ ์ฝ๋ก ๋ฐ๋ก ์ ์๋ฅผ ํด๋ฌ์.
์ด๋ฒ์๋ ์ฐ๋ฝ์ฒ ๊ด๋ จ๋ ๋ด์ฉ์ด๋๊น ContactUsable์ด๋ผ๊ณ ํ๋กํ ์ฝ์ ์ ์ํด์ ๊ฐ๋ฐํ์ต๋๋ค!
๋จผ์ ์ ์ฒด์์ค์์.
import Contacts
protocol ContactUsable {}
extension ContactUsable {
func getContacts() {
let store = CNContactStore()
var contacts: [Contact] = []
// ์ฐ๋ฝ์ฒ์ ์์ฒญํ ํญ๋ชฉ
let keys = [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactPhoneNumbersKey] as [CNKeyDescriptor]
// Request ์์ฑ
let request = CNContactFetchRequest(keysToFetch: keys)
request.sortOrder = CNContactSortOrder.userDefault
// ๊ถํ์ฒดํฌ
store.requestAccess(for: .contacts) { granted, error in
guard granted else { return }
do {
// ์ฐ๋ฝ์ฒ ๋ฐ์ดํฐ ํ๋
try store.enumerateContacts(with: request) { (contact, stop) in
guard let phoneNumber = contact.phoneNumbers.first?.value.stringValue else { return }
let id = contact.identifier
let givenName = contact.givenName
let familyName = contact.familyName
let contactToAdd = Contact(id: id, firstName: familyName, givenName: givenName, phoneNumber: phoneNumber)
contacts.append(contactToAdd)
}
} catch let error {
print(error.localizedDescription)
}
DataManager.shared.contacts = contacts
}
}
}
ํ๋์ฉ ์ดํด๋ณผ๊ฒ์~!
let store = CNContactStore()
var contacts: [Contact] = []
์ฐ๋ฝ์ฒ ๊พธ๋ฌ๋ฏธ(?)๋ฅผ CNContactStore ๊ฐ์ฒด๋ก ๋ง๋ค์ด ์ค๋๋ค. ๋ง ๊ทธ๋๋ก "์ฐ๋ฝ์ฒ ์์ ", ์ฆ ์ฐ๋ฝ์ฒ ๊พธ๋ฌ๋ฏธ๋ ์๋ฆฌ์ฃ !
Contact ํด๋์ค๋ ๋ฐ๋ก ๋ง๋ค์ด ์คฌ์ด์.
์ค์ ๋ก ์ฐ๋ฝ์ฒ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์๋ ์ ๊ฐ ์ฌ์ฉํ ๋ฐ์ดํฐ๋ ์ด๋ฆ, id(์๋ณ์ ๋ณด), ํธ๋ํฐ๋ฒํธ ์ด์ ๋ ๋ฟ์ด๊ธฐ ๋๋ฌธ์ด์์.
// ์ฐ๋ฝ์ฒ์ ์์ฒญํ ํญ๋ชฉ
let keys = [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactPhoneNumbersKey] as [CNKeyDescriptor]
// Request ์์ฑ
let request = CNContactFetchRequest(keysToFetch: keys)
request.sortOrder = CNContactSortOrder.userDefault
CNKeyDescriptor๋ ์ฐ๋ฝ์ฒ์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ ๋ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ๋ฌ๋ผ๊ณ ์์ฒญํ๋ ๊ฑฐ๋ผ๊ณ ์๊ฐํ์๋ฉด ๋์.
์ ๊ฐ์ ๊ฒฝ์ฐ๋ ์ฑ, ์ด๋ฆ, ํธ๋ํฐ๋ฒํธ๋ง ์์ฒญํ๊ฒ๋ ํ๊ฑฐ์ฃ .
CNContactFetchRequest() ๋ ๋ฐฉ๊ธ ์ค์ ํ key๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ค์ ๋ก ์์ฒญ์ ์ฌ์ฉํ ์์ฒญ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ฃผ๋ ๊ฑฐ์์.
CNContactSortOrder๋ฅผ ํตํด์ ์ ๋ ฌ์ ํด์ ๋ฐ์์ฌ ์๋ ์๊ณ ์! ์ ์ ๊ฒฝ์ฐ์๋ ์ด๋ฆ์์ผ๋ก ๋ฐ์์ค๋๋ก ํ์ต๋๋ค!
// ๊ถํ์ฒดํฌ
store.requestAccess(for: .contacts) { granted, error in
guard granted else { return }
do {
// ์ฐ๋ฝ์ฒ ๋ฐ์ดํฐ ํ๋
try store.enumerateContacts(with: request) { (contact, stop) in
guard let phoneNumber = contact.phoneNumbers.first?.value.stringValue else { return }
let id = contact.identifier
let givenName = contact.givenName
let familyName = contact.familyName
let contactToAdd = Contact(id: id, firstName: familyName, givenName: givenName, phoneNumber: phoneNumber)
contacts.append(contactToAdd)
}
} catch let error {
print(error.localizedDescription)
}
DataManager.shared.contacts = contacts
}
store.requestAccess ๋ฉ์๋๋ฅผ ํตํด์ ์ ๊ทผ๊ถํ์ ์ค์ ํ๊ณ , ์ด๋ฏธ ์ค์ ํ๋ค๋ฉด ๊ถํ ์ค์ ์ฌ๋ถ๋ฅผ ๋ฐ์์์.
์ ๋ ์ฐ๋ฝ์ฒ ๋ฐ์ดํฐ์ ๋ํ ๋ด์ฉ์ผ๋ก ์ ๊ทผ๊ถํ์ ์์ฒญํ ๊ฑฐ๋๊น .contacts๋ฅผ ๋ฃ์ด์ค ๊ฑฐ์์~!
๋ง์ฝ ๊ถํ์ด ์๋ค๋ฉด, enumerateContacts() ๋ฉ์๋๋ก ์๊น ๋ง๋ค์๋ request๋ฅผ ๋ฃ์ด์ ์์ฒญํฉ๋๋ค.
๊ทธ๋ผ ์ฐ๋ฝ์ฒ ์ ๋ณด๊ฐ ์ค์ค์ด ๋ฐ์์์ง๊ฒ ๋๊ณ , ๊ฐ๊ฐ์ ๋ํด์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ก์ง์ ์์ฑํด์ฃผ์๋ฉด ๋์.
์ ๋ ์ฐ๋ฝ์ฒ ์ ๋ณด๋ฅผ ์ฑ ์ ์ฒด์์ ๊ณต์ ํ ์ ์๋๋ก DataManager๋ผ๋ ํด๋์ค์ ์ฑ๊ธํค ๊ฐ์ฒด์ ํ ๋นํด์ค ๊ฑฐ์์.
์ด๋ ๊ฒ ์ฐ๋ฝ์ฒ๋ฅผ ๊ฐ์ ธ์๋์ผ๋ฉด, ์ฑ์ ํ์ํ ๊ณณ์์ ๊ฐ์ ธ๋ค ์ธ ์ ์๊ฒ ์ฃ ~~? ๐
Bento ํ๋ก์ ํธ์ธ ๋งํผ ์ด๋ฐ์์ผ๋ก ์์ฃผ ๊ฐ๋จํ๊ฒ ๋๋ด๋ดค์ด์!!
์ฑ์์ ์ฐ๋ฝ์ฒ ์ฌ์ฉ์ด ํ์ํ๋ฉด ๊ฐ๋จํ๊ฒ ๊ฐ์ ธ์์ ์ฌ์ฉํ์๊ตฌ์~~๐
์ค๋๋ ๋๊ตฐ๊ฐ์๊ฒ ๋์์ด ๋์๊ธธ ๋ฐ๋์ ๐
'iOS [Swift] > ๊ธฐ์ด๋ฅผ ํํํ!' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] AssociatedType (0) | 2021.08.23 |
---|---|
[Swift] Error Handling (0) | 2021.07.27 |
[RxSwift] Subject (0) | 2021.03.30 |
[RxSwift] RxSwift ์ฅ๋จ์ (0) | 2021.03.30 |
[RxSwift] RxSwift ์ ๋ฌธํ๊ธฐ (4) | 2021.03.30 |