투케이2K

102. (ios/swift) [재등록] 외부 앱 설치 확인 및 마켓 이동 실시 - openURL , canOpenURL 본문

IOS

102. (ios/swift) [재등록] 외부 앱 설치 확인 및 마켓 이동 실시 - openURL , canOpenURL

투케이2K 2022. 1. 21. 07:42

[개발 환경 설정]

개발 툴 : XCODE

개발 언어 : SWIFT

 

[방법 설명 : canOpenURL 앱 설치 여부 확인 시 참고]

 

[소스 코드]

    // MARK: [외부 앱 실행 실시 - 스키마 외부 열기]
    // [SEARCH FAST] : [외부 이동]
    /*
    1. https://www.apple.com/kr/ 사이트에 접속해서 특정 앱 주소를 확인합니다
    2. 크롬 앱 id 확인 : https://apps.apple.com/kr/app/google-chrome/id535886823 [id535886823 부분을 사용해서 외부앱을 실행합니다]
    3. 크롬 스키마 확인 : googlechrome://
    4. 로직 : 외부앱 설치되었을 경우 >> 외부앱 실행 (스키마) / 외부앱이 설치되지 않은 경우 앱 스토어 이동 (앱 id)
    5. 호출 예시 : goAppRun(_scheme: "googlechrome://", _id: "id535886823")
    */
    func goAppRun(_scheme : String, _id : String) {
        // [메인 큐에서 비동기 방식 실행 : UI 동작 실시]
        DispatchQueue.main.async {
            let _appSchme = _scheme
            let _storeUrl =  "itms-apps://itunes.apple.com/app/" + _id
            print("")
            print("====================================")
            print("[S_Extension >> goAppRun :: 외부 앱 실행 실시 [외부 열기]]")
            print("_appSchme :: ", _appSchme)
            print("_storeUrl :: ", _storeUrl)
            print("====================================")
            print("")
            
            // [URL 타입 체크 실시]
            guard let appsUrl = URL(string: _appSchme)
            else {
                print("")
                print("====================================")
                print("[S_Extension >> goAppRun :: 외부 앱 실행 에러 [외부 열기]]")
                print("error :: ", "URL 파싱 에러")
                print("====================================")
                print("")
                return
            }

            // [외부 앱 실행 실시]
            UIApplication.shared.open(appsUrl, completionHandler: { (success) in
                if (success) {
                    print("")
                    print("====================================")
                    print("[S_Extension >> goAppRun :: 외부 앱 열기 수행 [외부 열기]]")
                    print("_appSchme :: ", _appSchme)
                    print("_storeUrl :: ", _storeUrl)
                    print("====================================")
                    print("")
                }
                else {
                    // [id 값이 널인 경우 체크해서 널이 아닌 경우만 마켓 이동 실시]
                    if _id != nil && _id.count > 0 && _id.equals(_string: "") == false {
                        // 마켓 이동 로직 처리 실시
                        print("")
                        print("====================================")
                        print("[S_Extension >> goAppRun :: 앱 스토어 이동 실시 [외부 열기 수행]]")
                        print("_appSchme :: ", _appSchme)
                        print("_storeUrl :: ", _storeUrl)
                        print("====================================")
                        print("")
                        // 버전별 처리 실시
                        if #available(iOS 10.0, *) {
                            UIApplication.shared.open(URL(string: _storeUrl)!, options: [:], completionHandler: nil)
                        }
                        else {
                            UIApplication.shared.openURL(URL(string: _storeUrl)!)
                        }
                    }
                    else {
                        print("")
                        print("====================================")
                        print("[S_Extension >> goAppRun :: 앱 스토어 이동 실시 [외부 열기 실패]]")
                        print("error :: ", "_id 값 널 임")
                        print("====================================")
                        print("")
                    }
                }
            })
        }
    }
    
    
    
    // MARK: [마켓 이동 실시]
    /*
    1. https://www.apple.com/kr/ 사이트에 접속해서 특정 앱 주소를 확인합니다
    2. 크롬 앱 id 확인 : https://apps.apple.com/kr/app/google-chrome/id535886823 [id535886823 부분을 사용해서 외부앱을 실행합니다]
    3. 호출 예시 : self.goMarketRun(_id: "id535886823")
    */
    func goMarketRun(_id : String) {
        // [메인 큐에서 비동기 방식 실행 : UI 동작 실시]
        DispatchQueue.main.async {
            let _storeUrl =  "itms-apps://itunes.apple.com/app/" + _id
            print("")
            print("====================================")
            print("[S_Extension >> goMarketRun :: 앱 스토어 이동 실시 [수행]]")
            print("_storeUrl :: ", _storeUrl)
            print("====================================")
            print("")
            
            // [id 값이 널인 경우 체크해서 널이 아닌 경우만 마켓 이동 실시]
            if _id != nil && _id.count > 0 && _id.equals(_string: "") == false {
                print("")
                print("====================================")
                print("[S_Extension >> goMarketRun :: 앱 스토어 이동 실시 [정상]]")
                print("_storeUrl :: ", _storeUrl)
                print("====================================")
                print("")
                
                // [버전별 처리 실시]
                if #available(iOS 10.0, *) {
                    UIApplication.shared.open(URL(string: _storeUrl)!, options: [:], completionHandler: nil)
                }
                else {
                    UIApplication.shared.openURL(URL(string: _storeUrl)!)
                }
                
            }
            else {
                print("")
                print("====================================")
                print("[S_Extension >> goMarketRun :: 앱 스토어 이동 실시 [실패]]")
                print("error :: ", "_id 값 널 임")
                print("====================================")
                print("")
            }
        }
    }
    
    
    
    // MARK: [특정 앱 설치 여부 확인]
    /*
    1. 크롬 앱 스키마 확인 : googlechrome://
    2. 호출 예시 : self.checkInstallApp(_scheme: "googlechrome://")
    3. 참고 [1] : canOpenURL 사용 시는 LSApplicationQueriesSchemes 에서 스키마 명을 등록해줘야한다 [googlechrome]
    4. 참고 [2] : 크롬으로 기본브라우저 설정 시 추가적으로 LSApplicationQueriesSchemes 에서 http , https 를 등록해줘야한다
    */
    func checkInstallApp(_scheme : String) {
        // [메인 큐에서 비동기 방식 실행 : UI 동작 실시]
        DispatchQueue.main.async {
            print("")
            print("====================================")
            print("[S_Extension >> checkInstallApp :: 외부 앱 설치 여부 확인]")
            print("_scheme :: ", _scheme)
            print("====================================")
            print("")
            
            // [URL 타입 체크 실시]
            if _scheme != nil && _scheme.count > 0 && _scheme.equals(_string: "") == false {
                // 외부앱 이동 로직 처리 실시
                if let openStore = URL(string: _scheme), UIApplication.shared.canOpenURL(openStore) {
                    print("")
                    print("====================================")
                    print("[S_Extension >> checkInstallApp :: 외부 앱 설치 된 상태]")
                    print("_scheme :: ", _scheme)
                    print("====================================")
                    print("")
                }
                else {
                    print("")
                    print("====================================")
                    print("[S_Extension >> checkInstallApp :: 외부 앱 설치 안된 상태]")
                    print("_scheme :: ", _scheme)
                    print("====================================")
                    print("")
                }
            }
            else {
                print("")
                print("====================================")
                print("[S_Extension >> checkInstallApp :: 외부 앱 설치 상태 확인 실패]")
                print("error :: ", "_scheme 값 널 임")
                print("====================================")
                print("")
            }
        }
    }
 

 

반응형
Comments