Links

iOS SDK 매뉴얼

Xcode 14.1 버전 기반으로 설명하고 있습니다. iOS용 핑거푸시 SDK를 다운로드 하신 후 Sample 소스를 참고하시기 바랍니다.

프로젝트 설정

SDK를 다운로드 받은 후 XCODE에서 프로젝트를 생성합니다.
1) 다운 받은 프레임워크(finger.xcframework)를 프로젝트에 추가합니다.
2) Xcode에서 TARGETS 선택 후 General 탭에서 'Frameworks, Libraries, and Embedded Content' 항목에 프레임워크(finger.xcframework)가 추가 되었는지 확인합니다. ('Embed&Sign'로 설정)

Push Notification의 Entitlements 설정

Target 선택 후 Signing&Capabilities 탭에서 'Push Notifications'를 추가해주면 자동으로 AppName.entitlements 파일이 생성됩니다.

기기 버전 관리

Bundle version(build) 값이 int형이면 따로 AppVersionInt 값을 추가하지 않아도 됩니다. int형이 아닌 경우 AppVersionInt 값을 추가하여 설정합니다.

“ProjectName-Bridging-Header.h” 추가하기

1) Xcode project navigator의 'File>New>File'에서 Header File 선택 후, 'ProjectName-Bridging-Header.h'로 추가합니다.
2) build Settings에서 Objective-C Bridging Header에 'ProjectName-Bridging-Header.h'의 경로를 추가합니다.
3) 'ProjectName-Bridging-Header.h'에 #import <finger/finger.h>를 추가합니다.

핑거푸시 서버 연동

1) 핑거푸시 APP KEY 설정 및 RemoteNotifications 등록
개발용 DeviceToken과 배포용 DeviceToken이 섞이지 않도록 주의해 주십시오.
Swfit
Objective-C
/***
AppDelegate에 핑거푸시서버와 연동을 하기 위해서 다음과 같이 설정합니다.
***/
#import UserNotifications
//핑거푸시
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
let fingerManager = finger.sharedData()
/*핑거푸시 APP KEY 설정*/
#if DEBUG
//개발용 앱
fingerManager?.setAppKey("발급받은 앱키")
fingerManager?.setAppScrete("발급받은 앱시크리트키")
#else
// 배포용 앱
fingerManager?.setAppKey("발급받은 앱키")
fingerManager?.setAppScrete("발급받은 앱시크리트키")
#endif
/*RemoteNotifications 등록*/
if #available(iOS 10.0, *) {
let center = UNUserNotificationCenter.current()
center.delegate = self
center.requestAuthorization(options: [.alert,.badge,.sound], completionHandler: { (granted, error) in
print("granted : \(granted) / error : \(String(describing: error))")
if granted {
DispatchQueue.main.async(execute: {
application.registerForRemoteNotifications()
})
}
})
}
..
..
}
/***
AppDelegate에 핑거푸시서버와 연동을 하기 위해서 다음과 같이 설정합니다.
***/
#import <finger/finger.h>
#import <UserNotifications/UserNotifications.h>
//핑거푸시
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
finger *_fingerManager = [finger sharedData]; //싱글톤 객체로 사용
/*핑거푸시 APP KEY 설정*/
#ifdef DEBUG
//개발용 앱
[_fingerManager setAppKey:@"발급받은 앱키"]; //App Key
[_fingerManager setAppScrete:@"발급받은 앱시크리트키"]; //AppScrete
#else
//배포용 앱
[_fingerManager setAppKey:@"발급받은 앱키"]; //App Key
[_fingerManager setAppScrete:@"발급받은 앱시크리트키"]; //AppScrete
#endif
/*RemoteNotifications 등록*/
if (@available(iOS 10.0, *)) {
UNUserNotificationCenter *userNotificationCenter = [UNUserNotificationCenter currentNotificationCenter];
userNotificationCenter.delegate = self;
[userNotificationCenter requestAuthorizationWithOptions:(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error){
NSLog(@"granted :%i / error : %@",granted,error);
if (granted) {
//허용
dispatch_async(dispatch_get_main_queue(), ^{
[application registerForRemoteNotifications];
});
}
}];
}
..
..
}
2) 핑거푸시에 기기 등록
DeviceToken은 OS에 의해 변경될 수 있습니다. 따라서, 앱 실행 시마다 호출해야 합니다.
핑거푸시 모든 API는 기기 등록 API(register) 성공 후 사용할 수 있습니다.
Swift
Objective-C
//기기등록
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
//핑거푸시의 모든 api를 사용하기 위해서 기기등록 우선
finger.sharedData().registerUser(withBlock: deviceToken, { (posts, error) -> Void in
if error != nil{
print("기기 등록 : \(posts)")
} else {
//이미등록(504, 201) 무시.
print("기기 등록 error : \(error)")
}
})
}
//기기등록
-(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
//핑거푸시의 모든 api를 사용하기 위해서 기기등록 우선
[[finger sharedData] registerUserWithBlock:deviceToken :^(NSString *posts, NSError *error) {
if (!error)
{
NSLog(@"기기등록 %@", posts);
}else{
//이미등록(504, 201) 무시.
NSLog(@"기기등록 error %@", error);
}
}];
}
3) 푸시 메세지 수신 시 메세지 오픈/읽음 처리
Swift
Objective-C
//메세지 오픈 및 읽음 처리
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
//참고 : 메세지 정보 확인
let dicCode = finger.receviveCode(UserInfo)
let strPT = dicCode?["PT"] //메세지타입 - DEFT(일반) , STOS (서버투서버), LNGT(롱푸시)
let strIM = dicCode?["IM"] //이미지 여부 (0: 이미지 미포함 , 1: 이미지 포함
let strWL = dicCode?["WL"] //웹링크 여부 (0: 웹링크 미포함 , 1: 웹링크 포함
//메세지 읽음 처리
finger.sharedData().requestPushCheck(withBlock: UserInfo , { (posts, error) -> Void in
if error != nil{
print("check : \(posts)")
} else {
print("check error : \(error)")
}
})
completionHandler()
}
//메세지 오픈 및 읽음 처리
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)(void))completionHandler {
//참고 : 메세지 정보 확인
NSDictionary* dicCode = [finger receviveCode:userInfo];
NSString *strPT = [dicCode objectForKey:@"PT"]; //메세지타입 - DEFT(일반) , STOS (서버투서버), LNGT(롱푸시)
NSString *strIM = [dicCode objectForKey:@"IM"]; //이미지 여부 (0: 이미지 미포함 , 1: 이미지 포함)
NSString *strWL = [dicCode objectForKey:@"WL"]; //웹링크 여부 (0: 웹링크 미포함 , 1: 웹링크 포함)
//메세지 읽음 처리
[[finger sharedData] requestPushCheckWithBlock:userInfo :^(NSString *posts, NSError *error) {
if (!error) {
NSLog(@"check : %@", posts);
}else{
NSLog(@"check error %@", error);
}
)];
completionHandler();
}
4) 푸시 수신 데이터(Payload)
{
aps = {
alert = {
body = "안녕하세요. 핑거푸시입니다";
title = "메세지 제목입니다.";
};
badge = 0; // 뱃지 카운트
category = fp; // 메세지 카테고리
"mutable-content" = 1; // notification service extension 사용 여부(이미지와 웹 링크 추가시)
sound = default; // 사운드
};
커스텀 데이터 키1 = 커스텀 데이터 값1;
커스텀 데이터 키2 = 커스텀 데이터 값2;
커스텀 데이터 키3 = 커스텀 데이터 값3;
code = "CD:1;IM:1;WL:1;PT:STOS";
// ( CD : 커스텀 데이터 여부(0 : 없음, 1 : 있음), IM : 이미지 첨부 여부(0 : 없음, 1 : 있음), WL : 웹 링크 여부(0 : 없음, 1 : 있음), PT : 메세지 타입(DEFT:일반푸시, STOS:Server to Server, LNGT:롱푸시))
imgUrl = "http://..."; // 이미지 URL
labelCode = ""; // 라벨 코드
msgTag = ...; // 메세지 고유 번호
weblink = "http://www.google.com"; // 웹 링크
}
푸시 수신 데이터(Payload)에 대한 내용은 아래 링크를 참조 바랍니다.

