원문(리스토어와 인엡 풀소스) - http://www.changwoo.net/bbs/bbsDetail.do?&num=545
애플의 정책이 바뀌어 non-consume in-app은 무조건 restore(복구) UI가 있어야 합니다, 안그러면 리젝사유가 되어 가슴아픈 경험을 하게 됩니다.
그에 따른 로직을 올립니다.
버튼에 이벤트로
- (
void
) onClickRestore:(id)sender
를 호출하면checkPurchasedItems ->
상황1 - 로그인 취소- >
(
void
)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error
상황2
- 로그인 성공 ->
(
void
)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue
요런 로직입니당
로그인이 성공하면
paymentQueueRestoreCompletedTransactionsFinished함수에서 그동안 구입한 인엡에 대한 목록
(product id)
을 얻어옵니다
그러면 콜백받은 인엡목록과 본어플의 인엡의 코드(product id)를 검사해서 있는지 확인한후 처리 하시면 되겠습니다.
//복구 버튼 이벤트
- (
void
) onClickRestore:(id)sender
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSArray *languages = [defaults objectForKey:@
"AppleLanguages"
];
NSString *currentLanguage = [languages objectAtIndex:
0
];
NSString *requestString = @
""
;
//Language process
if
([currentLanguage isEqualToString:@
"ko"
]) {
// requestString = @"복구 요청중";
}
else
{
// requestString = @"Restore requesting";
}
HUD = [[MBProgressHUD alloc] initWithWindow:[[UIApplication sharedApplication] keyWindow]];
// HUD.center = CGPointMake(10, 110);
[[[UIApplication sharedApplication] keyWindow] addSubview:HUD];
HUD.delegate = self;
HUD.labelText = requestString;
[HUD show:YES];
[self checkPurchasedItems];
}
- (
void
) checkPurchasedItems
{
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
[HUD show:NO];
}
// Call This Function
- (
void
)paymentQueue:(SKPaymentQueue *)queue removedTransactions:(NSArray *)transactions
{
NSLog(@
"- (void)paymentQueue:(SKPaymentQueue *)queue removedTransactions:(NSArray *)transactions "
);
}
// Sent when an error is encountered while adding transactions from the user's purchase history back to the queue.
- (
void
)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error
{
NSLog(@
"- (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error "
);
[HUD hide:YES];
}
// Then this is called
- (
void
)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue
{
NSLog(@
"%@"
,queue );
NSLog(@
"Restored Transactions are once again in Queue for purchasing %@"
,[queue transactions]);
NSMutableArray *purchasedItemIDs = [[NSMutableArray alloc] init];
NSLog(@
"received restored transactions: %i"
, queue.transactions.count);
//결재 기록이 없을때 alert 뛰우기
if
(queue.transactions.count==
0
){
// NSString *fileMessage = NSLocalizedString(@"NOTRESTORE", @"restore");
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSArray *languages = [defaults objectForKey:@
"AppleLanguages"
];
NSString *currentLanguage = [languages objectAtIndex:
0
];
NSString *failMessage;
//Language process
if
([currentLanguage isEqualToString:@
"ko"
]) {
failMessage = @
"구매 기록이 없습니다."
;
}
else
{
failMessage = @
"There is no record of your purchase."
;
}
UIAlertView *resultView = [[UIAlertView alloc] initWithTitle:@
"Failed"
message:failMessage
delegate:self
cancelButtonTitle:nil
otherButtonTitles:@
"OK"
, nil];
[resultView show];
}
for
(SKPaymentTransaction *transaction in queue.transactions)
{
NSString *productID = transaction.payment.productIdentifier;
[purchasedItemIDs addObject:productID];
NSLog (@
"product id is %@"
, productID);
// here put an if/then statement to write files based on previously purchased items
// example if ([productID isequaltostring: @"youruniqueproductidentifier]){write files} else { nslog sorry}
if
([productID isEqualToString:KONGLISH_PRODUCTID])
{
//재구입확인dh
NSLog(@
"already buy"
);
}
}
[HUD hide:YES];
}
유용하게 잘 사용했습니다~
더 요약하자면 핵심은 이거죠
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];//영구복원 실행
- (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error
{
if(error.code!=SKErrorPaymentCancelled)
{
//에러
}
else {
//유저 취소시
}
}
// Then this is called
- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue
{
if(queue.transactions.count==0){
//구매한 영구아이템이 없을경우
return;
}
for (SKPaymentTransaction *transaction in queue.transactions)
{
//구매한 아이템들에 대한 복원 처리
}
}
'iOS' 카테고리의 다른 글
[iPhone]keychain 을 이용한 id, password 저장 (0) | 2012.12.18 |
---|---|
아이폰 가로 스크롤 메뉴 샘플 (0) | 2012.12.18 |
IOS 기반 어플 효과음 재생 (0) | 2012.10.22 |
AudioService resource 해제 (0) | 2012.10.22 |
NSNotification을 이용하여 모든 Modal View를 dismiss 하는 방법 (1) | 2012.10.22 |