iOS 10 Extension Notification 기능을 사용하기 위해서 HIVEExtension.framework를 다운로드해서 활용하여 사용 가능합니다.

알림 그룹 만들기

알림 센터에서 알림을 그룹으로 표시할 수 있습니다. 동일한 이벤트에 해당하는 알림들은 그룹화하여 축소해 표시할 수 있습니다. 축소한 알림 그룹은 유저가 다시 확장할 수 있으며, 하위 알림(그룹에 속한 각 알림)은 개별적으로 실행할 수 있습니다.

알림 그룹은 Hive 콘솔 > 노티피케이션 > 푸시 캠페인 등록 > 캠페인 등록 > 옵션 > 그룹 키에서 그룹 키를 사용으로 변경하고 키 값을 추가하여 만들 수 있습니다. Hive 콘솔에서 그룹을 만든 후, 로컬 푸시 및 리모트 푸시를 발송할 때 groupId로 알림 그룹을 적용할 수 있습니다. 그룹을 적용하면 아래와 같이 알림들이 그룹별로 축소되어 보이게 됩니다.

Android
iOS

iOS 10 Advanced Notification

Apple의 iOS 10에서 UserNotifications.framework가 추가되어 이 Framework를 활용하면 Notification에 아래와 같이 미디어(이미지, 동영상)를 추가할 수 있습니다.

JPG(이미지)
GIF(이미지)
MP4(동영상)

시스템 요구사항

  • Xcode 8.0 및 사용 가능한 macOS 버전과, iOS 10 설치가 가능한 기기가 필요합니다.
  • 하위 버전의 OS 에서는 Extension을 적용하더라도 기존과 동일한 Notification을 전달받게 됩니다.

  • iOS 10 지원 기기

iOS 10.1 이하인 경우 OS 자체 결함으로 인하여 미디어를 추가한 Extension이 정상적으로 동작하지 않는 경우가 있습니다. Extension의 Deployment Target을 10.2로 설정하여 10.1 이하의 OS에서는 기존의 Notification을 전달 받도록 구현하세요.

동작 과정

이 기능은 iOS의 Notification Service Extension(이하 Extension)을 활용하여 동작합니다.
Notification Service Extension 이란 사용자에게 Remote Notification이 전달되기 전, Payload를 수정할 수 있는 App Extension의 하나로Context의 전환 없이 다른 앱의 프로세스 (UI 또는 기능)를 사용할 수 있는 기술입니다.
자세한 내용은 다음을 참고하세요. 자세히

  • Extension 적용 후의 Remote Notification 전달 과정

파일 용량 및 타입 제한

미디어 파일 첨부 시 용량 제한이 있으며 상세 내용은 UNNotificationAttachment에서 확인할 수 있습니다.

분류 타입 제한 용량
오디오 WAV, MP3, MP4(Audio) 5MB
이미지 JPG, JPEG, PNG, GIF 10MB
동영상 MP4, AVI 50MB
  • 네트워크가 원활하지 않아 타임아웃이 발생했을 경우, 사용자는 미디어가 포함되지 않은 일반 Notification을 전달받게 됩니다.
  • 매우 느린 속도의 네트워크에서는 최대 10분간 다운로드를 진행하기도 하므로 해당 지역의 네트워크 상태를 고려하여 적당한 용량을 가진 미디어를 사용해야합니다.

구현 및 활용

미디어를 다운로드하고 Notification 객체를 재구성하여, 사용자에게 전달하는 작업을 수행하기 위해서는 몇 가지 설정 및 소스 코드 추가가 필요합니다.

Notification Service Extension은 라이브러리 또는 프레임워크에 포함하여 배포가 불가능함으로 Extension을 사용하기 위해서는 Hive가 제공하는 가이드를 바탕으로 설정을 진행해야 합니다.

Extension 추가

이 기능을 사용하려면, 프로젝트에 Notification Service Extension을 추가해야 하며 클래스를 직접 추가하거나 오버라이드 하지 않고, 프로젝트에 새로운 타겟을 추가하는 방식을 사용합니다.

프로젝트에 타겟을 추가하면 자동으로 Template이 생성됩니다.

1. 프로젝트 설정에서, 타겟 추가 버튼을 클릭 (하단의 빨간색 네모)

2. Notification Service Extension을 선택하고, Next를 클릭
(Xcode 8부터 프로젝트에 Notification Service Extension을 타겟으로 추가할 수 있게 되었음)

3. Product Name을 입력

4. 아래와 같은 팝업이 노출되면, Activate를 클릭
현재 프로젝트에 Extension이 자동으로 포함(Embedded)되고, 빌드를 위한 Scheme가 추가됨

5. General 탭에서, 프로젝트에 Extension이 추가된 것을 확인

6. 프로젝트에 NotificationService라는 이름의 템플릿 클래스가 추가됨

7. 추가된 Extension의 Deployment Target 을 10.2 이상으로 설정

HIVEExtensions Framework 추가

Hive에서 제공되는 HIVEExtension.framework를 활용하여, 미디어를 손쉽게 다운로드할 수 있습니다.
HIVEExtensionFramework를 추가하는 방법은 다음과 같습니다.

1. Framework 직접 추가하기

  • HIVEExtension.framework를 프로젝트에 추가

  • 아래 스크린샷과 같은 팝업이 노출되면 추가한 Extension 타겟에 체크하고 Finish 버튼을 클릭

