2013-02-14 1 views
1

이전 앱에는 IAP가 하나뿐이므로 코드에 문제가 있다는 것을 깨닫지 못했습니다. 오늘은 여러 개의 IAP 제품이있는 앱이 있는데 문제가 발견되었습니다.iOS, 여러 가지 IAP (인앱 구매) 제품, 결제 방법이 너무 빠름

나는 Troy's IAP tutorial을 따라 갔고 코드를 복사했습니다. 그 이전의 애플 리케이션에는 잘 돌아갔다. 애플 리케이션마다 하나의 IAP 제품 만 있었기 때문이다. 이 자습서에서는 하나의 IAP 제품을 예제로 사용합니다. 나는 그의 블로그에 내 질문을 올리려고했지만 내 게시물이 너무 길고 서식이없고, 여기 전문가들이 내가 더 많은 것을 이해하고 뭔가 잘못 이해했는지 또는 뭔가를 놓친 지 확인하는 데 도움이 될 것이라고 생각합니다.

이제 두 가지 사항을 해결해야합니다 (내가 빠뜨린 경우를 제외하고,이 튜토리얼에서는 여러 IAP 제품의 사례를 언급하지 않았습니다).

1

은, 내가 오해하는 경우, 자습서,이

// 
// call this method once on startup 
// 
- (void)loadStore { 
    // restarts any purchases if they were interrupted last time the app was open 
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 

    // get the product description (defined in early sections) 
    [self requestProUpgradeProductData]; 
} 

그래서 나는의 ViewController에서 내 응용 프로그램의 시작 부분에서이 메서드를 호출처럼 loadStore 방법에 대한 코멘트가 알고하지 않습니다. m 파일. 내 이해는이 방법은 이전 트랜잭션이 거기에 매달려 있고 앱이 다시 시작되는 순간에 처리해야 할 필요가 있는지 확인해야한다는 것입니다. 이것이이 loadStore 메소드의 첫 번째 문장입니다. 여기

- (void)requestProUpgradeProductData { 
    NSSet *productIdentifiers = [NSSet setWithObject:@"com.runmonster.runmonsterfree.upgradetopro" ]; 
    productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers]; 
    productsRequest.delegate = self; 
    [productsRequest start]; 

    // we will release the request object in the delegate callback 
} 

공지 사항,이 방법의 첫 번째 문은 IAP 제품 ID를 얻을 수 있습니다 : 방법은 다음과 같이 requestProUpgradeProductData를 호출하고 있습니다. 제품 ID가 고정되어 있으므로 one-IAP- 제품 앱의 경우 모두 괜찮습니다. 앱을 실행하기 시작할 때 loadStore를 호출해도됩니다. 사실, 여기에 두 번째 문제가 있기 때문에 loadStore는 아마 앱을 실행하기 시작할 때 실행해야합니다.

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response 
{ 
    NSArray *products = response.products; 
    proUpgradeProduct = [products count] == 1 ? [[products firstObject] retain] : nil; 
    if (proUpgradeProduct) 
    { 
    NSLog(@"Product title: %@" , proUpgradeProduct.localizedTitle); 
    NSLog(@"Product description: %@" , proUpgradeProduct.localizedDescription); 
    NSLog(@"Product price: %@" , proUpgradeProduct.price); 
    NSLog(@"Product id: %@" , proUpgradeProduct.productIdentifier); 
    } 

    for (NSString *invalidProductId in response.invalidProductIdentifiers) 
    { 
    NSLog(@"Invalid product id: %@" , invalidProductId); 
    } 

    // finally release the reqest we alloc/init’ed in requestProUpgradeProductData 
    [productsRequest release]; //I didn't do this because of ARC 

    [[NSNotificationCenter defaultCenter] postNotificationName:kInAppPurchaseManagerProductsFetchedNotification object:self userInfo:nil]; 
} 
: loadStore은 사용자가 아니라 응용 프로그램의 시작 부분에보다 IAP 구매하고자하는 순간에 실행하는 경우

