Latest 0.9.2
Homepage https://github.com/nhn/toast.gamebase.iap.ios.sdk
License Apache License, Version 2.0
Platforms ios 8.0, requires ARC
Dependencies ToastIAP
Authors

ToastGamebaseIAP 사용 가이드

ToastGamebaseIAP의 구성

  • ToastGamebaseIAP
    • [ToastIAP] ToastIAP.framework (0.14.1 ~) 필수
      • [ToastCore] ToastCore.framework
        • [ToastCommon] ToastCommon.framework
    • [ToastOngate] ToastOngate.framework (0.9.0 ~) 선택
SDK Cocoapods Pod Name Framework Dependency Etc
TOAST Gamebase IAP SDK ToastGamebaseIAP ToastGamebaseIAP.framework ToastIAP OTHER_LDFLAGS = ("-ObjC");
TOAST IAP SDK ToastIAP ToastIAP.framework ToastCore
ToastCommon
OTHER_LDFLAGS = ("-ObjC","-lc++" );
Ongate SDK ToastOngate ToastOngate.framework OTHER_LDFLAGS = ("-ObjC");

TOAST SDK를 Xcode 프로젝트에 적용

1. Cococapods를 사용해 TOAST SDK 적용

Podfile을 생성하여 TOAST SDK에 대한 Pod을 추가합니다.

platform :ios, '8.0'
use_frameworks!

target '{YOUR PROJECT TARGET NAME}' do
pod 'ToastGamebaseIAP', '0.9.2'
pod 'ToastOngate', '0.9.0'
end

2. 바이너리를 직접 적용

  1. Download 한 바이너리를 프로젝트에 import 합니다.
  2. Build SettingsOther Linker Flags에 **-lc++**와 -ObjC 항목을 추가합니다.
    • Project Target > Build Settings > Linking > Other Linker Flags를 클릭해 추가할 수 있습니다.

other_linker_flags

import

생성된 워크스페이스 또는 프로젝트를 열어 사용할 SDK를 가져옵니다(import).

#import <ToastGamebaseIAP/ToastGamebaseIAP.h>
#import <ToastCore/ToastCore.h>
#import <ToastIAP/ToastIAP.h>
#import <ToastOngate/ToastOngate.h>

API 사용 가이드

서비스 로그인

  • TOAST SDK에서 제공하는 모든 상품(IAP, Log & Crash, Push등)은 같은 사용자 ID 하나만 사용합니다.

로그인

사용자 ID가 설정되지 않은 상태에서는 구매, 활성화된 상품 조회, 미소비 내역 조회 기능을 사용할 수 없습니다.

// 서비스 로그인 완료 후 사용자 ID 설정
[ToastSDK setUserID:@"INPUT_USER_ID"];

로그아웃

// 서비스 로그아웃 완료 후 사용자 ID를 nil로 설정
[ToastSDK setUserID:nil];

초기화

Configuration

  • ToastGamebaseIAP는 Configuration을 사용하여 초기화 할 수 있습니다.

  • 초기화 이후에 동작하는 미완료 결제의 재처리와 프로모션 상품의 구입을 위해 초기화 이전에 UserID 설정이 필요합니다.
API 명세

@interface ToastGamebaseIAPConfiguration : NSObject <NSCoding, NSCopying>

@property (nonatomic, copy, readonly) NSString *appKey;
@property (nonatomic, readonly) ToastGamebaseServiceZone serviceZone;
@property (nonatomic, copy, readonly, nullable) NSDictionary<NSString *, NSDictionary *> *extras;

+ (instancetype)configurationWithAppKey:(NSString *)appKey
serviceZone:(ToastGamebaseServiceZone)serviceZone;

- (void)addExtraObject:(NSDictionary *)object forStore:(NSString *)store;

@end
API 사용 예

ToastGamebaseIAPConfiguration *configuration = [ToastGamebaseIAPConfiguration configurationWithAppKey:appKey
                                                                                          serviceZone:ToastGamebaseServiceZoneReal];

NSMutableDictionary *ongateExtras = [[NSMutableDictionary alloc]init];
[ongateExtras setObject:ongateAppID  forKey:kToastProviderAppID];
[ongateExtras setObject:ongateUserID forKey:kToastProviderUserID];

[configuration addExtraObject:ongateExtras forStore:ToastGamebaseStoreOngate];

