적당한 고통은 희열이다

- 댄 브라운 '다빈치 코드' 중에서

초보 iOS 개발자의 일상/개발 업무

[Swift iOS] 푸시 메시지 클릭시 url로 WebView 이동시키기

hongssup_ 2021. 7. 28. 15:22
반응형

하이브리드 iOS 앱에서 Push 클릭시 특정 url 페이지로 이동시키는 법을 알아보자. 

 

서버 쪽에서 전달되는 Push 데이터의 구조는 다음과 같다. 

[ …

"aps": {

    alert= {

        body = (메시지);

        title = (타이틀);

    };

}, 

“link”: <linkURL>;

… ]

 

푸시 메시지를 클릭 시 실행되는 이벤트는 AppDelegate에 extension으로 UNUserNotificationCenterDelegate 프로토콜을 추가해준 후 다음 메서드에서 linkURL을 받아와 코드를 작성해줄 수 있다.  

 @available(iOS 10.0, *)
 func userNotificationCenter(_ center: UNUserNotificationCenter,
                                didReceive response: UNNotificationResponse,
                                withCompletionHandler completionHandler: @escaping () -> Void) {
    let userInfo = response.notification.request.content.userInfo
    let link = userInfo["link"] as? String
    //...링크로 페이지 이동...
    completionHanler()
}

푸시 클릭 시 링크로 페이지를 이동시킬 때, 앱이 Foreground에서 실행되고 있는지 Background에서 실행되고 있는지에 따라 설정을 다르게 해줄 수 있다. 앱의 상태는 다음과 같이 세 가지 경우가 있다. 

public enum State : Int {
    case active = 0
    case inactive = 1
    case background = 2
}

이론적으로는 이 세가지 상태에 따라 구현을 달리 해줄 수 있다. 

그런데 로그를 찍어보니 그냥 전부 inactive 상태에서 실행이 되는것이 아닌가!! 

앱이 처음 실행될 때는 로그 확인이 불가하지만, 앱이 켜져있거나 백그라운드에 있을 때는 모두 inactive 상태의 로그가 찍힌 것을 확인할 수 있었다. 오잉??? 

그래서 앱의 실행 구조를 살펴보았더니 백그라운드에 있더라도 푸시 클릭시 앱이 열리며 Foreground에서 inactive로 바로 실행이 되는건가 하고 조심스레 추측을 해본다... 

그래서 그냥 나는 AppDelegate 내에 isFirstLoad라는 Bool 변수를 하나 만들어 주어

앱이 처음 실행될 때만 링크만 따로 설정해주고, 

나머지의 경우는 링크 설정 후 다시 바로 WebView로 넘어가게끔 설정을 해 주었다. 

앱의 현재 상태와는 상관없이 코드가 잘 실행되는것으로 보인다. 

 

참고 : 소소ing, iOS Background Mode

728x90
반응형