API 연동 결과 코드

Error.code 로 SDK 내부 오류 또는 서버 오류 여부를 확인할 수 있습니다.
  • 900 : SDK 내부 에러 코드
  • 901 : 핑거푸시 서버 에러 코드
코드
내용
비고
200
정상 처리
403
App_key, secret 오류, 권한 없음
404
조회 대상 없음, 조회 결과 없음
500
처리 중 에러
503
필수 값 없음
504
이미 등록된 토큰
디바이스 등록에서만 사용

iOS 10 Rich Notification

Xcode 14.1 버전 기반으로 설명하고 있습니다. iOS용 핑거푸시 SDK를 다운로드 하신 후 Sample 소스를 참고하시기 바랍니다.

Notification Service Extension 생성

1) 기존 앱에 새 타겟(Notification Service Extension)을 추가합니다.
2) 새 타겟의 옵션을 각자에 맞게 설정합니다. 애플 개발자 사이트에서 Notification Service Extension 만의 App ID와 Provisioning Profiles을 생성해줘야 합니다.
Embed In Application 설정은 Xcode의 TAGETS/General/Embedded Binaries에서 수정이 가능합니다.
3) 다운로드 받은 핑거푸시 SDK의 'iOS>Framework>NoticationService' 폴더 안의 파일들을 프로젝트 내부에 추가합니다.
4) 'ProjectName-Bridging-Header.h'에 #import "fingerNotificationService.h"를 추가합니다.
5) 생성된 NotificationService에서 'fingerNotificationService' 클래스를 적용합니다.
Swift
Objective-C
/*Rich Notification*/
class NotificationService: fingerNotificationService {
override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
self.disableSyncBadge()
super.didReceive(request, withContentHandler: contentHandler)
}
override func serviceExtensionTimeWillExpire() {
// Called just before the extension will be terminated by the system.
// Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used.
super .serviceExtensionTimeWillExpire()
}
}
//NotificationService.h
#import <UserNotifications/UserNotifications.h>
#import "fingerNotificationService.h"
@interface NotificationService : fingerNotificationService
@end
//NotificationService.m
@interface NotificationService ()
@end
@implementation NotificationService
- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
[self disableSyncBadge];
[super didReceiveNotificationRequest:request withContentHandler:contentHandler];
}
- (void)serviceExtensionTimeWillExpire {
// Called just before the extension will be terminated by the system.
// Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used.
[super serviceExtensionTimeWillExpire];
}
@end

Rich Notification 발송

핑거푸시 사용자 콘솔에서 이미지 혹은 웹링크를 넣어 보내면 Rich Notification 형식으로 푸시를 발송합니다.

참조 링크

  • 핑거푸시 샘플 다운로드
  • 애플 개발자 사이트 UNNotificationServiceExtension