본문 바로가기

학습 노트/iOS (2021)

217. Cellular Connection

Cellular Connection


위와 같은 차이점 때문에 네트워크를 사용하는 앱의 경우
사용자가 현재 사용하는 네트워크 방식을 인지할 수 있도록 구현하는 것이 바람직하다.

Reachability를 사용하면 이를 쉽게 구현할 수 있지만,
이는 애플의 권장을 벗어난 해결법이다.
애플은 'Framework가 제공하는 API로 허용 여부를 설정'하도록 권고하고 있다.

 

Cellular 연결 설정하기

request.allowsCellularAccess = cellularSwitch.isOn

request의 allowsCellularAccess 속성을 Switch의 상태와 동기화한다.
DownloadTask는 스위치와 해당 속성의 상태에 따라 다운로드 여부를 결정한다.

Switch가 켜져 있는 경우 allowsCellularAccess가 True이고, 사진을 다운로드할 수 있다.
하지만 Switch가 꺼진 상태에서는 allowsCellularAccess가 False이고, 다음과 같은 오류가 발생한다.

 

Cellular 연결 선택하기

func startTask(using request: URLRequest) {
  let task = session.dataTask(with: request) { (data, response, error) in
     print(error ?? "Success")

      if let error = error {
          let networkError = error as NSError
          if networkError.code == NSURLErrorNotConnectedToInternet {
              if !request.allowsCellularAccess {
                  self.showCellularAlert()
              }
          }
          return
      }

     if let data = data {
        DispatchQueue.main.async {
           let img = UIImage(data: data)
           self.imageView.image = img
        }
     }
  }
  task.resume()
}

'-1009' 코드는 NSURLErrorNotConnectedToInternet 오류를 의미한다.
해당 오류를 사용해 경고를 표시함과 동시에 Cellular를 사용할 수 있도록 설정을 함께 제공하는 것이 좋다.

func startOneTimeTask() {
  guard let url = URL(string: picUrlStr) else {
     fatalError("Invalid URL")
  }

  imageView.image = nil

  var request = URLRequest(url: url)

   request.allowsCellularAccess = true
   startTask(using: request)
}

Alert에서 'Connect This Time Only'를 선택하면 startOneTimeTask 메서드를 호출하고,
startOneTimeTask는 allowsCellularAccess 속성이 true인 임시 request를 생성해 다운로드를 시작한다.

func allowsCellularAccess() {
   cellularSwitch.setOn(true, animated: true)
   startOneTimeTask()
}

'Allows Permanently'를 선택하면 allowsCellularAccess 메서드를 호출하고,
Switch의 상태를 변경한다.

lazy var session: URLSession = { [weak self] in
  let config = URLSessionConfiguration.default
  config.requestCachePolicy = .reloadIgnoringLocalCacheData

   config.allowsCellularAccess = false

  let session = URLSession(configuration: config)
  return session
}()

이후 sessionConfiguration의 allowsCellularAccess 속성의 기본 상태를 false로 변경한다.

지금은 Switch의 상태에 따라 request의 allowsCellularAccess 속성을 변경하고 있으므로
Switch를 토글 하는 것으로 구현하지만 설정을 유지하기 위해 file이나 coredata에 저장하거나 반영할 필요는 있다.


결과

'학습 노트 > iOS (2021)' 카테고리의 다른 글

219. Task Scheduling  (0) 2022.09.07
218. Adaptable Connectivity  (0) 2022.09.07
216. Reachability  (0) 2022.09.06
215. Response Caching  (0) 2022.09.06
214. Background Download  (0) 2022.08.31