-
[iOS-Rich Push] Notification Service Extension, Notification Content Extension을 알아보자. (푸쉬에 이미지 넣기)앱등이에게 살충제를 뿌린다./iOS 2017. 8. 31. 20:53
WWDC2016에서 iOS10과 함께 Notification Service Extension, Notification Content Extension이 소개되었습니다.
아이폰을 사용하시는 분께서는 이게 뭔지 잘 아시리라 생각됩니다.메세지 앱에 적용된 Extension
- Service Extension, Content Extension은 어떻게 다른 것인가?
- Service Extension적용하여 미디어 노출시키기
- Content Extension적용하여 푸쉬화면 커스터마이징하기
- Content Extension적용시 발생하는 몇 가지 문제점
- 서버에서 해주어야 할일
- 느낀 점
1. Service Extension, Content Extension은 어떻게 다른 것인가?
Service Extension은 페이로드를 가로채 푸쉬에 띄우고자 하는 데이터를 재구성 하는 것입니다. 메시지를 수정할 수도 있고, 페이로드에 없던 데이터를 추가할 수도 있습니다.
결정적으로, 이미지, 비디오 등 미디어를 다운로드하여 푸쉬에 첨부할 수 있습니다.푸쉬 페이로드는 4KB로 용량이 제한됩니다. 따라서 미디어를 직접전달할 수 없기 때문에, url로 전달해야합니다.
이 url의 파일을 다운로드 하는일을 Service Extension에서 하게 됩니다.Service Extension적용 전과 후 (2분전 받은 푸쉬는 Extension미구현, 그 위에 받은 푸쉬는 Extension구현)
그렇다면 Service Extension을 적용한 뒤 푸쉬에 3D Touch를 하면 어떻게 될까요?
UI가 너무 별로입니다. 네 맞습니다. 이 UI를 커스터마이징할 때 사용하는 것이 Content Extension입니다.
Content Extension는 푸쉬화면을 3D Touch하여 보는 상세화면을 구성하는 역할을 합니다.Content Extension 적용 후 (이것도 UI가 별로지만 제 감성의 한계)
2. Notification Service Extension 구현하기
새로운 타겟에서 Service Extension을 추가해줍니다. (Content Extension의 경우도 동일합니다.)
Extension이 생기고 2개의 파일이 생성됩니다.
NotificationService.swift
에는UNNotificationServiceExtension
를 상속받는NotificationService
클래스가 생성되어 있습니다.
Service Extension구현을 위해서는UNNotificationServiceExtension
에 있는 메소드를 구현하면 됩니다.APNS에서 시스템으로 푸쉬가 전달되면
didReceive(request: ...)
메소드가 호출됩니다.didReceive(request: ...)
메소드에서 페이로드로 전달된 url의 파일을 다운로드한 뒤, 프로퍼티로 갖고 있는contentHandler
클로져를 수행하면 비로소 아이폰에 푸쉬가 나타나게 됩니다.파일 다운로드는 시간제한, 용량제한이 있습니다. WWDC비디오를 보니 정확한 값은 언급되지 않았는데요.
이 제한때문에 다운로드를 실패하면serviceExtensionTimeWillExpire()
메소드가 수행되고 파일다운로드 실패에 대한 적절한 조치를 취한 뒤,contentHandler
클로져를 수행하여 푸쉬를 노출시키게 됩니다.정리하자면,
푸쉬 페이로드 도착 ->didReceive(request: ...)
에서 이미지 다운로드 시작 -> 이미지 다운로드 완료 -> 푸쉬 컨텐츠에 이미지 추가 -> 사용자에게 푸쉬 노출 입니다.WWDC에서 예시로 사용된 코드
3. Notification Content Extension
Service Extension과 마찬가지로 타겟을 생성하시면 3개의 파일이 생깁니다.
스토리보드와 UIViewController를 상속받는 클래스가 생기네요. 네, 맞습니다.
그냥 화면 구현해주시면 됩니다. 다만 몇 가지 놓칠만한 것들이 있습니다. 다음 절에서 정리하도록 하겠습니다.WWDC에서 예시로 사용된 코드
4. Content Extension을 구한할 때 마주칠 상황들
- View의 영역이 너무 큽니다.
viewDidLoad에서 사이즈를 잡아줄 수 있습니다.
- View의 영역은 잡혔습니다. 그런데 Content Extension을 열 때, View의 Initial Size가 너무 큽니다.
Content 화면이 처음 나타날 때, 앱이 Not running 상태라면 시스템에서 정확한 사이즈를 알 수 없습니다.
따라서 앱의 코드가 실행되기 전에 시스템은 미리 Initial Size를 알고 있어야 합니다. info.plist에서 알맞은 값을 셋팅해주면 됩니다.- Content Extension영역에 커스텀하게 푸쉬 메시지를 띄웠더니, 아래에 디폴트 메시지가 중복되어 나타나 보기 안좋습니다.
info.plist에서
UNNotificationExtensionDefaultContentHidden
을 YES로 수정해주세요.5. 서버에서 해주어야 할 일.
서버 개발자는 아이폰에서 요구하는 페이로드를 작성해주어야 합니다.
ServiceExtension을 사용하기 위해서는
mutable-content
필드가 있어야 합니다.ContentExtension을 적용하기 위해서는
category
필드가 있어야 합니다.category
필드에는 어떤 값이 들어가야 하는가?
이 값은 Content Extension의 info.plist에 설정해둔 값이어야 합니다.
즉, 페이로드의category
필드에 “event-invite” 또는 "event-update"값이 들어 있어야 Content Extension이 동작하게 되는 것입니다.
6. 느낀 점
Push Extension은 UGC앱의 특성 상, 있으면 좋고 없어도 그만이라는 생각이 듭니다.
단점으로는 서버와 협업이 필요하고 나아가서는 디자인/기획파트와 협의해야할 일이 생길수도 있습니다
장점으로는 앱에서는 구현할 내용이 많지는 않았습니다. 물론 스펙/디자인에 따라 다르겠지만요 ㅎㅎ
참고
7. 실제 사용 소스 (프로젝트파일 업로드가 힘듭니다. 양해바랍니다 ㅠ.ㅠ)
'앱등이에게 살충제를 뿌린다. > iOS' 카테고리의 다른 글
[iOS] Alamofire의 고급 사용법!! SessionManager, SessionDelegate, RequestAdapter, RequestRetrier (2) 2018.01.16 [iOS] 사용자 동의 없이 사용자의 위치를 파악하기 (0) 2017.10.12 [iOS] UIActivityViewController에 Instagram이 나오지 않는다? (0) 2017.08.16 [iOS] UICollectionView와 UICollectionViewFlowLayout의 관계: 간단하게 2단리스트를 만들어보자! (3) 2017.08.03 Adhoc과 in-House distribution의 차이 (0) 2017.07.24