- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- barplot
- swiftUI
- HTTP
- tapply
- rxswift
- 딥러닝
- substr
- Observable
- 연산자
- 오블완
- rest api
- sigmoid
- 시각화
- SWIFT
- 명령어
- deeplearning
- Request
- decode
- Linux
- SQL
- cocoapods
- Optional
- Python
- struct
- ReLU
- 티스토리챌린지
- ios
- scheduledTimer
- r
- MVC
iOS 개발 기록 블로그
iOS (Swift) GPS 받고 위도, 경도 받아서 날씨 API 데이터 받기 본문
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에서 해당 권한에 대한 설정을 해줘야 한다.
그리고 아래 이미지와 같이 체크한 부분에
마우스를 가져다 대면 + 버튼이 있다.
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' 카테고리의 다른 글
iOS (Swift) Navigation Controller 생성 (Segue) (0) | 2022.07.12 |
---|---|
iOS (Swift) PickerView 기본 + Networking&API 예제 1탄 (0) | 2022.06.30 |
iOS (Swift) MARK: - 키워드와 Code Snippet 정의 및 사용법 (0) | 2022.06.28 |
iOS (Swift) 예시로 쉽게 이해하는 Extension (0) | 2022.06.27 |
iOS (Swift) Internal & External Parameter 란? (0) | 2022.06.26 |