ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • URI 스킴 적용 (URL Scheme)
    Language/iOS,AOS 2023. 3. 6. 23:29

     

    URI 스킴 (URI Scheme)란?

    https://help.dfinery.io/hc/ko/articles/360039757433-%EB%94%A5%EB%A7%81%ED%81%AC-Deeplink-URI%EC%8A%A4%ED%82%B4-%EC%9C%A0%EB%8B%88%EB%B2%84%EC%85%9C-%EB%A7%81%ED%81%AC-%EC%95%B1%EB%A7%81%ED%81%AC-%EA%B5%AC%EB%B6%84%EA%B3%BC-%EC%9D%B4%ED%95%B4

     

    사용법

    오픈하고자 하는 앱이 myapp라면 myaapp:// 라는 스킴값으로 이용할수 있습니다.

     

    사용 목적?

    iOS에서 유니버셜 링크 (Univeral Link)를 적용 하였는데 대표적인 채팅사이트인 카카오에서 안된다.. OTL..

    젝12345678910시간 없으니 고민하지 말고 일단 ㄱㄱ싱 해보도록 합니다!!유니버셜 링크는 이전 포스팅을 참고하도록 하자(https://dchkang83.tistory.com/171)

     

    myapp Scheme 등록

     

    SceneDelegate 설정

    class SceneDelegate: UIResponder, UIWindowSceneDelegate {
        ...
    
        // MARK: 카카오, 네이버, 페이스북 로그인
        func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
            if URLContexts.first?.url.scheme == "neoflat",
               let url = URLContexts.first?.url {
                AppInfo.shared.uriSchemeURL = url.absoluteString.replacingOccurrences(of: "neoflat://", with: "https://")
                
                NotificationCenter.default.post(name: Notification.Name("didReceiveUriSchemeURL"), object: nil)
            }
            else if let url = URLContexts.first?.url {
                if (AuthApi.isKakaoTalkLoginUrl(url)) {
                    // MARK: 카카오 로그인
                    _ = AuthController.handleOpenUrl(url: url)
                } else {
                    ...
                }
            }
        }
        ...
    }

     

    URI 스킴 링크 핸들링 하기

    유니버셜 링크랑 동일한 방식으로 사용해 보았다.

    class MainViewController: BaseViewController {
        ...
        override func viewDidLoad() {
            super.viewDidLoad()
            
            // Uri Scheme (앱 실행중 : active, inactive)
            NotificationCenter.default.addObserver(forName: Notification.Name("didReceiveUriSchemeURL"), object: nil, queue: nil) { notification in
                let uriSchemeURL:String? = AppInfo.shared.uriSchemeURL
                AppInfo.shared.uriSchemeURL = nil
                
                if(uriSchemeURL != nil) {
                    self.executeJavasScript(wKWeb: self.wKMainWeb, callback: "Common.Native.setDeepLink('\(uriSchemeURL!)')")
                }
            }
        }
        ...
    }
    
    ...
    
    // MARK: - iOS Bridge
    // 웹 액션 정의 : WebAction을 구분하는데 사용되는 타입
    enum WebAction: String {
        ...
        case getDeepLink
    }
    extension MainViewController: WKScriptMessageHandler {
        func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
            guard message.name == "IosBridge1",
                  let messages = message.body as? [String: Any],
                  let action = messages["action"] as? String else { return }
            
            let webAction = WebAction(rawValue: action)
            
            switch webAction {
            ... 
            case .getDeepLink:
                // Universal Link (앱 종료 : background)
                guard let params: [String: String] = messages["params"] as? [String: String],
                      let callback: String = params["callback"] else {
                    return
                }
    
                let universalUrl:String? = AppInfo.shared.universalURL
                AppInfo.shared.universalURL = nil
                
                if(universalUrl != nil) {
                    executeJavasScript(wKWeb: self.wKMainWeb, callback: "\(callback)('\(universalUrl!)')")
                }
                
                
                // Uri Scheme (앱 종료 : background)
                let uriSchemeURL:String? = AppInfo.shared.uriSchemeURL
                AppInfo.shared.uriSchemeURL = nil
                
                if(uriSchemeURL != nil) {
                    executeJavasScript(wKWeb: self.wKMainWeb, callback: "\(callback)('\(uriSchemeURL!)')")
                }
                
            default:
                Utils.Log("undefined action")
            }
        }
    }
    
    ...

     

    유니버셜 링크를 해봐서 그런지 1시간도 안걸렸다.. iOS도 조금씩 느네?.. 할사람이 없어서 어쩔수 없이 하고 있긴한데.. 하고싶지 않다... ㅠ

     

    참조

    https://yoojin99.github.io/app/%EC%95%B1%EC%97%90-URL-Scheme-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0/

     

    [iOS] - 앱에 URL Sceheme 적용하기

    앱에 URL Scheme을 적용해보자.

    yoojin99.github.io

     

    댓글

Designed by Tistory.