๋ฌธ์
์ฌ์ฉ์์ ํ์ฌ์์น๋ฅผ ๋ฐ์์์ ์ง๋๋ฅผ ์ด๋ํด ํ๋ฉด์ ๋ํ๋ด๊ธฐ ์ํด, CLLocationManager๋ฅผ ํ์ฉํ๋ค.
CLLocationManagerDelegate์ locationManagerDidChangeAuthorization ๋ฉ์๋๋ฅผ ํ์ฉํ๊ณ ์
CLLocationManager ์ธ์คํด์ค๋ฅผ ์์ฑํ๋๋ฐ๋, locationManagerDidChangeAuthorization ๋ฉ์๋๋ ํธ์ถ๋์ง ์์๋ค.
HomeViewController๊ฐ NavigationController์ embed๋์ด ์๋ ์ํ์๊ณ ,
final class HomeViewController: BaseViewController {
let locationManager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
locationManager.delegate = self
}
extension HomeViewController: CLLocationManagerDelegate {
func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
print(#function)
checkUserDeviceLocationServiceAuthorization()
}
}
์์ ๊ฐ์ด CLLocationManager ์ธ์คํด์ค์ delegate์ self๋ฅผ ํ ๋นํด๋
locationManagerDidChangeAuthorization ๋ฉ์๋๊ฐ ํธ์ถ๋์ง ์์๋ค.
๊ณต์๋ฌธ์๋ฅผ ๋ด๋,
์ด๋ ๊ฒ CLLocationManager ์ธ์คํด์ค๋ฅผ ๋ง๋ค๋ฉด ์ด ๋ฉ์๋๊ฐ ํธ์ถ๋๋ค๊ณ ๋์์๋๋ฐ ๋ง์ด๋ค..
๋ค๋ฅธ iOS ๊ฐ๋ฐ์๋ค ์ฌ์ด์์๋ ๋ฒ๊ทธ ํน์ ์ ์ ์๋(?) ๊ณต์๋ฌธ์์ ์ ํ ์์ง ์์ ๋ค๋ฅธ ๋ฌด์ธ๊ฐ๊ฐ ์๋ ๊ฒ ๊ฐ๋ค๋ ๊ฒฐ๋ก ์ด ๋ฌ๋ค๋ ์ด์ผ๊ธฐ๋ ๋ค์๋ค.. ๊ทธ๋ฆฌ๊ณ UINavigationController ๋ฟ๋ง ์๋๋ผ UITabBarController์ embed๋์ด ์์ ๋๋ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
ํด๊ฒฐ
๋ฐฉ๋ฒ 1. locationManagerDidChangeAuthorization ๋ฉ์๋๋ฅผ ์ง์ ํธ์ถํ๋ค.
final class HomeViewController: BaseViewController {
let locationManager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
locationManager.delegate = self
locationManagerDidChangeAuthorization(locationManager)
}
extension HomeViewController: CLLocationManagerDelegate {
func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
print(#function)
checkUserDeviceLocationServiceAuthorization()
}
}
์์ฒ๋ผ CLLocationManagerDelegate์ ์๋ ๋ฉ์๋๋ฅผ ์ง์ ํธ์ถํ ์ ์๋ค.
๋ฐฉ๋ฒ 2. CLLocationManager ์ธ์คํด์ค์ ์ด๊ธฐํ๋ฅผ loadView() ํน์ ๊ทธ ์ดํ์ ํ๋ค.
final class HomeViewController: BaseViewController {
var locationManager: CLLocationManager! // ํ์
๋ง ์ ์ธ
override func loadView() {
view = homeView
locationManager = CLLocationManager() // loadView()์์ ์ด๊ธฐํ ํน์
}
override func viewDidLoad() {
super.viewDidLoad()
locationManager = CLLocationManager() // viewDidLoad()์์ ์ด๊ธฐํ!
locationManager.delegate = self
}
extension HomeViewController: CLLocationManagerDelegate {
func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
print(#function)
checkUserDeviceLocationServiceAuthorization()
}
}
์์ฒ๋ผ CLLocationManager์ ์ด๊ธฐํ๋ฅผ ํด๋์ค์ ํ๋กํผํฐ๋ก ์ ์ธํ ๋ ํ์ง ์๊ณ loadView() ํน์ ๊ทธ ์ดํ์ ์คํํ์ ๋ locationManagerDidChangeAuthorization ๋ฉ์๋๊ฐ ํธ์ถ๋๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค.
์ฒ์์๋ viewDidLoad()์์๋ง ํด ๋ณด๊ณ ๋ฉ์๋๊ฐ ํธ์ถ๋๋ ๊ฒ์ ํ์ธํ๋๋ฐ, loadView()์์๋ ๊ฐ๋ฅํ ๊ฒ์ ํ์ธํ๋ค!
๊ทธ ์ดํ ์์ ์ ๊ฐ๋ฐ์๊ฐ ํ์์ ๋ฐ๋ผ ์ ํํ ์ ์๊ฒ ์ง๋ง ๋น์ฐํ delegate ์ง์ ์ ์ ํด์ผํ ๊ฒ,, ์ ๊ทธ๋ฌ๋ฉด locationManager.delegate = self ์์ Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value ๋ฐํ์ ์๋ฌ๋ฅผ ๋ง๋ ๊ฒ์ด๋ค…
1๋ฒ๊ณผ 2๋ฒ ๋ฐฉ๋ฒ ์ค, ์ง์ ๋ฉ์๋ ํธ์ถ๋ณด๋ค๋, ํด๋น ๋ฌธ์ ๋ ์์ ์ ๋ฌธ์ ์ผ ์ ์์ผ๋ 2๋ฒ์ด ๋ ์ ํฉํ๋ค๊ณ ํ ์ ์์ ๊ฒ ๊ฐ๋ค.
์ฐธ๊ณ ์ฌํญ
locationManagerDidChangeAuthorization(_:)
Assign the delegate immediately when you configure your location manager, because the system reports the app’s authorization status to the delegate’s locationManagerDidChangeAuthorization(_:) method after the location manager finishes initializing itself. Core Location calls the methods of your delegate object using the RunLoop of the thread on which you initialized the CLLocationManager object. That thread must itself have an active RunLoop, like the one found in your app’s main thread.
CLLocationManager์ ์์ ๊ฐ์ ๋ถ๋ถ์ด ์์ด์, RunLoop๊ณผ embed์ ๊ด๊ณ๊ฐ ์๋์ง ๋ ์์๋ณด์์ผ ํ ๊ฒ ๊ฐ๋ค!
'๐งฏ Troubleshooting' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Cheliz] UICollectionViewCell ๋ด ๊ฐ์ฒด์ action ์ฒ๋ฆฌ (0) | 2023.02.09 |
---|---|
[Cheliz] Enumeration ํ์ ์ ํ๋กํผํฐ๋ฅผ ๊ฐ๋ ๋ชจ๋ธ๋ก parsingํ๊ธฐ (0) | 2023.02.09 |
[StudyWithMe] UIDatePicker ์ธ์ด Issue (0) | 2023.02.07 |
[StudyWithMe] UITableView - Dynamic Row Height (0) | 2023.02.07 |
[StudyWithMe] UITableView - Dynamic Header Height (0) | 2023.02.07 |