티스토리 뷰

728x90
반응형

내용

심각한 버그를 릴리즈한 후 발견했다거나!

핵심 기능의 변경이 있다던가!

서버 url 이 변경이 있다던지!

마지막 사례를 지인에게 듣고 아찔해졌던 경험이 있었다.. 그리고 필수로 업데이트를 권장해야 할 순간이 올 수 있다고 생각했습니다. 그래서 본 내용에 대해서 찾아보았습니다.

강제 업데이트 혹은 최신버전을 확인 후 업데이트 하는 기능은 팀에게는 편한 기능이지만, 사용자에게는 업데이트를 하지 않게되면 지속적으로 괴롭힐 수 있고, 이 부분이 오히려 이탈로 이어질 수도 있다는 생각도 들었습니다.

그래도 그정도로 리스크를 가지고도 필요한 순간이 올 때는 오히려 있으면 다행인 기능이 될거라는 생각이 들었습니다.

원리

  • http://itunes.apple.com/lookup?bundleId=(bundle ID) 를 통해서 다운받은 file 의 JSON 형태 중 resultsversion 을 현재 앱의 버전과 비교해서 업데이트 alert 창을 띄우도록 했습니다.
    앱이 출시된 후, 해당 주소를 통해서 다운받은 file 에서 version 정보를 얻을 수 있었습니다!

  • URL Scheme (itms-apps://itunes.apple.com/app/(앱 정보의 Apple ID))를 사용해서 앱스토어를 열었습니다.
private func checkUpdateAvailable() -> Bool {
        // ✅ CFBundleShortVersionString - 릴리즈 혹은 bundle 의 버전.
        guard let currentVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String,
              // ✅ CFBundleIdentifier - 앱의 bundle ID.
              let bundleID = Bundle.main.infoDictionary?["CFBundleIdentifier"] as? String,
              let url = URL(string: "http://itunes.apple.com/lookup?bundleId=" + bundleID),
              // ✅ init(contentsOf:) - 주어진 URL 의 데이터로 데이터 객체를 초기화합니다.
              /* ✅
              - 짧은 파일을 동기적으로 읽는데 사용할 수 있습니다.
              - 이 동기적 이니셜라이저를 사용해서 네트워크 기반의 URL 을 요청하지 마세요.
              - 느린 네트워크에서 오랜 기간 현재 스레드를 차단해서 사용자 경험을 저하시킬 수 있습니다.
              */
              // ✅ 해당 URL 을 주소창에 입력하면 file 을 다운 받을 수 있습니다.(JSON 구조의 파일)
              let data = try? Data(contentsOf: url),
              // ✅ JSONSerialization - Foundation Object 를 JSON 으로 바꾸기 위해서 사용.(JSON 과 Foundation object 간을 변환할 수 있음.)
              // ✅ jsonObject - JSON Data 에서 Foundation object 를 생성. 이때 [String: Any] 타입으로 캐스팅.
              // ✅ .fragmentsAllowed - parser 가 배열이나 딕셔너리가 아닌 top-level objects 도 허가한다는 의미.(원래 변환 조건에는 'top level object 는 NSArray 혹은 NSDictionary 가 되어야 한다'가 있다.)
              let jsonData = try? JSONSerialization.jsonObject(with: data, options: .fragmentsAllowed) as? [String: Any],
              let results = jsonData["results"] as? [[String: Any]],
              results.count > 0,
              // ✅ 파일에서 results 의 version 키의 값을 알기 위해서 진행.
              let appStoreVersion = results[0]["version"] as? String else { return false }

        // ✅ 예를들어, 1.0.0 으로 표현되는 버전을 [1,0,0] 으로 처리.
        let currentVersionArray = currentVersion.split(separator: ".").map { $0 }
        let appStoreVersionArray = appStoreVersion.split(separator: ".").map { $0 }

        // ✅ [Major].[Minor].[Patch]
        // ✅ 앞자리(Major)가 낮으면 업데이트
        if currentVersionArray[0] < appStoreVersionArray[0] {
            return true
        } else {
            // ✅ 중간자리(Minor) 역시 낮으면 업데이트
            return currentVersionArray[1] < appStoreVersionArray[1] ? true : false
        }
    }

    private func presentUpdateAlertVC() {
        let alertVC = UIAlertController(title: "업데이트", message: "업데이트가 필요합니다.", preferredStyle: .alert)
        let alertAtion = UIAlertAction(title: "업데이트", style: .default) { _ in
            // ✅ App store connet 앱의 일반 정보의 Apple ID 입력.
            let appleID = "..."
            // ✅ URL Scheme 방식을 이용해서 앱스토어를 연결.
            guard let url = URL(string: "itms-apps://itunes.apple.com/app/\(appleID)") else { return }
            // ✅ canOpenURL(_:) - 앱이 URL Scheme 처리할 수 있는지 여부를 나타내는 Boolean 값을 리턴한다.
            if UIApplication.shared.canOpenURL(url) {
                UIApplication.shared.open(url)
            }
        }
        alertVC.addAction(alertAtion)

        present(alertVC, animated: true)
    }

CFBundleShortVersionString

개발자문서를 확인하면서 key 의 값들의 포맷에 대해서 확인할 수 있었습니다.

[Major].[Minor].[Patch]:

  • Major: A major revision number.
  • Minor: A minor revision number.
  • Patch: A maintenance release number.

참고:

여러 글들에서 http~ 주소를 사용하게 되면 어떨때는 뜨고 어떨때는 안된다는 내용이 있었고, 최신화가 되지 않는 이유로 https~ 로 변경해주면 반영이 된다고 했다.(앱스토어에 완전히 반영이 되려면 24시간정도 걸린다고 하고.. http~ 의 경우는 https~ 보다 늦다고 한다.)

그런데..! https 로 설정해두니 웹 페이지에서 파일은 다운로드 되는데 해당 코드에서 프린트 해보니 다른 파일(출시 이전처럼 내용들이 비어있는 파일)을 다운로드하고 있었다..(이건 참 이상하다..)

그래서 http 로 변경했더니 잘됐다..!(...어째서...?) 그래서 이것도 참고해두면 좋을 것 같다.
---- 24시간 후

24시간이 지난 후에 https~ 확인해보니까! 정상적으로 동작하였다...! 참고해두면 좋을 것 같다.🙂

출처:

Apple Developer Documentation

Apple Developer Documentation

Apple Developer Documentation

JSONSerialization 공부하기

iOS ) 최신버전확인하기 / App Update

[iOS - Swift] 현재 버전과 앱 스토어 버전 체크

[iOS] 강제 업데이트 / 앱스토어 최신버전 확인하기

728x90
반응형
댓글
최근에 올라온 글
최근에 달린 댓글
글 보관함
«   2024/12   »
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
링크
Total
Today
Yesterday