Init

  • 생성한 Configuration으로 ToastGamebaseIAP SDK를 초기화 합니다.
API 명세
+ (void)setDelegate:(id<ToastGamebaseInAppPurchaseDelegate>)delegate;

+ (void)initWithConfiguration:(ToastGamebaseIAPConfiguration *)configuration;

+ (void)initWithConfiguration:(ToastGamebaseIAPConfiguration *)configuration
                     delegate:(id<ToastGamebaseInAppPurchaseDelegate>)delegate;
API 사용 예
//...
// Delegate와 SDK 초기화를 따로 할 경우 
[ToastGamebaseIAP setDelegate:self];
//...
[ToastGamebaseIAP initWithConfiguration:configuration];
//...

//...
// 초기화시에 Delegate도 함께 설정 할 경우 
[ToastGamebaseIAP initWithConfiguration:configuration delegate:self];
//...

Delegate

  • SDK를 통해 요청한 결제가 아닐 경우 Delegate를 통해 결과가 전달 됩니다.
  • Promotion (AppStore Purchase)
API 명세
@protocol ToastGamebaseInAppPurchaseDelegate <NSObject>

- (void)didReceivePurchaseResultForStore:(NSString *_Nonnull)store
                               isSuccess:(BOOL)isSuccess
                                purchase:(ToastGamebasePurchaseResult *_Nullable)purchase
                       productIdentifier:(NSString * _Nonnull)productIdentifier
                                   error:(NSError *_Nullable)error;

@end
API 사용 예

- (void)didReceivePurchaseResultForStore:(NSString *)store
                               isSuccess:(BOOL)isSuccess
                                purchase:(ToastGamebasePurchaseResult *)purchase
                       productIdentifier:(NSString *)productIdentifier
                                   error:(NSError *)error {

    if (isSuccess) {
        NSLog(@"Success Store : %@", store);
        NSLog(@"Success PurchaseResult : %@", purchase);
    }else {
        NSLog(@"Fail Store : %@", store);
        NSLog(@"Fail ProductIdentifier : %@", productIdentifier);
        NSLog(@"Fail Error : %@", error);
    }
}

상품 목록 조회

  • IAP 콘솔에 등록되어 있는 상품 중 사용 여부 설정이 USE인 상품의 목록을 조회합니다.
  • 스토어(Apple)에서 상품 정보를 획득하지 못한 상품은 invalidProducts 항목으로 표시됩니다.
API 명세
extern NSString *const ToastGamebaseStoreAppStore;
extern NSString *const ToastGamebaseStoreOngate;

+ (void)requestProductsForStore:(NSString *)store
          withCompletionHandler:(nullable void (^)(ToastGamebaseProductsResponse * _Nullable response, NSError * _Nullable error))completionHandler;
API 사용 예
[ToastGamebaseIAP requestProductsForStore:self.store
                    withCompletionHandler:^(ToastGamebaseProductsResponse * _Nullable response, NSError * _Nullable error) {

    if(error == nil) {    
        NSLog(@"response : %@", response);
        NSLog(@"response.products : %@", response.products);
        NSLog(@"response.invalidProducts : %@", response.invalidProducts);
    }else {
        NSLog(@"error : %@", error);
    }
}];
상품 종류
  • AppStore의 자동 갱신형 구독 상품의 업그레이드, 다운그레이드, 수정 기능은 지원하지 않습니다.
  • 하나의 구독 그룹에 하나의 상품만 등록해야 합니다.
  • Ongate의 경우 소비성 상품만 지원합니다.
typedef NS_ENUM(NSInteger, ToastGamebaseProductType) {
    ToastGamebaseProductTypeUnknown                     = 0,
    ToastGamebaseProductTypeConsumable                  = 1,
    ToastGamebaseProductTypeAutoRenewableSubscription   = 2,
};

상품 구매

  • 구매 결과는 설정된 Observer를 통해 전달됩니다.
  • 구매 진행 중에 앱이 종료되거나 네트워크 오류 등으로 구매가 중단되었을 경우 앱이 재실행되면, IAP SDK를 초기화할 때 구매 재처리를 진행합니다.

상품 객체를 이용한 구매 요청

  • 상품 목록 조회 결과의 ToastGamebaseProduct 객체를 이용해 구매를 요청합니다.
