2013-11-21 10 views
5

मैं एक इन-ऐप खरीदारी बना रही हूँ द्वारा कई बार कहा जाता SKPaymentTransactionStatePurchased, लेकिन मैं एक बग है कि मैं नहीं मिल सकता है वह कहाँ से आता है ...त्रुटि

सबसे पहले है, मैं एक बटन है और जब आप इसे क्लिक करते हैं, तो मेरा ऐप उत्पाद का अनुरोध करता है, प्रतिक्रिया देता है, आप भुगतान करते हैं, और आपको उत्पाद मिलता है (सब कुछ ठीक काम करता है)। लेकिन यहां मेरी समस्या आती है। अगर मैं फिर से कुछ भी खरीदने के लिए बटन पर क्लिक करता हूं, तो मुझे दो अलर्ट मिलते हैं जिन्हें मैंने दो बार खरीदा था। यहां तक ​​कि यदि मैं तीसरे बार क्लिक करता हूं, तो मुझे तीन अलर्ट मिलते हैं जिन्हें मैंने तीन बार खरीदा, और चार और पांच मैंने क्लिक किए गए समय के अनुसार।

तो ऐसा लगता है कुछ चर की तरह अनुरोध भंडारण रहता है .. यहाँ मेरी कोड है:

इस उत्पाद आईडी

- (void) validateProductIdentifiers 
{ 
NSString *monedas = @" ID FROM PRODUCT "; 
NSSet *product = [NSSet setWithObject:monedas]; 

productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:product]; 

productsRequest.delegate = self; 
[[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 
[productsRequest start]; 
NSLog(@"STARTED REQUEST"); 
} 

यह एप्पल से

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


productsRequest=nil; 

int found=0; 

SKProduct *paraPagar; 
skProducts = response.products; 

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

    paraPagar = skProduct; 
} 
if (found==1){ 
    payment = [SKMutablePayment paymentWithProduct:paraPagar]; 
    payment.quantity = 1; 

    [[SKPaymentQueue defaultQueue]addPayment:payment]; 

}else{ 

//error (not relevant code) 

} 
} 
प्रतिक्रिया संभालती है सत्यापित करता है

भुगतान स्वीकार करना और समाप्त करना आईएनजी लेनदेन

- (void)paymentQueue:(SKPaymentQueue *)queue 
updatedTransactions:(NSArray *)transactions 
{ 



for (SKPaymentTransaction *transaction in transactions) { 
    switch (transaction.transactionState) { 

     case SKPaymentTransactionStatePurchased: 
      NSLog(@"BOUGHT"); 

      [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 
      [self completeTransaction:transaction]; 


      break; 
     case SKPaymentTransactionStateFailed: 
      NSLog(@"FAILED"); 
      [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 

      [self failedTransaction]; 
      break; 
     case SKPaymentTransactionStateRestored: 
      NSLog(@"RESTORED"); 
      //[self restoreTransaction:transaction]; 
      [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 
     case SKPaymentTransactionStatePurchasing: 
      NSLog(@"PURCHASING"); 
     default: 
      break; 
    } 

} 

} 

आपके समय के लिए बहुत बहुत धन्यवाद!

उत्तर

8

फिक्स्ड समस्या।

समस्या यह थी कि जब भी मैंने बटन पर क्लिक किया था या जब मैंने विचार बदल दिए थे तो पर्यवेक्षक को डुप्लिकेट किया जा रहा था।

समाधान एक ध्वज जोड़ रहा है, यह देखने के लिए कि पर्यवेक्षक पहले ही जोड़ा जा चुका है या नहीं।

static bool hasAddObserver=NO; 

PAYMENT METHOD{ 
if (!hasAddObserver) { 
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 
    hasAddObserver=YES; 
} 
..... 
+3

ऐप्पल के दस्तावेज़ों के अनुसार, * "आपके आवेदन को एप्लिकेशन प्रारंभिकरण के दौरान भुगतान कतार में पर्यवेक्षक जोड़ना चाहिए।"* तो आपका समाधान काम करता है, लेकिन आपके ऐप लॉन्च होने के तुरंत बाद लेन-देन के लिए देखना शुरू करना बेहतर होता है। – smileyborg

0

आप कॉल करना

[[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 

जब खरीदारी पूर्ण होने को याद कर रहे हैं?

+0

यह में जोड़ा जाता है "मामले SKPaymentTransactionStatePurchased:" मैं इसे कहीं और जोड़ने की जरूरत है? – mursang

-2
[addTransactionObserver] should run only once time. 
so you can use singleton pattern to solve this problem. 

+ (InAppPurchase *)sharedInstance 
{ 
    static dispatch_once_t once; 
    static InAppPurchase * sharedInstance; 
    dispatch_once(&once, ^{ 
     sharedInstance = [[self alloc] initWithProductIdentifiers:nil]; 
    }); 
    return sharedInstance; 
} 

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

    if ((self = [super init])) { 
     // Add self as transaction observer 
     [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 
    } 
    return self; 
} 
+0

लेकिन यह इस समस्या को हल नहीं कर सकता है। आपको इसे बेहतर तरीके से कॉल करना चाहिए। फिनिशलांचिंग विथऑप्शन जैसे [इनएप खरीददारी साझा करें]; जब आप चाहते हैं कुछ खरीदें, आप [[InAppPurchase SharedInstance] buyProduct: (SKProduct) myProduct] को कॉल कर सकते हैं; – joe

3

मैं एक ही समस्या थी, मैं एक आईएपी पर खरीदने क्लिक करेंगे और एप्पल से कई प्रतिक्रियाएं और खरीद प्राप्त होगा।

addTransactionObserver() हर बार जब मैं छोड़ा गया था और viewDidLoad() के माध्यम से दृश्य में वापस आया था।

मैं करने के लिए आवश्यक viewWillDisappear() में यह गैर पर ध्यान दें:

override func viewWillDisappear() { 
    SKPaymentQueue.defaultQueue().removeTransactionObserver(self) 
} 

मैं एक झंडा उपयोग करें, क्योंकि मैं भी दृश्य में लेनदेन के लिए बात सुनी mursang के जवाब में जैसे कई पर्यवेक्षकों को रोकने के लिए could't।

+0

अच्छा उत्तर भी :) – mursang

+0

अच्छी तरह से, मेरा पर्यवेक्षक UIViewController का वंशज है, क्योंकि मुझे इसे अद्यतन में कुछ UI क्रियाएं करने की आवश्यकता है ट्रांज़ेक्शन: विधि कोई भी तरीका यह नहीं किया जा सकता है जब तक कि ViewDidLoad विधि को कॉल न किया जाए और उस UIViewController का एक उदाहरण बनाया गया हो। –

0

स्विफ्ट 3: @sponrad जवाब के अनुसार

override func viewWillDisappear(_ animated: Bool) { 
    SKPaymentQueue.default().remove(self) 
} 
संबंधित मुद्दे