개발자 가이드
사용자 가이드개발자 가이드API 가이드🏠
한국어
한국어
  • 홈
  • 공통
    • 통합 ID 연동 시나리오
    • 상수
    • FAQ
  • 플랫폼 별 가이드
    • Android
      • 연동하기
      • 이벤트
      • 유저 식별 정보 설정
      • 유저 프로필 설정
      • 액션
        • 푸시
        • 인앱메시지
        • 알림톡
        • 문자
      • 개인 정보 보호
        • 개인 정보 보호 지원
        • Google Play의 데이터 공개 요건 준비
      • 릴리즈 노트
    • iOS
      • 연동하기
      • 이벤트
      • 유저 식별 정보 설정
      • 유저 프로필 설정
      • 액션
        • 푸시
        • 인앱메시지
        • 알림톡
        • 문자
      • 릴리즈 노트
    • Hybrid App
      • 연동하기
    • Web
      • 연동하기
      • 이벤트
      • 유저 식별 정보 설정
      • 유저 프로필 설정
      • 액션
        • 인앱메시지
        • 알림톡
        • 문자
      • 고급 사용 사례
        • 부가 설정
      • 릴리즈 노트
Powered by GitBook
On this page
  • 시작하기 전에
  • SDK 연동
  • 예시 코드
  • 푸시 핸들링
  • Service Extension
  1. 플랫폼 별 가이드
  2. iOS
  3. 액션

푸시

Previous액션Next인앱메시지

Last updated 5 months ago

시작하기 전에

을 통해 사용하고자 하는 액션의 채널 수신 동의 설정이 선행되어야 합니다.

푸시메시지를 사용하기 위해 Apple로부터 발급받은 .p8 APNs 인증키를 에 등록해주세요. 콘솔의 부가 설정 / 채널 부가 설정 / 푸시 / iOS 설정 관리에서 등록할 수 있습니다.

SDK 연동

AppDelegate 클래스에 푸시 토큰 등록 코드를 추가합니다.

import UIKit
import UserNotifications

import DfinerySDK

@main
class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        ...
        ...
        application.registerForRemoteNotifications()
        ...
        ...
    }

    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        
        Dfinery.shared().set(pushToken: deviceToken)

    }

}
#import <UIKit/UIKit.h>
#import <DfinerySDK/DfinerySDK.h>
#import <UserNotifications/UserNotifications.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate, UNUserNotificationCenterDelegate>

@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    ...
    [application registerForRemoteNotifications];
    ...
    return YES;
}

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    [[Dfinery shared] setPushToken:deviceToken];
}

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
    NSLog(@"Failed to register for remote notifications: %@", error);
}

@end

푸시 메시지 사용을 위해 유저 권한을 획득해야 합니다.

예시 코드

UNUserNotificationCenter.current().requestAuthorization(options: [.alert, sound]) { granted, err in
   if granted {
       DispatchQueue.main.async {
           UIApplication.shared.registerForRemoteNotifications()
       }
   }
}
[[UNUserNotificationCenter currentNotificationCenter] requestAuthorizationWithOptions:(UNAuthorizationOptionAlert | UNAuthorizationOptionSound)
    completionHandler:^(BOOL granted, NSError * _Nullable error) {
        if (granted) {
            dispatch_async(dispatch_get_main_queue(), ^{
                [[UIApplication sharedApplication] registerForRemoteNotifications];
            });
        }
    }
];

푸시 핸들링

푸시 핸들링을 위해 AppDelegate 클래스에 UNUserNotificationCenterDelegate 프로토콜을 채택하고 SDK 코드를 연동해주세요.

class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        ...
        ...
        UNUserNotificationCenter.current().delegate = self
        ...
        ...
    }

    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
        
        if Dfinery.shared().canHandleNotification(response: response) {
            completionHandler()
            return
        }
        
    }
    
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {

        if Dfinery.shared().canHandleForeground(notification, completionHandler: completionHandler) {
            return
        }
        
    }
}

AppDelegate.h

#import <UserNotifications/UserNotifications.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate, UNUserNotificationCenterDelegate>

AppDelegate.m


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    ...
    ...
    [[UNUserNotificationCenter currentNotificationCenter] setDelegate:self];
    ...
    ...
}

- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler
{
    if ([[Dfinery shared] canHandleNotificationWithResponse:response]) {
        completionHandler();
        return;
    }
}

- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler
{
    if ([[Dfinery shared] canHandleForeground:notification completionHandler:completionHandler]) {
        return;
    }
}

Service Extension

디파이너리 푸시의 이미지, 버튼 사용을 위해 Notification Service Extension을 추가로 생성하고 DfineryServiceExtension을 연동해야 합니다.

import UserNotifications

import DfinerySDKServiceExtension

class NotificationService: UNNotificationServiceExtension {

    var contentHandler: ((UNNotificationContent) -> Void)?
    var bestAttemptContent: UNMutableNotificationContent?

    override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
        self.contentHandler = contentHandler
        bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
        
        if let bestAttemptContent = bestAttemptContent {
            
            if DfineryServiceExtension.canHandle(content: bestAttemptContent, contentHandler: contentHandler) {
                return
            }
            
            contentHandler(bestAttemptContent)
        }
    }
    ...
}
#import "NotificationService.h"
#import <DfinerySDKServiceExtension/DfinerySDKServiceExtension.h>
...
...
- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
    self.contentHandler = contentHandler;
    self.bestAttemptContent = [request.content mutableCopy];
    
    if (self.bestAttemptContent) {
        if ([DfineryServiceExtension canHandleWithContent:self.bestAttemptContent contentHandler:contentHandler]) {
            return;
        }
    }
    
    self.contentHandler(self.bestAttemptContent);
}
...
유저 프로필 설정
DFINERY 콘솔