API 명세
typedef void (^ToastGamebasePurchaseResultHandler)(NSString *_Nonnull store,
                                                   BOOL isSuccess,
                                                   ToastGamebasePurchaseResult *_Nullable purchase,
                                                   NSString *_Nonnull productIdentifier,
                                                   NSError* _Nullable error);
+ (void)purchaseForStore:(NSString *)store
                 product:(ToastGamebaseProduct *)product
   withCompletionHandler:(ToastGamebasePurchaseResultHandler)completionHandler;
API 사용 예
@property (nonatomic) NSArray <ToastProduct *> *products;

// 상품 목록 조회
[ToastGamebaseIAP requestProductsForStore:self.store
                    withCompletionHandler:^(ToastGamebaseProductsResponse * _Nullable response, NSError * _Nullable error) {

    if (error == nil) {
        // 구매 가능한 상품 목록 저장
        self.products = response.products;

    } else {
        NSLog(@"Failed to request products: %@", error);
    }
}];

// 상품 구매 요청
[ToastGamebaseIAP purchaseForStore:self.store
                           product:[self.products objectAtIndex:0]
             withCompletionHandler:^(NSString* store, BOOL isSuccess, ToastGamebasePurchaseResult * _Nullable purchase, NSError * _Nullable error) {

     NSLog(@"[result Callback] Store : %@", store);
     NSLog(@"[result Callback] Success : %@", isSuccess ? @"YES" : @"NO");
     NSLog(@"[result Callback] ToastGamebasePurchaseResult : %@", purchase);
     NSLog(@"[result Callback] Error : %@", error);
}];

상품 ID를 이용한 구매 요청

  • 서비스에서 별도로 상품 목록을 관리하고 있다면, 상품 ID만을 이용해 구매를 요청합니다.
  • 구매할 수 없는 상품이면 Observer를 통해 구매 불가 상품임을 나타내는 오류가 전달됩니다.
API 명세

typedef void (^ToastGamebasePurchaseResultHandler)(NSString *_Nonnull store,
                                                   BOOL isSuccess,
                                                   ToastGamebasePurchaseResult *_Nullable purchase,
                                                   NSString *_Nonnull productIdentifier,
                                                   NSError* _Nullable error);

+ (void)purchaseForStore:(NSString *)store
       productIdentifier:(NSString *)productIdentifier
   withCompletionHandler:(ToastGamebasePurchaseResultHandler)completionHandler;
API 사용 예

[ToastGamebaseIAP purchaseForStore:self.store
                 productIdentifier:PRODUCT_IDENTIFIER
             withCompletionHandler:^(NSString* store, BOOL isSuccess, ToastGamebasePurchaseResult * _Nullable purchase, NSError * _Nullable error) {

    NSLog(@"[result Callback] Store : %@", store);
    NSLog(@"[result Callback] Success : %@", isSuccess ? @"YES" : @"NO");
    NSLog(@"[result Callback] ToastGamebasePurchaseResult : %@", purchase);
    NSLog(@"[result Callback] Error : %@", error);

}];

활성화된 구매 목록 조회

ToastIAP(AppStore)에서만 지원하는 기능입니다.

  • 현재 사용자 ID에 활성화된 구매(만료되지 않고 구독 중인 구독 상품) 목록을 조회합니다.
  • 사용자 ID가 같다면 Android에서 구매한 구독 상품도 조회됩니다.
API 명세
+ (void)requestActivePurchasesForStore:(NSString *)store
                 withCompletionHandler:(nullable void (^)(NSArray<ToastGamebasePurchaseResult *> * _Nullable purchases, NSError * _Nullable error))completionHandler;
API 사용 예
[ToastGamebaseIAP requestActivePurchasesForStore:self.store
                           withCompletionHandler:^(NSArray<ToastGamebasePurchaseResult *> * _Nullable purchases, NSError * _Nullable error) {

    if(error == nil) {
        NSLog(@"requestActivePurchases : %@", purchases);
    }else {
        NSLog(@"requestActivePurchases : %@", error);
    }
}];

구매 복원

ToastIAP(AppStore)에서만 지원하는 기능입니다.

  • 현재 사용자 ID에서 구매된 항목 중 복원 가능한 구매 목록을 조회합니다.
