본문 바로가기

Tech/iOS

[iOS]Day38 - Privacy

728x90

보안 강국의 애플..

privacy 지켜주자


Authorization

아이폰을 써 본 경험이 있다면 App 실행 시 왜 이렇게 권한을 허용을 해야하는게 많아? 라는 생각을 한번쯤 해봤을 것이다

권한은 사용방법을 공개해서 사용자와 신뢰를 구축하는 것이다.

info.plist에서 information Property List -> App Transport Security Settings 하위에서 권한 설정이 가능하다

(Privacy로 검색하면 검색하기 편하다)

 


MapAuthorization

infoPlist에서 위치 권한에 대하여 설정 해주었다

MapView

 - Map은 지도이기 때문에 위치 권한과는 상관 없다

 - 단, 지도에 위치를 표기하고 싶다면 위치 권한을 설정 해주어야한다

 - 중심과 범위를 지정 해주어야 한다

 

*CLLocation 준비

import UIKit

import MapKit
//Location1. 임포트
import CoreLocation

class MapViewController: UIViewController {

    @IBOutlet weak var mapView: MKMapView!
    
    //Location2. 위치에 대한 대부분을 담당
    let locationManager = CLLocationManager()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //Location3. 프로토콜 연결
        locationManager.delegate = self
        
    }

*CLLocationManagerDelegate 프로토콜을 통해서 위치, 권한 업데이트 될시에 사용되는 method 구현

//Location4. 프로토콜 선언
extension MapViewController: CLLocationManagerDelegate {
    
    //Location5. 사용자의 위치를 성공적으로 가지고 온 경우
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        print(#function, locations)
      
        if let coordinate = locations.last?.coordinate {
            setRegionAndAnnotation(center: coordinate)
        }
        
        locationManager.stopUpdatingLocation()
    }
    
    //Location6. 사용자의 위치를 못 가지고 온 경우
    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        print(error)
    }
    
    //사용자가 권한 상태를 바꿀 경우
     func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
        print(#function)
        checkUserDeviceLocationServiceAuthorization()
    }
    
    //iOS 14 미만
    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
        
    }
}

locationManager.stopUpdationgLocation()을 꼭 해주어야 무한 업데이트 되는 것을 막을 수 있다

(어떻게 아냐고? 알고 싶지 않았다.. assignment하는데 start로 써서 update 무한으로 즐겼...)

 

* CLAuthorizationStatus를 통해 iOS 버전 확인, iOS 서비스 활성화 여부와 권한 여부 확인

extension MapViewController {
 
    func checkUserDeviceLocationServiceAuthorization() {
        
        let authorizationStatus: CLAuthorizationStatus
        
        if #available(iOS 14.0, *) {
            
            authorizationStatus = locationManager.authorizationStatus
        } else {
            authorizationStatus = CLLocationManager.authorizationStatus()
        }
        
        //iOS 위치 서비스 활성화 여부 체크
        if CLLocationManager.locationServicesEnabled() {
            checkUserCurrentLocationAuthorization(authorizationStatus)
        } else {
            print("위치서비스가 꺼져 있어서 위치 권한 요청을 못합니다.")
        }
        
    }

 

*사용자의 권한 상태에 따른 메서드 실행

    func checkUserCurrentLocationAuthorization(_ authorizationStatus: CLAuthorizationStatus) {
        switch authorizationStatus {
        case .notDetermined:
            print("NOTDETERMINED")
            
            locationManager.desiredAccuracy = kCLLocationAccuracyBest
            locationManager.requestWhenInUseAuthorization()
            
        case .restricted, .denied:
            print("DENIED, 아이폰 설정으로 유도")
            showRequestLocationServiceAlert()
            
        case .authorizedWhenInUse:
            print("WHEN IN USE")
            locationManager.startUpdatingLocation()
        default: print("DEFAULT")
        }
    }

Alertmethod는 이전 게시물을 통해서 알 수 있지만 권한 요청이 안됐을 때 띄워주는 것으로 특별히 정해진 양식은 없으므로 만들고 싶은대로 만들어서 deni, restrict의 경우 띄워주면 된다

 

*사용자 위치 지정 및 핀 설정

 
    func setRegionAndAnnotation(center: CLLocationCoordinate2D) {
    	let center = CLLocationCoordinate2D(latitude: 37.524496, longitude: 127.035340)
        let region = MKCoordinateRegion(center: center, latitudinalMeters: 1000, longitudinalMeters: 1000)
        //위치 설정
        mapView.setRegion(region, animated: true)
        
        let annotation = MKPointAnnotation()
        annotation.coordinate = center
        annotation.title = "도산공원 입니다"
        
        
        //핀 한개? 여러개?
        //지도에 핀 추가
        mapView.addAnnotation(annotation)
        
    }
}

위도 경도 기반으로 위치를 설정해주고 중심부를 설정해준다 

mapView,addAnnotation(핀 설정 1개 ) addAnnotations(핀 여러개 설정)

 

여러개의 핀을 설정하면 위와 같은 형태로 보여진다

'Tech > iOS' 카테고리의 다른 글

[iOS]Day43 - Access Control  (0) 2022.08.16
[iOS]Day39 - Authorization - Camera  (0) 2022.08.12
[iOS]Day37 - AwakeFromNib, PrepareForReuse  (0) 2022.08.10
[iOS]Day37 - TableView+CollectionView  (0) 2022.08.09
[iOS]Day37 - IBInspectable/IBDesignable  (0) 2022.08.09