본문 바로가기
WWDC

WWDC20 - The Push Notifications primer

by vapor3965 2021. 8. 9.

목차


    • 세션보면서 정리한 내용입니다. 해석이 잘못된 경우가 있을수있으니 발견하시면 댓글로 남겨주시면 감사하겠습니다🙏🏻

    https://developer.apple.com/wwdc20/10095

     

    The Push Notifications primer - WWDC20 - Videos - Apple Developer

    Help people get the most out of your app with push notifications for important events and updates — and by delivering up-to-date data in...

    developer.apple.com

     


    요약

    push notification은 앱이 포그라운드 상태일 필요가 없게해주고, 필요하면 앱을 런치하게 해준다. 

    하기 위해서는 push notification을 enable해야한다. 

     

    push notification은 공통적으로, registerForRemoteNotification()을 호출해야하고,

    이를통해  application(_ application:, didRegisterForRemoteNotificationsWithDeviceToken: ) 이 호출되고,

    받아오는 디바이스 토큰을 서버에 보내도록 한다. 

    서버에서 push할때 payload에는 딕셔너리형태이고, "aps"를 포함해야한다. 

     

    push notification에는 크게 2가지 타입이있다.

    • alert push notification
      • 추가적으로 UNUserNOtificaitonCenterDelegate를 채택해야한다. 
      • 또한 화면에 나타나므로, 유저에게 permission를 받아야한다. 
        • UNUsertNotificationCenter.current().requestAuthorization( ) 
      • push payload에는 "aps" - alert -  title, body가 필요하다. 
      • notification을 열때, 핸들링해야하므로, userNotificationCenter(_ center:, didReceive, withCompletionHandler:)를 구현하여, 추가적인 정보들을 딕셔너리로부터 파싱하고, 항상 마지막에는 completionHandler()를 호출한다.
    • background push notification 
      • alert push와 다르게, 화면에 나타나지 않고, notification을 받자마자 앱을 런치하여 데이터를 받아오게 할 수 있다.
      • 그러므로 시스템은 다양한 조건들을 고려하여 앱을 런칭할지 결정한다. ( 무조건 실행된다는 보장이 없다. ) 
      • push payload에는 "aps" - content-available을 반드시 포함해야한다.
      • notification을 받으면 핸들링해야하므로, application(_ application:, didReceiveRemoteNotification, fetchCompletionHandler: ) 를 구현하여  데이터를 추가적으로 받아오도록 한다. 
      •  

     

     

     


     

    아래들을 배워볼것이다.

     

     

    push notification은 앱을 활성화하도록 해주며, 실시간으로 업데이트하게해준다. 

     

     

    push notification의 장점은 무엇인강?

     

    우선 앱이 포그라운드 상태일필요가 없게해준다.

    필요하다면 앱을 런치하게해준다.

    고객들과 engage하도록 하는 아주 효과적인 방법이다.

     

     

    push notfication은 두가지타입이 있다.

    • alter notification
      • 시각적으로 보여주게 하는 alert이며, 앱이 커스터마이징할수있다.
      • 앱이 러닝하도록 요구하지 않고, 앱의 상태가 무엇이든지에 따라 보여진다. 
    • background notification
      • 실시간으로 앱이 포그라운드에 있지 않아도 최신으로 업데이트하게 해준다.

     


    alert notification 세팅하는 방법

     

     

    remoteNotificaitonregister한다.

    이를 통해 디바이스는 APNs( Apple push Notification system ) 에 등록되고 앱에 디바이스 token을 전달한다.

    이 토큰을 통해 디바이스를 구별하도록 하게 해주고, notification을 정하게 해준다.

    그리고 UNUserNotificationCenterDelegate를 채택하고, 이제 alert가 열릴때 앱에 알리도록 하게해준다.

     

    그리고, registerForRemoteNotification을 호출할때마다 아래 두가지 메서드중 하나가 호출된다

    말그대로 실패하면 실패이유와 같이 호출되고,

    성공하면, 토큰을 전달하는데, 이것을 백앤드푸시서버에 전달한다. 이 토큰을 이용하여 서버는 푸시할수있다.

     

    토큰을 받으면, string으로 만들어서 서버에 전달한다. 

     

     

     

    디바이스가 notification을 받기전에, 허가를 받아야한다. 

    아래와같이 호출하면 화면에 뜨게된다.

    사용자의 허가결정은 completionhandler에 호출되고, 디바이스세팅에 설정된다.

     


     

    notification payload를 핸들링하기전에, 

    payload의 예를 살펴보자.

     

    래스토랑을 위한 앱이있다고하고, 특별한게 생겼을때 유저에게 알리고싶다라고 가정하자.

     

    이렇게 버거가 할인하고 있다고 알람이있다. 

     

    payload 부분을 살펴보자.

    "aps" 딕셔너리가 있고, 이것은 디바이스가 notification을 어떻게 랜더링할지 지정하도록 한다.

    그안에는 "alert" 딕셔너리가 있고, 이를 통해 notification이 무엇을 보여줄지 정한다. 

    title은 짧고 이해하기쉽도록 해야한다.

    sound는 옵셔널이며, 사운드가 들리도록 하고싶다면 포함시켜야한다. 

    시스템 default로 사용하고자 한다면 default로 쓰고, 커스텀도 가능하다. 

    badge도 마찬가지로 옵셔널이고, 앱아이콘에 보여지는 숫자가된다.

    • 이 값은 notifcation을 처리할때 ( 앱을열고) 0으로 할당할수있다. 

    aps바깥에 추가적으로 정보를 제공할 수 있따. 

     


     

    자 이제 notification payload를 핸들링하는 방법을 보자.

     

    UNUsertNotificaationCenterDelegate의 메서드로, notification을 열때마다 호출된다.

    completionHandler가 있는데, 반드시 이 함수를 나가기전에 호출한다.

     

    그리고 response에서 userinfo( 위에있던 딕셔너리 ) 를 꺼낼 수 있고,  JSON으로 파싱한다.

    마찬가지로 성공하든 아니든 마지막에 completionHandler()를 호출한다. 

     

     

    alert  push notification은 이게 다다.

     

     


    이제 background push notification은 alert push와 비슷하지만, 아주중요한 다른점이 있다.

     

    background push는 받자마자 앱이 데이터를 fetch하도록 허락해준다.

    즉 앱이 러닝하고있지 않아도 항상 최신상태로 유지하기위해 사용된다.

    시스템은 앱이 런치하도록 하게 해주고, 필요한 런타임을 준다. 

    하지만 약간의 제한이 있다. 즉, 무조건 앱이 런칭된다는 보장은 없다. 예를들어 배터리가 아주낮은 상태이면 실행되지 않을 수 있다.

     

    그럼 background push를 설정하고, 핸들링하는 방법을 보자. 

     

    마찬가지로 등록하는데, delegate할 필요가 없고,  UNUserNotificationCenter를 assign할 필요도 없다. 

    • 즉 delegate는 alert push일때만 필요하다. 

     

    하지만 registerForRemoteNotification()을 호출했기때문에, 디바이스 토큰 핸들링이 필요하다. ( alert push처럼 ) 

     

    그럼 payload를 보자.

    아주 간단한데, 필요한부분은 "aps" - "content-available" 필드다. 

    • 이를통해 시스템은 이것이 background notification임을 알 수 있고, 앱이 런치되어져야한다고 안다. 

    나머지는 마찬가지로 추가적인 정보다. 

     

    그럼 핸들링을 할 메서드가 필요하고, 받을때마다 아래메서드가 호출된다.

    completionHandler가 있는데, 이것은 alert push와 다르게 파라미터를 하나가지고있고, 

    그것은 enum이고, 데이터가 잘들어오면, .newData, 

    데이터가없다면 .noData를 넣는다. 

    실패한다면 .failed 

    • 뭐..이를 통해 시스템은 더 스마트해진다고 한다. 미래에 언제 앱을 런칭시킬지... 

    여튼, payload를 처리하면서, 메뉴들을 최신으로업데이트하도록 한다.

     

    이게 전부다!


     

    push notification을 enable하도록 하고, 

    위와 같은 스탭들을 따른다.

     

     

     

     

    댓글