문의 시, 사용하시는 SDK 버전 정보와 디벨로퍼스 앱ID를 알려주세요.
안녕하세요!
앱을 백그라운드 종료 후 카카오 공유 링크 클릭 시 링크 관련 정보를 불러오지 못하여 문의 드립니다.
앱이 실행되고 있는 경우 링크 클릭 시 func scene(_ scene: UIScene, openURLContexts URLContexts: Set) 를 통해 링크 정보들이 잘 들어오는데 앱 종료 후에는 정보를 불러 오지 못한 상태로 앱이 켜집니다.
앱이 설치 되지 않았을 경우에는 스토어로 이동도 잘 되고 있급니다.
링크 클릭 시 func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) 에서 connectionOptions.userActivities 를 통해 들어 오는지 확인 시도를 해보았는데 확인이 어려워 문의 드립니다.
info.plist 파일 Queried URL Schemes에 kakaolink, kakaompassauth 설정되어 있고 URL types에 kakao{{nativeAppKey}} 설정되어 있습니다.
현재 KakaoSDKCommon, KakaoSDKShare 버전은 2.19.0 사용 중 입니다. 앱 아이디는 910131 입니다.
tim.l
12월 21, 2023, 1:23오전
#2
안녕하세요 !
정확한 내용 파악 후, 안내드리기 위해 재현 영상 첨부 부탁드립니다.
재현 영상.zip (7.8 MB)
안녕하세요!
재현 영상 압축 파일 첨부하였습니다.
감사합니다.
tim.l
12월 21, 2023, 5:14오전
#4
증상만 보면
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
위 scene에서만 처리하고
아래 scene , 앱 실행시 파라메터 처리는 잘못된듯한데요.
func scene(_ scene: UIScene,
willConnectTo session: UISceneSession,
options connectionOptions: UIScene.ConnectionOptions) {
관련 코드 블럭 공유해주시겠어요?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let scene = (scene as? UIWindowScene) else { return }
let window = UIWindow(windowScene: scene)
let splashViewModel = SplashViewModel()
let splashViewController = SplashViewController(viewModel: splashViewModel)
window.rootViewController = RootNavigationViewController(rootViewController: splashViewController)
window.overrideUserInterfaceStyle = .light
window.makeKeyAndVisible()
self.window = window
UNUserNotificationCenter.current().delegate = self
//앱 꺼져있을경우 DynamicLink 이벤트 전달
for userActivity in connectionOptions.userActivities {
if userActivity.webpageURL != nil {
self.scene(scene, continue: userActivity)
} else {
self.scene(scene, openURLContexts: connectionOptions.urlContexts)
}
}
if let response = connectionOptions.notificationResponse {
let userInfo = response.notification.request.content.userInfo
NotificationCenter.default.post(name: Notification.Name("actionKey"), object: nil, userInfo: userInfo)
}
}
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
for context in URLContexts {
let url = context.url
ApplicationDelegate.shared.application(UIApplication.shared, open: url, sourceApplication: nil, annotation: [UIApplication.OpenURLOptionsKey.annotation])
if (AuthApi.isKakaoTalkLoginUrl(url)) {
_ = AuthController.handleOpenUrl(url: url)
return
}
if (ShareApi.isKakaoTalkSharingUrl(url)) {
let queryItems = URLComponents(string: url.absoluteString)?.queryItems
if let code = queryItems?.filter({$0.name == "friend_code"}).first?.value {
UserDefaults.standard.set(code, forKey: UserDefaultsKeyService.friendCode.rawValue)
}
if let endPoint = queryItems?.filter({$0.name == "ep"}).first?.value {
UserDefaults.standard.set(endPoint, forKey: UserDefaultsKeyService.endPoint.rawValue)
let split = endPoint.split(separator: "_")
if !split.isEmpty && split.count > 1 {
UserDefaults.standard.set(split[1], forKey: UserDefaultsKeyService.cardId.rawValue)
}
}
if let cardId = queryItems?.filter({$0.name == "card_id"}).first?.value {
UserDefaults.standard.set(cardId, forKey: UserDefaultsKeyService.cardId.rawValue)
}
return
}
}
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
if let webUrl = userActivity.webpageURL {
if (ShareApi.isKakaoTalkSharingUrl(webUrl)) {
let queryItems = URLComponents(string: webUrl.absoluteString)?.queryItems
if let code = queryItems?.filter({$0.name == "friend_code"}).first?.value {
UserDefaults.standard.set(code, forKey: UserDefaultsKeyService.friendCode.rawValue)
}
if let endPoint = queryItems?.filter({$0.name == "ep"}).first?.value {
UserDefaults.standard.set(endPoint, forKey: UserDefaultsKeyService.endPoint.rawValue)
let split = endPoint.split(separator: "_")
if !split.isEmpty && split.count > 1 {
UserDefaults.standard.set(split[1], forKey: UserDefaultsKeyService.cardId.rawValue)
}
}
if let cardId = queryItems?.filter({$0.name == "card_id"}).first?.value {
UserDefaults.standard.set(cardId, forKey: UserDefaultsKeyService.cardId.rawValue)
}
return
} else if let referenceUrl = userActivity.referrerURL {
if (ShareApi.isKakaoTalkSharingUrl(referenceUrl)) {
let queryItems = URLComponents(string: referenceUrl.absoluteString)?.queryItems
if let code = queryItems?.filter({$0.name == "friend_code"}).first?.value {
print("loginloginloginloginlogin: \(code)")
UserDefaults.standard.set(code, forKey: UserDefaultsKeyService.friendCode.rawValue)
}
if let endPoint = queryItems?.filter({$0.name == "ep"}).first?.value {
UserDefaults.standard.set(endPoint, forKey: UserDefaultsKeyService.endPoint.rawValue)
let split = endPoint.split(separator: "_")
if !split.isEmpty && split.count > 1 {
UserDefaults.standard.set(split[1], forKey: UserDefaultsKeyService.cardId.rawValue)
}
}
if let cardId = queryItems?.filter({$0.name == "card_id"}).first?.value {
UserDefaults.standard.set(cardId, forKey: UserDefaultsKeyService.cardId.rawValue)
}
}
SceneDelegate에 있는 카카오 공유 코드 전달 드립니다.
감사합니다!
tim.l
12월 21, 2023, 5:57오전
#6
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
구문에서 다른 로직 제외하고 url 어떻게 들어오는지 확인 부탁드려요.
if let url = connectionOptions.urlContexts.first?.url.absoluteString {
print(“url = (url)”)
1개의 좋아요
확인해보니 카카오 공유 링크 들어옵니다.
for userActivity in connectionOptions.userActivities {
if userActivity.webpageURL != nil {
self.scene(scene, continue: userActivity)
} else {
self.scene(scene, openURLContexts: connectionOptions.urlContexts)
}
}
이 부분이 문제였습니다 ㅠㅠ
connectionOptions.userActivities가 empty인 경우를 생각하지 못 했습니다.
switch connectionOptions.userActivities.isEmpty {
case true:
self.scene(scene, openURLContexts: connectionOptions.urlContexts)
case false:
for userActivity in connectionOptions.userActivities {
if userActivity.webpageURL != nil || userActivity.referrerURL != nil {
self.scene(scene, continue: userActivity)
} else {
self.scene(scene, openURLContexts: connectionOptions.urlContexts)
}
}
}
이렇게 변경 하니 백그라운드에서 종료 되었을 떄도 링크 잘 타고 들어가집니다.
덕분에 해결 되었습니다.
정말 감사합니다
1개의 좋아요