iOS

iOS (Swift) GPS 받고 위도, 경도 받아서 날씨 API 데이터 받기

crazydeer 2022. 6. 29. 09:00
반응형

CoreLocation 활용하여 위치 데이터를 받아볼 것이다.

먼저 해당 라이브러리를 import 해줘야 한다.

 

import UIKit
import CoreLocation


class WeatherViewController: UIViewController {
    
    @IBOutlet weak var conditionImageView: UIImageView!
    @IBOutlet weak var temperatureLabel: UILabel!
    @IBOutlet weak var cityLabel: UILabel!
    @IBOutlet weak var searchTextField: UITextField!
    
    var weatherManager = WeatherManager()
    let locationManager = CLLocationManager()
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        locationManager.requestWhenInUseAuthorization()
        
        searchTextField.delegate = self
        weatherManager.delegate = self
    }
}

 

첫 번째밑줄이 import 하는 것이고

두 번째가라는 인스턴스를 만드는 부분이다.

 

위치 데이터는 사적이고 민감한 것이기 때문에

viewDidLoad에서 사용자에게 위치 서비스에 관한 권한을 요청한다.

 

흔히 말해 이런 것들은 'Permission Check'라고라고 한다.

 

 

Navigator 창에서 info.plist에서 해당 권한에 대한 설정을 해줘야 한다.

Info.plist image

 

그리고 아래 이미지와 같이 체크한 부분에

마우스를 가져다 대면 + 버튼이 있다.

Location When In ~ Description을을 추가해준다.

 

 

 

아래와 같이 Value 값에 설명도 적어준다.

 

 

 

그리고 빌드해보면 아래와 같이  실행 

많이들 보셨을 권한 체크 팝업 창이 뜬다.

 

 

 

만약 우리가 네비게이션 앱이나 피트니스 앱을 만든다면

앱을 사용하는 내내 위치 데이터가 필요하면

 

 

 

 메서드를 쓰면 된다.

 

그러나 지금 현재 우리의 경우는

한번 요청하는 걸로 충분하다.

따라서 locationManager.requestLocation()

 메서드로 쓴다.

 

viewDidLoad()

override func viewDidLoad() {
        super.viewDidLoad()
        
        locationManager.delegate = self
        locationManager.requestWhenInUseAuthorization()
        locationManager.requestLocation()
        
        searchTextField.delegate = self
        weatherManager.delegate = self
    }

 

extension

//MARK: - CLLocationManagerDelegate
extension WeatherViewController: CLLocationManagerDelegate {
    func locationManager(_manager: CLLocationManager, didUpdateLocationslocations: [CLLocation]) {
            let lat = location.coordinate.latitude
            let lon = location.coordinate.longitude
            print(lat, lon)
    }
    
    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        print(error)
    }
}

 

 

결과

 

 

이제 OpenWeather API로부터 위의 위도, 경도를

넣어서 데이터를 요청해보자.

 

 

WeatherManager.swift

 

블록 지정한 코드를 추가해준다.

요청할 url 붙여주는 함수인데 이전에 받은

위도, 경도를 정해진 형식에 맞게 세팅하는 것이다.

 

 

 

 

//MARK: - CLLocationManagerDelegate
extension WeatherViewController: CLLocationManagerDelegate {
    func locationManager(_manager: CLLocationManager, didUpdateLocationslocations: [CLLocation]) {
        if let location = locations.last{
            let lat = location.coordinate.latitude
            let lon = location.coordinate.longitude
            
            print(lat, lon)
            weatherManager.fetchWeather(latitude: lat, longitude: lon)
        }
        
    }
    
    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        print(error)
    }
}

 

 

 

현 위치버튼 IBAction 만들기

 

@IBAction func currentLocationPressed(_ sender: UIButton) {
        locationManager.requestLocation()
    }

 

이건 viewDidLoad 아래에 위치하게 하고 다음과 같이 다시 요청한다.

이때 위치 인식을 잠시 멈추고 진행해야하기 때문에 아래 코드에

블록부분을 추가해준다.

 

 

 

실행하면  경우는 시뮬레이터의

Location을 Apple 해놔서 쿠퍼티노의 날씨가 나온다.

 

 

 

수원으로 검색하면 아래와 같이 6 28 현재 날씨가

맞게  나온다.

 

 

 

물론 현위치 버튼 누르면 다시 쿠퍼티노의 날씨로  나온다.

 

 

참고

안젤라유 강의

 

iOS & Swift - The Complete iOS App Development Bootcamp

From Beginner to iOS App Developer with Just One Course! Fully Updated with a Comprehensive Module Dedicated to SwiftUI!

www.udemy.com

 

 

반응형