본문 바로가기
모바일

[iOS] 푸시알림 APN 링크 받아서 링크주소로 웹뷰 이동하기

by 코딩공장공장장 2021. 3. 3.

안녕하세요. 

 

iOS에서는 푸시알림을 애플의 자체 서비스인 Apple Push Notification Service를 통해 이루어집니다. 

 

우리는 이전에 포스팅들을 통해 파이어베이스를 통해 파이어베이스 콘솔에서 푸시를 받는 법과(밑의 링크참조)

 

developer111.tistory.com/42

 

[iOS] 푸시알림 클라우드 메세지 보내기[1] (APNS, 파이어베이스)

iOS에서 푸시알림 기능 사용해보겠습니다. 파이어베이스 document에서 나온 설명을 기반으로 구현해볼 예정이며 안드로이드와는 다르게 인증해야할 부분이 많이 있습니다. iOS에서 푸시 알림은 APNS

developer111.tistory.com

 

 

developer111.tistory.com/43

 

[iOS] 푸시알림 클라우드 메세지 보내기[2] (APNS, 파이어베이스)

이번 포스팅은 인증설정 부분입니다. 프로젝트 설정과 xcode 설정은 지난번 포스팅에서 하였으니 처음부터 따라하실 분들은 아래 포스팅을 참조해주세요. developer111.tistory.com/42 [iOS] 푸시알림 클

developer111.tistory.com

 

 

 

 

자바 스프링 기반의 웹서버에서 iOS의 앱에 푸시알림을 보내는 방법을 해보았습니다. 

 

 

developer111.tistory.com/44

 

[ios] 자바 스프링 서버에서 iOS앱에 푸시 알림 보내기(파이어베이스, APN)

우리는 이전에 파이어베이스 클라우드 메세지를 통하여 iOS앱에 푸시알림을 보내봤습니다. 지난번 포스팅에 이어지는 내용입니다. 설정 또한 지난번 포스티해서 설정한 내용을 그대로 이어나갈

developer111.tistory.com

 

 

 

 

 

보통 푸시알림을 보내면 단순 내용 전달하는 경우도 있지만, 알림내용에 알맞는 페이지를 보여주는 경우도 있습니다.

 

 

따라서 알림을 클릭하면 해당 내용에 맞는 페이지를 구현해야하는 경우도 생기죠.

 

오늘은 웹뷰 기반의 하이브리드앱에서 링크를 받아서 웹뷰의 url을 이동시키는 방법을 구현해보겠습니다. 

 

가정은 웹서버에서 iOS 하이브리드 앱에 푸시알림을 보내는 기능은 구현이 되어있다는 전제조건 하에 설명하겠습니다.

 

웹서버에서 하이브리드 앱에 푸시알림을 보내는 기능이 구현 안되신 분은 위의 링크를 참조해주세요.

 

 

- AppDelegate.swift

 

//푸시 알림 클릭하고 들어오면 실행되는 메소드
    @available(iOS 10.0, *)
    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void){
        
        NSLog("푸시 클릭하고 들어옴")
        let pushUrl = response.notification.request.content.userInfo["link"] as? String
        NSLog((pushUrl ?? "링크 없음") as String)
        if pushUrl !=  nil {
            NSLog("앱델레케이트 푸시타고 들어옴, 링크있음")
            if UIApplication.shared.applicationState == .active {
                NSLog("포그라운드에서 클릭")
                let vc = UIApplication.shared.windows.first!.rootViewController as! ViewController
            
                vc.loadWebPage(pushUrl!)
            }else{
                NSLog("백그라운드에서 클릭")
                let userDefault = UserDefaults.standard
                userDefault.set(pushUrl, forKey: "PUSH_URL")
                userDefault.synchronize()
            }
        }else{
            NSLog("앱델레케이트 푸시타고 들어옴, 링크 없음")
        }
        completionHandler()
    }

 

 

위의 메서드는 푸시 알림을 클릭하는 경우 실행되는 메서드입니다. 

 

저는 서버에서 파라미터를 보낼때 "link" 라는 키값으로 url을 보냈습니다. 

 

따라서 밑의 코드를 통해 url을 받을 수 있습니다.

 

let pushUrl = response.notification.request.content.userInfo["link"] as? String

 

이때 조건문을 통해 푸시 url이 있는지 없는지를 구분합니다. 

 

url이 있다면 그 안에서 또한 포그란운드에서 푸시를 클릭했는지 백그라운드에서 푸시를 클릭했는지 구분합니다.

 

포그라운드에서 클릭했다면, 웹뷰의 url을 바로 이동시켜주고

 

백그라운드에서 클릭했다면 userDefault를 통해 PUSH_URL 이라는 키와 url 값을 매핑하여 셋팅하였습니다. 

 

위 메서드에서 아래 부분이 해당하는 내용입니다. 

 

		let userDefault = UserDefaults.standard
                userDefault.set(pushUrl, forKey: "PUSH_URL")
                userDefault.synchronize()

 

여기서 중요한 부분은 uerDefault라는 객체입니다. 

 

이 객체는 뷰컨트롤러에서도 사용할 수 있으므로  백그라운드에서 포그라운드로 전활될때 실행되는 메서드에서

 

userDefault값을 확인하여 PUSH_URL 값이 있다면 해당하는 url로 이동시키는 것입니다.

 

 

 

 

 

 

 

- ViewController.swift

 

	//백그라운드에서 포그라운드로 전환되면 실행되는 함수
        NotificationCenter.default.addObserver(forName: UIApplication.didBecomeActiveNotification, object: nil, queue: nil) { (Notification) in
               
            let userDefault = UserDefaults.standard
            let pushUrl:String? = userDefault.string(forKey: "PUSH_URL")
            
            //링크가 있는 푸시를 클릭하는 경우에만 실행
            if(pushUrl != nil){
                NSLog(pushUrl!)
                NSLog("푸시에서 전달받은 웹뷰로")
                let myUrl = URL(string: pushUrl!)
                let myRequest = URLRequest(url: myUrl!)
                self.webView.load(myRequest)
                userDefault.removeObject(forKey: "PUSH_URL")
                userDefault.synchronize()
            }
        }
    }

 

위의 메서드는 백그라운드에서 포그라운드로 전환되면 실행되는 함수입니다. 

 

따라서 이 메서드에서 userDefault 값을 가져와서

 

if(pushUrl != nil){
                NSLog(pushUrl!)
                NSLog("푸시에서 전달받은 웹뷰로")
                let myUrl = URL(string: pushUrl!)
                let myRequest = URLRequest(url: myUrl!)
                self.webView.load(myRequest)
                userDefault.removeObject(forKey: "PUSH_URL")
                userDefault.synchronize()
            }

 

조건문을 통해 url값이 있는지 없는지 파악해서 있다면 링크로 이동하는것입니다. 

 

웹뷰를 이동시킨 다음에는 꼭 userDefatul에서 removeObject 를 통해서 url 값을 제거시켜줘야 합니다.(위에서 처럼)

 

지우지 않는다면 userDefault 값에 계속 url 값이 남아있어 백그라운드에서 포그라운드로 들어올때마다 

 

계속해서 푸시로 받은 링크로 이동하게 됩니다.

반응형