API 명세
+ (void)restoreForStore:(NSString *)store
  withCompletionHandler:(nullable void (^)(NSArray<ToastGamebasePurchaseResult *> * _Nullable purchases, NSError * _Nullable error))completionHandler;
API 사용 예
ToastGamebaseIAP restoreForStore:self.store
           withCompletionHandler:^(NSArray<ToastGamebasePurchaseResult *> * _Nullable purchases, NSError * _Nullable error) {

    if(error == nil) {
        NSLog(@"restore : %@", purchases);
    }else {
        NSLog(@"restore : %@", error);
    }
}];

미소비 구매 내역 조회

  • 소비성 상품의 경우 상품 지급 후에 소비(consume) 처리를 해야 합니다.
  • 소비 처리되지 않은 구매 내역을 조회합니다.
API 명세
+ (void)requestConsumablePurchasesForStore:(NSString *)store
                     withCompletionHandler:(nullable void (^)(NSArray<ToastGamebasePurchaseResult *> * _Nullable purchases, NSError * _Nullable error))completionHandler;
API 사용 예
[ToastGamebaseIAP requestConsumablePurchasesForStore:self.store
                               withCompletionHandler:^(NSArray<ToastGamebasePurchaseResult *> * _Nullable purchases, NSError * _Nullable error) {

    if (error == nil) {
        NSLog(@"%@", purchases);
    } else {
        NSLog(@"%@", error);
    }
}];

소비성 상품 소비

  • 소비성 상품의 경우 서비스에 상품 지급 후에 REST API 혹은 SDK의 Consume API로 소비 처리를 해야 합니다.
API 명세
API 사용 예
[ToastGamebaseIAP requestConsumablePurchasesForStore:self.store
                               withCompletionHandler:^(NSArray<ToastGamebasePurchaseResult *> * _Nullable purchases, NSError * _Nullable error) {

    for (int i=0; i<purchases.count; i++) {

        ToastGamebasePurchaseResult *result = [purchases objectAtIndex:i];

        [ToastGamebaseIAP consumeForStore:self.store
                           purchaseResult:result
                    withCompletionHandler:^(NSError * _Nullable error) {

            NSLog(@"consumeWithStore : %@ n %@", result, error);

            if(error == nil) {
                NSLog(@"Success Consume : %@", result ];
            }else {
                NSLog(@"Fail  Consume : %@", error ];
            }
        }];
    }
}];    

(구)IAP SDK 호환성 유지

Error Code

  • ToastGamebaseIAP 의 ErrorCode는 ToastIAP의 ErrorCode와 동일한 Code를 사용합니다.
  • ToastOngate에만 존재하는 ErrorCode (60001)과 Interface 통합으로 인해 발생 할 수 있는 ErrorCode는 신규 Code를 지정하여 사용합니다.
static NSString *const ToastGamebaseIAPErrorDomain = @"com.toast.iap.gamebase";

typedef NS_ENUM(NSInteger, ToastGamebaseIAPErrorCode) {

    //ToastGamebase Error Code
    ToastGamebaseIAPErrorCodeStoreNotMatched         = 10001,

    ToastGamebaseIAPErrorCodeNotSupportedMethod      = 10008,
    ToastGamebaseIAPErrorCodeNotImportedFramework    = 10009,

    //ToastGamebase Ongate Only Code
    ToastGamebaseIAPErrorOngateCashInsufficient      = 60001,
};

Latest podspec

{
    "name": "ToastGamebaseIAP",
    "version": "0.9.2",
    "summary": "ToastGamebaseIAP SDK 0.9.2",
    "homepage": "https://github.com/nhn/toast.gamebase.iap.ios.sdk",
    "license": {
        "type": "Apache License, Version 2.0",
        "file": "toast.gamebase.iap.ios.sdk-0.9.2/LICENSE.md"
    },
    "authors": {
        "hyup1028": "[email protected]"
    },
    "source": {
        "http": "https://github.com/nhn/toast.gamebase.iap.ios.sdk/archive/0.9.2.zip"
    },
    "platforms": {
        "ios": "8.0"
    },
    "requires_arc": true,
    "ios": {
        "vendored_frameworks": "toast.gamebase.iap.ios.sdk-0.9.2/ToastGamebaseIAP/ToastGamebaseIAP.framework"
    },
    "dependencies": {
        "ToastIAP": [
            "0.14.1"
        ]
    }
}

Pin It on Pinterest

Share This