2014-03-03 11 views
5

Ich versuche, einige Inapp-Kauf zu implementieren. Ich habe das Online-Tutorial verfolgt und mein Code ist unten veröffentlicht. Ich habe die In-App-Käufe zu meinem iTunes Connect-Konto hinzugefügt, aber wenn ich den Code ausführe, ruft er die "didfailwitterror" -Methode auf, die die Liste der Produkte nicht laden kann. Hat jemand anderes dieses Problem und kennt möglicherweise eine Lösung?In-App-Kauf fehlgeschlagen, Liste der Produkte zu laden

#import "IAPHelper.h" 
#import <StoreKit/StoreKit.h> 
NSString *const IAPHelperProductPurchasedNotification = @"IAPHelperProductPurchasedNotification"; 

@interface IAPHelper() <SKProductsRequestDelegate, SKPaymentTransactionObserver> 

@end 

@implementation IAPHelper{ 
    SKProductsRequest *_productsRequest; 
    RequestProductsCompletionHandler _completionHandler; 
    NSSet * _productIdentifiers; 
    NSMutableSet * _purchasedProductIdentifiers; 
} 

-(id)initWithProductIdentifiers:(NSSet *)productIdentifiers{ 

    NSLog(@"get product ids"); 

if((self=[self init])){ 
    _productIdentifiers = productIdentifiers; 
    _purchasedProductIdentifiers = [NSMutableSet set]; 
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 
    for (NSString* productIdentifier in _productIdentifiers) { 
     NSLog(@"product id is %@", productIdentifier); 

     BOOL productPurchased = [[NSUserDefaults standardUserDefaults] boolForKey:productIdentifier]; 
     if (productPurchased) { 
      [_purchasedProductIdentifiers addObject:productIdentifier]; 
     } 
    } 
} 
return self; 
} 

-(void)requestProductsWithCompletionHandler:(RequestProductsCompletionHandler)completionHandler{ 

NSLog(@"Attempt to complete request for products"); 

    _completionHandler = [completionHandler copy]; 
    _productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:_productIdentifiers]; 
    _productsRequest.delegate=self; 
    [_productsRequest start]; 
} 

#pragma mark - SKProductsRequestDelegate 

    - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response { 

NSLog(@"Loaded list of products..."); 
_productsRequest = nil; 

NSArray * skProducts = response.products; 
for (SKProduct * skProduct in skProducts) { 
    NSLog(@"Found product: %@ %@ %0.2f", 
      skProduct.productIdentifier, 
      skProduct.localizedTitle, 
      skProduct.price.floatValue); 
} 

_completionHandler(YES, skProducts); 
_completionHandler = nil; 

} 

- (void)request:(SKRequest *)request didFailWithError:(NSError *)error { 

NSLog(@"Failed to load list of products."); 
_productsRequest = nil; 

_completionHandler(NO, nil); 
_completionHandler = nil; 

} 

- (BOOL)productPurchased:(NSString *)productIdentifier { 
return [_purchasedProductIdentifiers containsObject:productIdentifier]; 
} 

- (void)buyProduct:(SKProduct *)product { 

    NSLog(@"Buying %@...", product.productIdentifier); 

    SKPayment * payment = [SKPayment paymentWithProduct:product]; 
    [[SKPaymentQueue defaultQueue] addPayment:payment]; 

} 

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions 
{ 
for (SKPaymentTransaction * transaction in transactions) { 
    switch (transaction.transactionState) 
    { 
     case SKPaymentTransactionStatePurchased: 
      [self completeTransaction:transaction]; 
      break; 
     case SKPaymentTransactionStateFailed: 
      [self failedTransaction:transaction]; 
      break; 
     case SKPaymentTransactionStateRestored: 
      [self restoreTransaction:transaction]; 
     default: 
      break; 
    } 
}; 
} 
- (void)completeTransaction:(SKPaymentTransaction *)transaction { 
    NSLog(@"completeTransaction..."); 

    [self provideContentForProductIdentifier:transaction.payment.productIdentifier]; 
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 
} 

