์๋
ํ์ธ์ Foma ์
๋๋ค!
์ค๋ ์์๋ณผ๊ฑด ์ง๋ ์๊ฐ์ ์ด์ด์ ๋ ์จ์ ๊ด๋ จ๋ ์ ๋ณด์ธ๋ฐ์.
ํ์ฌ ๋ด๊ฐ ์๋ ์ง์ญ์ ๋ ์จ๋ฅผ ์๊ธฐ ์ํด์ ํ์ฌ ์์น๋ฅผ ์์์ผ ํ์์์?
ํ์ฌ ์์น๋ฅผ ์๊ธฐ ์ํด์ ์ฌ์ฉ์์ ๋์๊ฐ ํ์ํฉ๋๋ค.
๊ทธ๋์ ์ค๋์ ์ฌ์ฉ์์ ์์น ๊ถํ ๋ฐ๊ธฐ์ ๋๋ค!
๋ฐ๋ก ์์ํ ๊ฒ์!
Info.plist
๊ฐ์ฅ ๋จผ์ info.plist์์ ์ฑ์ ์ฌ์ฉํ๋๋์ ์์น๋ฅผ ๋ฐ์๋ ๋๋๋ ๊ถํ์ ์ค์ ํด์ค๋๋ค.
<key>NSLocationWhenInUseUsageDescription</key>
<string>์์น ์ข ์ธ๊ฒ?</string>
์๋์ ๊ฐ์ด ์ถ๊ฐํ์ ๋ ๋ฉ๋๋ค!
๊ทธ๋ฆฌ๊ณ ๋ฐ๋ก ViewController๋ก ๊ฐ์ค๋๋ค. (ํธ์์ WeatherViewController๋ผ๊ณ ๋ถ๋ฅผ๊ฒ์!)
WeatherViewController
๋จผ์ CoreLocation์ import ํด์ค๋๋ค.
import CoreLocation
๊ทธ๋ฆฌ๊ณค ์๋์ ๊ฐ์ด locationManager์ currentLocation์ด๋ผ๋ ๋ณ์๋ฅผ ๋ง๋ค์ด์ฃผ์ธ์!
var locationManager:CLLocationManager?
var currentLocation:CLLocationCoordinate2D!
์์์ CLLocationManager๋ ์ ํ ๋ฌธ์์ ๋ค์๊ณผ ๊ฐ์ด ๋์์์ต๋๋ค.
ํด์ํ๋ฉด "์ฑ์์ ์์น ๊ด๋ จ ์ด๋ฒคํธ ์ ๋ฌ์ ์์ํ๊ณ ์ค์งํ๋ ๋ฐ ์ฌ์ฉํ๋ ๊ฐ์ฒด" ๋ผ๊ณ ๋์ด์๋ค์.
๊ทธ๋ฆฌ๊ณ CLLocationCoordinate2D๋ ์ ํ ๋ฌธ์์ ๋ค์๊ณผ ๊ฐ์ด ๋์์์ต๋๋ค.
ํด์ํด๋ณด๋ฉด ์๋์ ๊ฒฝ๋๋ฅผ ์๋ ค์ฃผ๋ struct๋ผ๊ณ ๋์ด์๋ค์
๊ทธ๋ ๋ค๋ฉด ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ๊ถํ์ ์์ฒญํด๋ณผ๊น์?
๋จผ์ ์์์ ์ธํ ํ locationManager๊ฐ ์๋์ง ์๋์ง ๊ฒ์ฌํฉ๋๋ค.
๋ง์ฝ ์๋ค๋ฉด ๊ถํ์ ์์ฒญํ๊ณ ์๋ค๋ฉด ์ฌ์ฉ์์ ์์น๋ง ๋ฐ๋๊ณ ์๋์ง ๊ฒ์ฌํฉ๋๋ค.
private func requestAuthorization() {
if locationManager == nil {
locationManager = CLLocationManager()
//์ ํ๋๋ฅผ ๊ฒ์ฌํ๋ค.
locationManager!.desiredAccuracy = kCLLocationAccuracyBest
//์ฑ์ ์ฌ์ฉํ ๋ ๊ถํ์์ฒญ
locationManager!.requestWhenInUseAuthorization()
locationManager!.delegate = self
locationManagerDidChangeAuthorization(locationManager!)
}else{
//์ฌ์ฉ์์ ์์น๊ฐ ๋ฐ๋๊ณ ์๋์ง ํ์ธํ๋ ๋ฉ์๋
locationManager!.startMonitoringSignificantLocationChanges()
}
}
}
์์์ locationManager!.desiredAccuracy ๊ฐ ์๋๋ฐ์.
์ด๊ฒ์ ์ผ๋ง๋ ์ ํํ๊ฒ ์์น๋ฅผ ๋ฐ๊ณ ์ถ๋๋ ๋ป์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ kCLLocationAccuracyBest ๊ฐ ์๋๋ฐ์.
์ด๊ฑด ์๋์ ๊ฐ์ด kCLLocationAccuracyBest.kCLLocationAccuracyKilometer,kCLLocationAccuracyThreeKilometers๋ฑ ๋ค์ํ๊ฒ
์๋๋ฐ ์ด๊ฑด ํฌ๋ก๋ฏธํฐ ๊ธฐ์ค์ผ๋ก ์์น๋ฅผ ์ ํํ๊ฒ ํ ์ง 3ํฌ๋ก๋ฏธํฐ ๊ธฐ์ค์ผ๋ก ์ ํํ๊ฒ ํ ์ง ์๋๋ฉด ์ต๊ณ ๋ก ์ ํํ๊ฒ ํ ์ง๋ฅผ ์ ํ๋ ๊ฒ์ ๋๋ค.
์ฃผ์ํ์ค ์ ์ ์ ํํ๊ฒ ํ๋ฉด ํ ์๋ก ๋ฐฐํฐ๋ฆฌ๊ฐ ๋นจ๋ฆฌ ์๋ชจ๋ ์ ์์ต๋๋ค.
locationManager!.startMonitoringSignificantLocationChanges() ์ ์ฌ์ฉ์์ ์์น๊ฐ ๋ฐ๋๋์ง ๋ชจ๋ํฐ๋ง ํด์ฃผ๋ ๋ฉ์๋์ ๋๋ค.
locationManagerDidChangeAuthorization(locationManager!)๋ ๊ถํ์ด ๋ฐ๋์๋์ง ์ฒดํฌํด์ฃผ๋ ํจ์์ ๋๋ค.
์ด๊ฒ์ ์ฌ์ฉํ๊ธฐ ์ํด์ CLLocationManagerDelegate ๋ฅผ ์ฑํํด์ ์ฐ์ ์ผํ๋๋ฐ์.
์๋์ ๊ฐ์ด ์ฑํํด์ฃผ์ ๋ค manager์ ํ์ฌ ๊ถํ ์ํ๋ฅผ ํ์ธํ๊ณ ๋ง์ฝ ๊ถํ์ด ํ์ฉ๋์๋ค๋ฉด
๋งจ ์ฒ์ ๋ง๋ค์ด์ฃผ์ จ๋ currentLocation์ locationManager!.location?.coordinate๋ฅผ ์ฌ์ฉํด์ ๊ฒฝ๋์ ์๋๋ฅผ ์์๋ด๋ฉด ๋ฉ๋๋ค.
extension WeatherViewController:CLLocationManagerDelegate {
func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
if manager.authorizationStatus == .authorizedWhenInUse {
currentLocation = locationManager!.location?.coordinate
LocationService.shared.longitude = currentLocation.longitude
LocationService.shared.latitude = currentLocation.latitude
}
}
}
LocationService
๋ก์ผ์ด์ ์๋น์ค๋ ๊ฒฝ๋์ ์๋๋ฅผ ์ฑ๊ธํค์ผ๋ก ์ ์ฅํ๋ ํด๋์ค์ ๋๋ค.
๋ฐ๋ก ๋ง๋ค์ด์ ์ ์ฅํด์ฃผ์๋ฉด ๋ฉ๋๋ค!!
class LocationService {
static var shared = LocationService()
var longitude:Double!
var latitude:Double!
}
์ด๋ ๊ฒ ๋ชจ๋ ์ธํ ํด์ฃผ์ ๋ค requestAuthorization() ํจ์๋ฅผ ์คํ์์ผ ์ฃผ์๋ฉด
override func viewDidLoad() {
super.viewDidLoad()
requestAuthorization()
}
์๋์ ๊ฐ์ด ๊ถํ์ค์ ์ด ๋์ค๊ณ
ํ์ฌ ๊ฒฝ๋์ ์๋๋ฅผ ์ถ๋ ฅํด๋ณด๋ฉด ์๋์ ๊ฐ์ด ๋์ค๋๊ฑธ ๋ณผ ์ ์์ต๋๋ค.
์ด๋ ๊ฒ ์์๋ธ ๊ฒฝ๋์ ์๋๋ฅผ ๊ฐ์ง๊ณ ๋์๋ฅผ ํ์ ํด๋ณด๋ Seoul์ด๋ผ๊ณ ์ ๋์ค๋ค์!
์ค๋์ ์ด๋ ๊ฒ ์์น ๊ถํ ์ค์ ๊ณผ ํ์ฌ ์์น ์์๋ด๋ ๋ฒ์ ๋ํด์ ์์๋ณด์์ต๋๋ค.
ํน์๋ผ๋ ์ง์ ํด์ฃผ์ค ๋ถ๋ถ์ด๋ ๊ถ๊ธํ์ ์ ์ด ์๋ค๋ฉด ๋๊ธ๋ก ์๋ ค์ฃผ์ธ์!!
๋๊ธ