콘텐츠로 이동

부가 기능

알림 그룹 만들기

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

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

Android
iOS

iOS 미디어 노티피케이션

Apple의 UserNotifications 프레임워크를 활용하면 Notification에 이미지, 동영상 등의 미디어 파일을 추가할 수 있습니다.

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

동작 과정

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

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

파일 용량 및 타입 제한

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

Warning

Youtube나 각종 모바일 게임(예. 서머너즈 워, 별이되어라, 체인스트라이크) 등 AVAudioSession을 사용하는 앱이 실행 중일 때, 푸시로 전달 받은 오디오를 전송할 경우 메인 화면(Springboard)이 재부팅되는 현상을 발견했습니다. 이는 iOS 버전이나 기기 종류에 관계 없이 발생하며, Hive와 별개로 Apple 시스템 내에서 충돌이 발생하는 것으로 확인했습니다.

2018년 12월 20일 Apple 측에 해당 현상을 문의한 상태로 대응이 마련될 때까지 미디어 푸시를 이용한 오디오 전송 기능 사용을 중단하세요.

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

구현 및 활용

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

Note

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

Extension 추가

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

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

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

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

3. Product Name을 입력 noti_adv_1_plus-button

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

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

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

HIVEExtensions.framework 추가

Hive에서 제공되는 HIVEExtensions.framework 를 활용하여, 미디어를 손쉽게 다운로드할 수 있습니다.

HIVEExtensions.framework 를 추가하는 방법은 다음과 같습니다.

  1. Hive SDK는 CocoaPods를 지원합니다. 프로젝트 경로에 Podfile이 없다면 pod init을 수행하세요. noti_adv_7-2_pod-init-terminal

    Podfile이 있다면 파일을 열어 target 'NotificationServiceExtension(예시타겟명)' do-end 구문을 작성하세요. noti_adv_7-2_pod-init-terminal

  2. 스크린샷을 참고하여 pod 구문을 작성하세요. noti_adv_7-2_pod-init-terminal

  3. Podfile을 닫고, 프로젝트 경로에서 pod install을 수행하세요. noti_adv_7-2_pod-init-terminal

  4. NotificationSample(예시프로젝트명).xcworkspace를 열면 다음과 같이 Pods 프로젝트가 추가된 것을 볼 수 있습니다. 이제 NotificationSample과 NotificationServiceExtension 타겟에서 HIVEExtensions를 임포트할 수 있습니다. noti_adv_7-2_pod-init-terminal

Framework 적용

NotificationService.m 파일에 예시와 같이 Framework를 임포트합니다. 템플릿에서 제공하는 메서드에서 HIVEExtensions.framework가 제공하는 메서드를 호출하도록 구현하고 메서드 내부에 있던 최초 템플릿 코드는 삭제하세요.

import HIVEExtensions

func didReceiveNotificationRequest(request: UNNotificationRequest, with contentHandler: (UNNotificationContent) -> Void) {
    HIVENotificationService.didReceive(request) { content in
        guard let content else { return }
        contentHandler(content)
    }
}

func serviceExtensionTimeWillExpire() {
    HIVENotificationService.serviceExtensionTimeWillExpire()
}
#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 예외 설정을 하세요.

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 값이 둘 다 포함되어 있는지 확인하세요. noti_adv_7-2_pod-init-terminal