- (void)restoreTransaction:(SKPaymentTransaction *)transaction { 
    NSLog(@"restoreTransaction..."); 

[self provideContentForProductIdentifier:transaction.originalTransaction.payment.productIdentifier]; 
[[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 
} 

- (void)failedTransaction:(SKPaymentTransaction *)transaction { 

    NSLog(@"failedTransaction..."); 
    if (transaction.error.code != SKErrorPaymentCancelled) 
    { 
     NSLog(@"Transaction error: %@", transaction.error.localizedDescription); 
    } 

[[SKPaymentQueue defaultQueue] finishTransaction: transaction]; 
} 

- (void)provideContentForProductIdentifier:(NSString *)productIdentifier { 
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
    int currentHints = [userDefaults integerForKey:@"hintAmount"]; 
    [_purchasedProductIdentifiers addObject:productIdentifier]; 
    if ([productIdentifier isEqual: @"1"]) { 
    [userDefaults setInteger:(currentHints+50) forKey:@"hintAmount"]; 
    }else if ([productIdentifier isEqual: @"2"]){ 
    [userDefaults setInteger:(currentHints+100) forKey:@"hintAmount"]; 
    }else if ([productIdentifier isEqual: @"3"]){ 
    [userDefaults setInteger:(currentHints+200) forKey:@"hintAmount"]; 
    }else if ([productIdentifier isEqual: @"4"]){ 
    [userDefaults setInteger:(currentHints+500) forKey:@"hintAmount"]; 
    } 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
    [[NSNotificationCenter defaultCenter] postNotificationName:IAPHelperProductPurchasedNotification object:productIdentifier userInfo:nil]; 

} 


@end 
+0

Ich denke, es kein Code Problem ist, dass Sie ungültige Kennung bekommen, weil Sie nicht ein paar Schritte i einige Bedingungen erwähnen Abschluss bitte diese – morroko

Antwort

-1

Fullfill alle Zustand sind diese

1.Have Sie In-App-Käufe für Ihre App-ID aktiviert?

2. Haben Sie für Ihr Produkt Cleared for Sale überprüft?

3.Haben Sie Ihre Anwendungsbinärdatei eingereicht (und optional abgelehnt)?

4. Entspricht die .plist Bundle ID Ihres Projekts Ihrer App ID?

5.Haben Sie ein neues Bereitstellungsprofil für die neue App-ID erstellt und installiert?

6. Haben Sie Ihr Projekt so konfiguriert, dass es mit diesem neuen Bereitstellungsprofil Zeichen codiert?

7.Bauen Sie für iPhone OS 3.0 oder höher?

8. Verwenden Sie die vollständige Produkt-ID beim Erstellen einer SKProductRequest?

9. Haben Sie mehrere Stunden gewartet, seit Sie Ihr Produkt zu iTunes Connect hinzugefügt haben?

10.Wenn Ihre Bankverbindung bei iTunes aktiviert ist? (über Markierung)

11.Haben Sie versucht, die App von Ihrem Gerät zu löschen und neu zu installieren?

Wenn Sie eine dieser Fragen mit "Nein" beantwortet haben, liegt Ihr Problem vor.

+0

Ich habe meine Binärdatei nicht eingereicht, aber ist das notwendig beim Testen der App in der Entwicklung? –

+0

Wenn Sie nur zu Testzwecken implementieren, müssen Sie keine Binärdatei senden. erhalten Sie eine ungültige Produktidentifikation oder eine leere Produktliste in der Konsole? – morroko

+0

weder überspringt es direkt zu dem Fehler mit Fehler, nicht sicher, wie überprüft werden muss, ob die Produkt-ID gültig ist oder nicht –

1

FYI - Sie müssen die App auf einem Gerät ausführen, um Produkte für IAPs ordnungsgemäß zu erhalten. Ich hatte das Problem, dass es alle Produktkennzeichnungen als "nicht gekauft" ausspuckte, aber dann sagte "Ich konnte die Liste der Produkte nicht laden", als ich versuchte, sie in einer Tabellenansicht anzuzeigen. Dies war während des Laufens im Simulator. Sobald ich auf einem Gerät lief, funktionierte perfekt!

benutzte ich dieses Tutorial die grundlegenden Hilfsdateien zu erhalten, die alle die schwere Arbeit tun: http://www.raywenderlich.com/21081/introduction-to-in-app-purchases-in-ios-6-tutorial

Verwandte Themen