2. Framework Search Paths 설정
Xcodeproj – 생성한 Extension Target 선택 – Build Settings – Framework Search Paths에 HIVEExtension.framework가 저장된 경로를 추가

3. Framework Status 설정
iOS 10.2 이하 버전을 지원하는 게임의 경우 HIVEExtensions.framework를 Optional로 변경

  • Xcodeproj – 생성한 Extension Target 선택 – General – Linked Frameworks and Libraries
Framework 적용

NotificationService.m에 아래 예시와 같이 Framework를 Import 합니다.

템플릿에서 제공하는 메서드에서 HIVEExtensions.framework가 제공하는 메서드를 호출하도록 구현하고 메서드 내부에 있는 최초 템플릿 코드를 삭제하세요.

#import <HIVEExtensions/HIVEExtensions.h>

- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
[HIVENotificationService didReceiveNotificationRequest:request withContentHandler:contentHandler];
}

- (void)serviceExtensionTimeWillExpire {
[HIVENotificationService serviceExtensionTimeWillExpire];
}

적용 시 주의 사항

발송, 수신 시점의 차이

Extension에서 모든 작업이 종료된 이후에, 사용자에게 Notification을 전달하게 됨에 따라 발송 시간과 수신 시간에 차이가 발생할 수 있으며 클라이언트에서는 서버에서 발송한 시간 기준으로 표시됩니다.

예를들어, 15:00에 Notification을 발송하고, 다운로드가 완료 된 시간이 15:05분일 경우, Notification은 15:00에 도착한 것으로 표시됩니다.

디바이스 용량

푸시를 통해 전달받은 미디어는 유저의 기기 내부에 저장된 후에 푸시를 통해 노출되며 전달받은 미디어는 기기 내부 Cache 데이터 공간에 저장되어 유저 기기 내부 용량을 차지하게 됩니다.
Cache데이터 공간은 유저 디바이스 내부 저장용량이 부족한 경우 OS에서 자체적으로 데이터를 삭제합니다.

유저의 모바일 데이터 사용

푸시를 통해 전달받은 미디어를 다운로드 받는데 유저의 모바일 데이터를 사용하게 되며 유저의 동의 없이 다운로드가 진행되어 다운로드시 데이터 이용 비용이 발생 할 수 있습니다.

푸시를 통해 오디오 / 영상 파일을 전달받는 경우 다운로드 전 유저의 네트워크 연결 상태를 확인하고 유저가 Wifi 연결 상태가 아니라면 다운로드를 진행하지 않고 미디어가 없는 푸시를 노출하도록 합니다.

이때 푸시를 통해 전달받은 미디어의 타입은 미디어 URL 제일 끝에 명시된 확장자로 확인하며 [파일 용량 및 타입 제한] 항목에 명시된 확장자만 정상적으로 노출됩니다.

전달받은 URL wifi LTE / 3G
http://xxx/notimovie.mp4 항상 다운로드 후 푸시에 미디어 노출 영상파일에 해당하는 확장자 (mp4)를 가졌으므로 미디어 다운로드 없이 푸시 노출
http://xxx/notimovie 항상 다운로드 후 푸시에 미디어 노출 음성파일/미디어 파일이 아니므로 다운로드 후 푸시에 미디어 노출
http://xxx/notisound.wav 항상 다운로드 후 푸시에 미디어 노출 음성파일에 해당하는 확장자 (wav)를 가졌으므로 미디어 다운로드 없이 푸시 노출
http://xxx/notiimage.jpg 항상 다운로드 후 푸시에 미디어 노출 음성파일/미디어 파일이 아니므로 다운로드 후 푸시에 미디어 노출
App Transport Security 설정

Apple의 기본 정책은 모든 앱에서 수행하는 서버 통신은 https를 허용하도록 되어있으며 Notification을 통해 전달받는 URL도 해당 정책에 영향을 받습니다. Http 도메인을 사용하여 통신하고자 하는 경우 App Transport Security(이하 ATS) 예외 설정이 필요합니다.
이때, Application에서 ATS 예외 처리가 되어있더라도, 푸시를 통해 전송받는 url에 http도메인을 이용하기 위해서는 Extension에서 ATS 예외 설정을 하세요.

Bitcode 에러 해결방법

추가된 Extension의 설정에 bitcode가 활성화되어 있는 경우 아래와 같은 에러가 발생할 수 있습니다. 이와 같은 상황이 발생하는 경우 Xcodeproj – 생성한 Extension Target 선택 – Build Settings – Enable Bitcode 를 No로 변경하세요.

Unity에서 미디어가 전달되지 않는 경우
Hub connection error Error Domain=NSCocoaErrorDomain Code=4097 "connection to service named com.com2us.hivesdk.normal.freefull.apple.global.ios.universal.NotificationServiceExtension" UserInfo={NSDebugDescription=connection to service named com.com2us.hivesdk.normal.freefull.apple.global.ios.universal.NotificationServiceExtension}

유니티에서 위와 같은 에러 로그가 노출되면서 미디어가 전달되지 않는 경우가 있습니다. 이 경우 생성된 Extension Target의 Architectures에 armv7, arm64 값이 둘 다 포함되어 있는지 확인하세요.