-
Not Running 상태에서 DeepLink로 특정 URL 이동issue 2020. 9. 25. 12:14
이슈
- 앱 내 서비스 중 , 추천 상품 URL을 사용자에게 보내주는 서비스가 있습니다. (앱이 다운로드 되어 있다는 가정)
- 사용자가 해당 URL 클릭시 , 해당 앱 프로토콜을 가지고 있는 앱이 실행 됩니다.
- 13 버전 이상 , func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>)
- 13 버전 미만 , func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool
- 해당 매서드 내에서 데이터를 가공하는 서비스 로직을 불러줍니다.
- delegate를 통해 , rootViewController에게 알려주도록 했습니다.
- 가공된 데이터를 Shop URL에 QueryString으로 붙여 사용자에게 상품 상세 페이지로 이동하도록 했습니다.
- 13 버전 미만일 경우) Foreground , background , notRunning 상태에서 잘 동작 하였습니다.
- 그러나 13 버전 이상일 경우) notRunning 상태에서 deepLink에서 보내주는 데이터를 못 불러와 원하는 페이지로 이동이 되지 않았습니다.
- 이제부터 이 문제를 어떻게 해결 하였는지에 대해서 저의 방법을 알려드리겠습니다.
해결 방법
아래 두 매서드는 DeepLink로 앱이 켜질 경우 , 호출되는 매서드 입니다.
1. 13 버전 이상
2. 13 버전 미만
os 13버전 이상 ,NotRunning일 경우 위 scene(_:openURLContexts)가 호출되지 않았습니다.
구글링 중 , 13 버전 이상일 경우 scene(_:willConnectTo:options:) 매서드에서 deepLink로 전달되는 URL을 얻을 수 있다는 정보를 얻었습니다. 그래서 이를 확인하기 위해 Apple Document Doc에 들어가서 해당 매서드에 대한 설명을 정리 해봤습니다.
scene(_:willConnectTo:options:)
scene(_:willConnectTo:options:) parameters
- scene : 사용자의 앱에 연결된 화면
- session: scene의 구성요소를 가지고 있는 객체
- options: scene을 구성하기 위해 , 추가적인 요소
- scene의 생성에서 , 특정 액션을 취해야 하는 상황에서 이 정보를 사용
설명 - 이 매서드는 앱이 생성되거나 , 앱이 사용자 인터페이스 인스턴스를 복원할 경우 호출 됩니다.
- 사용자 또는 사용자의 앱이 새로운 사용자 인터페이스를 요청할 경우 , UIKit은 적절한 scene object를 생성하고 , 사용자의 앱에 연결 시켜줍니다.
- 새로운 scene의 추가에 응답할 경우 그리고 scene에 보여줄 데이터를 로딩할 경우에 이 매서드는 사용되어 집니다.
UIScene.ConnectionOptions
UIScene.ConnectionOptions - UIKit 여러 가지의 이유료 scenes을 생성합니다
- Handoff의 요청 , URL open 요청와 같은 응답에 의해 생성되어질 수 있다.
- scene을 생성하는데 세부적인 이유가 있을 경우, UIKit은 UIScene.ConnectionOptions 객체에 연관된 데이터를 채우고 연결 시간에 당신의 delegagte에 전달합니다.
정리
UIKit에서 앱이 새로운 사용자 인터페이스를 만들경우, UIKit은 적절한 scene object를 생성하고 사용자 앱과 연결시키고 , scene(_:willConnectTo:options:)를 호출 합니다.
만약, scene을 구성하는데 추가적인 구성요소가 있을 경우에는 options: UIScene.ConnectionOptions에서 정보를 제공한다고 합니다. options 값들은 Handoff의 요청의 응답 또는 URL open의 요청의 응답일 경우가 있다고 합니다.
그래서 저는 해당 options값을 사용하여 전달받은 URL을 가공하여 delegate를 통해 RootViewController에게 알려주어 제품의 상세 페이지로 이동을 시킬 수 있었습니다.
13 버전 이상, NotRunning의 상태일 경우에는 , scene(_:willConnectTo:options:) 매서드의 options값을 사용하여 원하는 처리를 하면 될 것 같습니다.
아래는 제가 적용한 코드 입니다.
봐주셔서 감사합니다...