2

는 캐치는 [productRequest 시작]을 실행하면, 다음과 같은 방법을 실행하는 것이다

제품을 실행하고 응답을 반환합니다. 다음 나는 지불을 시작해야하지만, 난 HRER가 다음과 같은 방법으로 호출해야한다고 확신하지 않습니다. 이것은 IAP 지불을 시작하는 방법입니다. 앞서 언급했듯이 일단 loadStore가 app의 시작 부분에서 실행되면 productRequest .... 응답 메소드 (위 오른쪽)를 통해 사용자가 여기를 잠깐 동안 클릭하면 알림을 완료하고 다시 보내기위한 "충분한 시간"이 있습니다. 그리고 말했듯이 1-IAP 제품 앱의 경우 처음부터 제품 ID를 지정할 수 있습니다. 이제 다중 IAP 제품이있는 앱의 경우 여러 제품을 사용자에게 제시해야하며 사용자는 그 중 하나를 선택해야합니다. 바로 뒤에 두 가지가 순서대로 필요합니다. A, loadStore -> productRequest 메서드 (위 오른쪽) 및 B를 통해 IAP 제품을 지정하고 다음 메서드를 호출하여 지불을 시작합니다.

- (void)purchaseProUpgrade 
{ 
    SKPayment *payment = [SKPayment paymentWithProductIdentifier:kInAppPurchaseProUpgradeProductId]; 
    [[SKPaymentQueue defaultQueue] addPayment:payment]; 
} 

그러나 지불 요청 메소드를 호출하는 순간 productRequest ..... 응답 메소드가 아직 반환되지 않을 수 있습니다. 나는 지불을 시작할 수 없을 것입니다. 두 번째 단계에서 또는 그 사이에 지연 기능을 넣을 생각 이었지만 근본적으로 잘못된 것이라고 생각합니다. 그러나 문제를 해결하는 방법은 무엇입니까?

아무도 도와 줄 수 있습니까?

답변

1

중요한 것은 productsRequest에서 응답을받을 때까지는 사용자가 구입할 수 없다는 것입니다. 먼저 initWithProductIdentifiers:은 일련의 식별자를 사용합니다.따라서 앱을 시작할 때나 구매 옵션을 사용자에게 제시하기 전에 사용자가 구매할 수있는 모든 제품에 대해 식별자/skus를 사용하여 호출합니다. 시작시 호출하면 낭비가되지만 작동해야하며 일부 앱의 유일한 옵션 일 수 있습니다.

제품 개체가 포함 된 productsRequest:didReceiveResponse: 콜백을받은 후에 만 ​​사용자가 해당 제품에 대한 클릭 또는 터치하거나 다른 방법으로 호출 할 수 있습니다. 사용자가 구매를 시도하기 전에 제품이 있는지 확인하기 위해 응답을 확인해야합니다. 구입 화면이 있는데 사용자가 입력하면 응용 프로그램의 현재 상태와 관련된 모든 제품 (예 : 구매 항목을 생략하거나 레벨별로 제품 제한)과 함께 productsRequest을 호출합니다. 구매 화면도 만들지 만 제품으로 채우지는 않습니다. 응답 위임자에서는 실제로 화면에 구매 가능한 객체를 채 웁니다. 그렇게하면 사용자는 잘못된 제품을 구매할 수 없습니다. - 사용되지 않는 방법이 paymentWithProductIdentifier:을 사용하여 현재 설정에서 변화가 있음을

[SKPayment paymentWithProduct:product] 

참고 :

사용자가 클릭/탭, 당신은 사용하여 지불 객체를 생성 응답에서 제품 객체를 사용

.

+0

멋진. 나에게 합리적인 소리. 나는 당신의 전략을 시험해보고 당신의 대답으로 돌아갈 것입니다. 감사. –

+0

내가 설명한 것처럼 내 코드 논리를 재정렬하면 지금 작동합니다. 당신의 대답을 수락했습니다. –