Service | Cocoapods Pod Name | Framework | Dependency | Build Settings |
---|---|---|---|---|
Push | NHNCloudPush | NHNCloudPush.framework | UserNotifications.framework [NHNCloudVoIP] PushKit.framework CallKit.framework |
|
Mandatory | NHNCloudCore NHNCloudCommon |
NHNCloudCore.framework NHNCloudCommon.framework |
OTHER_LDFLAGS = ( "-ObjC", "-lc++" ); |
platform :ios, '11.0'
use_frameworks!
target '{YOUR PROJECT TARGET NAME}' do
pod 'NHNCloudPush'
end
최초 토큰 등록 시 사용자 아이디가 설정되어 있지 않으면, 단말기 식별자를 사용하여 등록합니다.
(토큰 등록 섹션 참고)토큰 등록 후 사용자 아이디를 설정 또는 변경하면 토큰 정보를 갱신합니다.
// 서비스 로그인, 사용자 아이디 설정
[NHNCloudSDK setUserID:@"INPUT_USER_ID"];
로그아웃 하여도 등록된 토큰은 삭제되지 않습니다.
// 서비스 로그아웃, 사용자 아이디를 nil로 설정
[NHNCloudSDK setUserID:nil];
초기화를 하지 않은 상태에서는 토큰 등록 및 조회 기능을 사용할 수 없습니다.
개발환경에서는 반드시 NHNCloudPushConfiguration의 sandbox 프로퍼티를 YES로 설정해야 개발용 인증서로 발송한 메시지의 수신이 가능합니다.
// 초기화 및 Delegate 설정
+ (void)initWithConfiguration:(NHNCloudPushConfiguration *)configuration
delegate:(nullable id<NHNCloudPushDelegate>)delegate;
// 초기화
+ (void)initWithConfiguration:(NHNCloudPushConfiguration *)configuration;
// Delegate 설정
+ (void)setDelegate:(nullable id<NHNCloudPushDelegate>)delegate;
원활한 메시지 수신을 위해 application:didFinishLaunchingWithOptions: 함수에서 Delegate 설정을 권장합니다.
@protocol NHNCloudPushDelegate <NSObject>
@optional
// 메시지 수신
- (void)didReceiveNotificationWithMessage:(NHNCloudPushMessage *)message;
// 알림 실행(클릭)
- (void)didReceiveNotificationResponseWithMessage:(NHNCloudPushMessage *)message
// 알림 액션(버튼) 실행
- (void)didReceiveNotificationAction:(NHNCloudPushNotificationAction *)action
@end
#import <NHNCloudPush/NHNCloudPush.h>
@interface AppDelegate () <UIApplicationDelegate, NHNCloudPushDelegate>
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// ...
// 설정 객체를 생성합니다.
NHNCloudPushConfiguration *configuration = [[NHNCloudPushConfiguration alloc] initWithAppKey:@"INPUT_YOUR_APPKEY"];
#if DEBUG
// 개발환경(Debug)에서는 꼭 아래 sandbox 프로퍼티를 YES로 설정해야 개발용 인증서로 발송한 메시지의 수신이 가능합니다.
configuration.sandbox = YES;
#endif
// 알림 허용 권한을 획득하지 못하더라도 토큰을 등록하고 싶은 경우 alwaysAllowTokenRegistration 프로퍼티의 값을 YES로 변경해야합니다. 기본값은 NO입니다.
configuration.alwaysAllowTokenRegistration = NO;
// 초기화와 동시에 Delegate를 설정 합니다.
[NHNCloudPush initWithConfiguration:configuration
delegate:self];
return YES;
}
#pragma mark - NHNCloudPushDelegate
// 메시지 수신
- (void)didReceiveNotificationWithMessage:(NHNCloudPushMessage *)message {
// ...
}
// 알림 응답(실행)
- (void)didReceiveNotificationResponseWithMessage:(NHNCloudPushMessage *)message {
// ...
}
// 알림 액션(버튼, 답장) 실행
- (void)didReceiveNotificationAction:(NHNCloudPushNotificationAction *)action {
// ...
}
옵션명 | 설명 | 기본값 |
---|---|---|
foregroundEnabled | 앱이 포그라운드 상태일때의 알림 노출 여부 | NO |
badgeEnabled | 배지 아이콘 사용 여부 | YES |
soundEnabled | 알림음 사용 여부 | YES |
+ (void)setNotificationOptions:(nullable NHNCloudNotificationOptions *)options;
NHNCloudNotificationOptions *options = [[NHNCloudNotificationOptions alloc] init];
options.foregroundEnabled = YES; // 포그라운드 알림 사용 설정 (default : NO)
options.badgeEnabled = YES; // 배지 아이콘 사용 설정 (default : YES)
options.soundEnabled = YES; // 알림음 사용 설정 (default : YES)
[NHNCloudPush setNotificationOptions:options];
// 토큰 등록 및 수신 동의 설정
+ (void)registerWithAgreement:(NHNCloudPushAgreement *)agreement
completionHandler:(nullable void (^)(NHNCloudPushTokenInfo * _Nullable tokenInfo, NSError * _Nullable error))completionHandler;
// 기존에 설정된 수신 동의 정보를 사용하여 토큰 등록
+ (void)registerWithCompletionHandler:(nullable void (^)(NHNCloudPushTokenInfo * _Nullable tokenInfo, NSError * _Nullable error))completionHandler;
NHNCloudPushAgreement *agreement = [[NHNCloudPushAgreement alloc] initWithAllowNotifications:YES]; // 알림 메시지 수신 동의
agreement.allowAdvertisements = YES; // 홍보성 알림 메시지 수신 동의
agreement.allowNightAdvertisements = YES; // 야간 홍보성 알림 메시지 수신 동의
[NHNCloudPush registerWithAgreement:agreement
completionHandler:^(NHNCloudPushTokenInfo *tokenInfo, NSError *error) {
if (error == nil) {
// 토큰 등록 성공
NSLog(@"Successfully registered : %@", tokenInfo.deviceToken);
} else {
// 토큰 등록 실패
NSLog(@"Failed to register : %@", error.localizedDescription);
}
}];
+ (void)queryTokenInfoWithCompletionHandler:(void (^)(NHNCloudPushTokenInfo * _Nullable tokenInfo, NSError * _Nullable error))completionHandler;
[NHNCloudPush queryTokenInfoWithCompletionHandler:^(NHNCloudPushTokenInfo *tokenInfo, NSError *error) {
if (error == nil) {
// 토큰 정보 조회 성공
NSLog(@"Successfully query token info : %@", [tokenInfo description]);
} else {
// 토큰 정보 조회 실패
NSLog(@"Failed to query token info : %@", error.localizedDescription);
}
}];
서비스 로그아웃 후에 메시지 수신을 원치 않으시면 토큰을 해제해야 합니다.
토큰이 해제되어도 단말기 상에 알림 권한은 회수되지 않습니다.
+ (void)unregisterWithCompletionHandler:(nullable void (^)(NSString * _Nullable deviceToken, NSError * _Nullable error))completionHandler;
[NHNCloudPush unregisterWithCompletionHandler:^(NSString *deviceToken, NSError *error) {
if (error == nil) {
// 토큰 해제 성공
NSLog(@"Successfully unregistered token : %@", deviceToken);
} else {
// 토큰 해제 실패
NSLog(@"Failed to unregister : %@", error.localizedDescription);
}
}];
리치 메시지 수신은 iOS 10.0+ 이상부터 지원합니다.
유형 | 기능 | 액션 |
---|---|---|
앱 열기 (OPEN_APP) | 애플리케이션 실행 | NHNCloudPushNotificationActionOpenApp |
URL 열기 (OPEN_URL) | URL로 이동 (웹 URL 주소 혹은 앱 커스텀 스킴 실행) |
NHNCloudPushNotificationActionOpenURL |
답장 (REPLY) | 알림에서 답장 전송 | NHNCloudPushNotificationActionReply |
취소 (DISMISS) | 현재 알림 취소 | NHNCloudPushNotificationActionDismiss |
버튼은 메시지당 최대 3개까지 지원합니다.
유형 | 지원 포멧 | 최대 크기 | 권장 사항 |
---|---|---|---|
이미지 | JPEG, PNG, GIF | 10 MB | 가로 이미지 권장 최대 크기 : 1038 x 1038 |
동영상 | MPEG, MPEG3Video, MPEG4, AVIMovie | 50 MB | |
소리 | WaveAudio, MP3, MPEG4Audio | 5 MB |
웹 URL 사용시 미디어 파일 다운로드 시간이 소요됩니다.
지표 수집을 위해서는 Push SDK 초기화 혹은 info.plist 파일에 앱키가 정의되어 있어야 합니다.
수신 지표 수집은 iOS 10.0+ 이상부터 지원합니다.
애플리케이션과 익스텐션은 함께 설치되지만 서로 분리된 별도의 샌드박스 환경이기 때문에 애플리케이션에서의 초기화와는 별개로 익스텐션에서도 초기화를 해야합니다.
@implementation NotificationService
- (instancetype)init {
self = [super init];
if (self) {
// 지표 전송에만 사용되므로 앱키만 설정하셔도 됩니다.
NHNCloudPushConfiguration *configuration = [[NHNCloudPushConfiguration alloc] initWithAppKey:@"INPUT_YOUR_APPKEY"];
[NHNCloudPush initWithConfiguration:configuration];
}
return self;
}
@end
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<key>NHNCloudSDK</key>
<dict>
<key>NHNCloudPush</key>
<dict>
<key>AppKey</key>
<string>[INPUT_YOUR_APPKEY]</string>
</dict>
</dict>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<key>NHNCloudSDK</key>
<dict>
<key>NHNCloudPush</key>
<dict>
<key>AppKey</key>
<string>[INPUT_YOUR_APPKEY]</string>
</dict>
</dict>
iOS 10.0+ 부터 지원합니다.
iOS의 Extension은 앱과 함께 설치되지만 앱과는 분리된 별도의 샌드박스 환경이라 컨테이너를 공유하지 않습니다.
#import <UserNotifications/UserNotifications.h>
#import <NHNCloudPush/NHNCloudPush.h>
@interface NotificationService : NHNCloudPushServiceExtension
@end
// 사용자 아이디의 태그 아이디 목록 추가
+ (void)addUserTagWithIdentifiers:(NSSet<NSString *> *)tagIdentifiers
completionHandler:(nullable void (^)(NSSet<NSString *> * _Nullable tagIdentifiers, NSError * _Nullable error))completionHandler;
// 사용자 아이디의 태그 아이디 목록 업데이트
+ (void)setUserTagWithIdentifiers:(nullable NSSet<NSString *> *)tagIdentifiers
completionHandler:(nullable void (^)(NSError * _Nullable error))completionHandler;
// 사용자 아이디의 태그 아이디 목록 획득
+ (void)getUserTagWithCompletionHandler:(void (^)(NSSet<NSString *> * _Nullable tagIdentifiers, NSError * _Nullable error))completionHandler;
// 사용자 아이디의 태그 아이디 목록 삭제
+ (void)removeUserTagWithIdentifiers:(NSSet<NSString *> *)tagIdentifiers
completionHandler:(nullable void (^)(NSSet<NSString *> * _Nullable tagIdentifiers, NSError * _Nullable error))completionHandler;
// 사용자 아이디의 전체 태그 삭제
+ (void)removeAllUserTagWithCompletionHandler:(nullable void (^)(NSError * _Nullable error))completionHandler;
// 추가할 태그 아이디 목록 생성
NSMutableSet<NSString *> *tagIDs = [NSMutableSet set];
[tagIDs addObject:TAG_ID_1]; // e.g. "ZZPP00b6" (8자리 문자열)
[tagIDs addObject:TAG_ID_2];
// 로그인되어 있는 사용자 아이디의 태그 아이디 목록 추가
[NHNCloudPush addUserTagWithIdentifiers:tagIDs
completionHandler:^(NSSet<NSString *> *tagIdentifiers, NSError *error) {
if (error == nil) {
// 태그 아이디 목록 추가 성공
} else {
// 태그 아이디 목록 추가 실패
}
}];
// 로그인되어 있는 사용자 아이디의 태그 아이디 목록 업데이트 (기존 태그 아이디 목록은 삭제되고 입력한 값으로 설정)
[NHNCloudPush setUserTagWithIdentifiers:tagIDs
completionHandler:^(NSError *error) {
if (error == nil) {
// 태그 아이디 목록 업데이트 성공
} else {
// 태그 아이디 목록 업데이트 실패
}
}];
// 로그인되어 있는 사용자 아이디의 전체 태그 아이디 목록을 반환
[NHNCloudPush getUserTagWithCompletionHandler:^(NSSet<NSString *> *tagIdentifiers, NSError *error) {
if (error == nil) {
// 태그 아이디 목록 획득 성공
} else {
// 태그 아이디 목록 획득 실패
}
}];
// 삭제할 태그 아이디 목록 생성
NSMutableSet<NSString *> *tagIDs = [NSMutableSet set];
[tagIDs addObject:TAG_ID_1]; // e.g. "ZZPP00b6" (8자리 문자열)
[tagIDs addObject:TAG_ID_2];
// 로그인되어 있는 사용자 아이디의 태그 아이디 목록 삭제
[NHNCloudPush removeUserTagWithIdentifiers:tagIDs
completionHandler:^(NSSet<NSString *> *tagIdentifiers, NSError *error) {
if (error == nil) {
// 태그 아이디 목록 삭제 성공
} else {
// 태그 아이디 목록 삭제 실패
}
}];
// 로그인되어 있는 사용자 아이디의 전체 태그 아이디 목록 삭제
[NHNCloudPush removeAllUserTagWithCompletionHandler:^(NSError *error) {
if (error == nil) {
// 전체 사용자 태그 삭제 성공
} else {
// 전체 사용자 태그 삭제 실패
}
}];
VoIP 기능은 iOS 10.0 이상부터 지원합니다.
Project Target > Signing & Capabilities > + Capability > Background Modes
Voice over IP 항목을 활성화해야 합니다.
원활한 메시지 수신을 위해 application:didFinishLaunchingWithOptions: 함수에서 Delegate 설정을 권장합니다.
@protocol NHNCloudVoIPDelegate <NSObject>
// 메시지 수신
- (void)didReceiveIncomingVoiceCallWithMessage:(NHNCloudPushMessage *)message;
@end
// VoIP 서브모듈을 추가합니다.
#import <NHNCloudPush/NHNCloudVoIP.h>
@interface AppDelegate () <UIApplicationDelegate, NHNCloudVoIPDelegate>
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// ...
// Delegate를 설정합니다.
[NHNCloudVoIP setDelegate:self];
return YES;
}
#pragma mark - NHNCloudVoIPDelegate
// 메시지 수신
- (void)didReceiveIncomingVoiceCallWithMessage:(NHNCloudPushMessage *)message {
// ...
}
+ (void)registerWithCompletionHandler:(nullable void (^)(NHNCloudPushTokenInfo * _Nullable tokenInfo, NSError * _Nullable error))completionHandler;
[NHNCloudVoIP registerWithCompletionHandler:^(NHNCloudPushTokenInfo *tokenInfo, NSError *error) {
if (error == nil) {
// 토큰 등록 성공
NSLog(@"Successfully registered : %@", tokenInfo.deviceToken);
} else {
// 토큰 등록 실패
NSLog(@"Failed to register : %@", error.localizedDescription);
}
}];
@interface NHNCloudVoIP : NSObject
+ (void)queryTokenInfoWithCompletionHandler:(void (^)(NHNCloudPushTokenInfo * _Nullable tokenInfo, NSError * _Nullable error))completionHandler;
[NHNCloudVoIP queryTokenInfoWithCompletionHandler:^(NHNCloudPushTokenInfo *tokenInfo, NSError *error) {
if (error == nil) {
// 토큰 정보 조회 성공
NSLog(@"Successfully query token info : %@", [tokenInfo description]);
} else {
// 토큰 정보 조회 실패
NSLog(@"Failed to query token info : %@", error.localizedDescription);
}
}];
서비스 로그아웃 후에 메시지 수신을 원치 않으시면 토큰을 해제해야 합니다.
+ (void)unregisterWithCompletionHandler:(nullable void (^)(NSString * _Nullable deviceToken, NSError * _Nullable error))completionHandler;
[NHNCloudVoIP unregisterWithCompletionHandler:^(NSString *deviceToken, NSError *error) {
if (error == nil) {
// 토큰 해제 성공
NSLog(@"Successfully unregistered token : %@", deviceToken);
} else {
// 토큰 해제 실패
NSLog(@"Failed to unregister : %@", error.localizedDescription);
}
}];
extern NSErrorDomain const NHNCloudPushErrorDomain;
typedef NS_ERROR_ENUM(NHNCloudPushErrorDomain, NHNCloudPushError) {
NHNCloudPushErrorUnknown = 0, // 알 수 없음
NHNCloudPushErrorNotInitialized = 1, // 초기화하지 않음
NHNCloudPushErrorUserInvalid = 2, // 사용자 아이디 미설정
NHNCloudPushErrorPermissionDenied = 3, // 권한 획득 실패
NHNCloudPushErrorSystemFailed = 4, // 시스템에 의한 실패
NHNCloudPushErrorTokenInvalid = 5, // 토큰 값이 없거나 유효하지 않음
NHNCloudPushErrorAlreadyInProgress = 6, // 이미 진행 중
NHNCloudPushErrorParameterInvalid = 7, // 매개변수 오류
NHNCloudPushErrorNotSupported = 8, // 지원하지 않는 기능
NHNCloudPushErrorClientFailed = 9, // 서버 오류
};
extern NSErrorDomain const NHNCloudHttpErrorDomain;
typedef NS_ERROR_ENUM(NHNCloudHttpErrorDomain, NHNCloudHttpError) {
NHNCloudHttpErrorNetworkNotAvailable = 100, // 네트워크 사용 불가
NHNCloudHttpErrorRequestFailed = 101, // HTTP Status Code 가 200이 아니거나 서버에서 요청을 제대로 읽지 못함
NHNCloudHttpErrorRequestTimeout = 102, // 타임아웃
NHNCloudHttpErrorRequestInvalid = 103, // 잘못된 요청 (파라미터 오류 등)
NHNCloudHttpErrorURLInvalid = 104, // URL 오류
NHNCloudHttpErrorResponseInvalid = 105, // 서버 응답 오류
NHNCloudHttpErrorAlreadyInprogress = 106, // 동일 요청 이미 수행 중
NHNCloudHttpErrorRequiresSecureConnection = 107, // Allow Arbitrary Loads 미설정
};
@interface NHNCloudPushConfiguration : NSObject
// 서비스 앱키
@property (nonatomic, copy, readonly) NSString *appKey;
// 서비스 존
@property (nonatomic) NHNCloudServiceZone serviceZone;
// 국가 코드 (예약 메시지 발송시 기준 시간이 되는 국가코드)
@property (nonatomic, copy) NSString *countryCode;
// 언어 코드 (다국어 메시지 발송시 언어 선택 기준)
@property (nonatomic, copy) NSString *languageCode;
// 타임존
@property (nonatomic, copy) NSString *timezone;
// Sandbox(Debug) 환경 설정
@property (nonatomic) BOOL sandbox;
// 사용자가 알림 허용 권한을 거부해도 토큰을 등록할지 여부
@property (nonatomic) BOOL alwaysAllowTokenRegistration;
+ (instancetype)configurationWithAppKey:(NSString *)appKey;
- (instancetype)initWithAppKey:(NSString *)appKey;
@end
@interface NHNCloudNotificationOptions : NSObject
// 앱 실행 중 알림 노출 여부
@property (nonatomic) BOOL foregroundEnabled;
// 배지 아이콘 사용 여부
@property (nonatomic) BOOL badgeEnabled;
// 알림음 사용 여부
@property (nonatomic) BOOL soundEnabled;
@end
@interface NHNCloudPushAgreement : NSObject
// 알림 표시 동의 여부
@property (nonatomic, assign) BOOL allowNotifications;
// 광고성 알림 표시 동의 여부
@property (nonatomic, assign) BOOL allowAdvertisements;
// 야간 광고성 알림 동의 여부
@property (nonatomic, assign) BOOL allowNightAdvertisements;
+ (instancetype)agreementWithAllowNotifications:(BOOL)allowNotifications;
* (instancetype)initWithAllowNotifications:(BOOL)allowNotifications;
@end
@interface NHNCloudPushMessage : NSObject
@property (nonatomic, readonly) NSString *identifier;
@property (nonatomic, readonly, nullable) NSString *title;
@property (nonatomic, readonly, nullable) NSString *body;
@property (nonatomic, readonly) NSInteger badge;
@property (nonatomic, readonly, nullable) NHNCloudPushRichMessage *richMessage;
@property (nonatomic, readonly) NSDictionary<NSString *, NSString *> *payload;
@end
@interface NHNCloudPushRichMessage : NSObject
@property (nonatomic, readonly, nullable) NHNCloudPushMedia *media;
@property (nonatomic, readonly, nullable) NSArray<NHNCloudPushButton *> *buttons;
@end
@interface NHNCloudPushMedia : NSObject
@property (nonatomic, readonly) NHNCloudPushMediaType mediaType;
@property (nonatomic, readonly) NSString *source;
@end
@interface NHNCloudPushButton : NSObject
@property (nonatomic, readonly) NSString *identifier;
@property (nonatomic, readonly) NHNCloudPushButtonType buttonType;
@property (nonatomic, readonly) NSString *name;
@property (nonatomic, readonly, nullable) NSString *link;
@property (nonatomic, readonly, nullable) NSString *hint;
@property (nonatomic, readonly, nullable) NSString *submit;
@end
typedef NS_ENUM(NSInteger, NHNCloudPushNotificationActionType) {
NHNCloudPushNotificationActionDismiss = 0,
NHNCloudPushNotificationActionOpenURL = 2,
NHNCloudPushNotificationActionOpenApp = 1,
NHNCloudPushNotificationActionReply = 3,
};
@interface NHNCloudPushNotificationAction : NSObject <NSCoding, NSCopying>
@property (nonatomic, readonly) NSString *actionIdentifier;
@property (nonatomic, readonly) NSString *categoryIdentifier;
@property (nonatomic, readonly) NHNCloudPushNotificationActionType actionType;
@property (nonatomic, readonly) NHNCloudPushButton *button;
@property (nonatomic, readonly) NHNCloudPushMessage *message;
@property (nonatomic, readonly, nullable) NSString *userText;
@end
typedef NSString *NHNCloudPushType NS_STRING_ENUM;
// APNS 타입
extern NHNCloudPushType const NHNCloudPushTypeAPNS;
// VoIP 타입
extern NHNCloudPushType const NHNCloudPushTypeVoIP;
@interface NHNCloudPushTokenInfo : NSObject
// 사용자 아이디
@property (nonatomic, readonly) NSString *userID;
// 토큰
@property (nonatomic, readonly) NSString *deviceToken;
// 국가 코드
@property (nonatomic, readonly) NSString *countryCode;
// 언어 설정
@property (nonatomic, readonly) NSString *languageCode;
// Push 토큰 타입
@property (nonatomic, readonly) NHNCloudPushType pushType;
// 알림 표시 동의 여부
@property (nonatomic, readonly) BOOL allowNotifications;
// 광고성 알림 표시 동의 여부
@property (nonatomic, readonly) BOOL allowAdvertisements;
// 야간 광고성 알림 표시 동의 여부
@property (nonatomic, readonly) BOOL allowNightAdvertisements;
// 표준시간대
@property (nonatomic, readonly) NSString *timezone;
// 토큰 업데이트 시간
@property (nonatomic, readonly) NSString *updateDateTime;
// 샌드박스 환경에서 등록된 토큰인지 확인
@property (nonatomic, getter=isSandbox) BOOL sandbox;
@end