2012-11-26 30 views
8

मैं कैसे जांच सकता हूं कि उपयोगकर्ता ने रद्द बटन को टैप किया है (या तो जब उसे पूछा गया कि क्या वह smth खरीदना चाहता है या शायद वह पहले से ही यह SKProduct खरीदा है कि वह इसे डाउनलोड करना चाहता है)?जांचें कि उपयोगकर्ता ने रद्द किया है SKPaymentTransaction

अभी के लिए मुझे केवल भुगतान में SKPaymentTransactionStateFailed प्राप्त होता है Queue: UpdateTransactions: उपयोगकर्ता टैप रद्द करने के बाद दोनों विधि और उदाहरण के लिए जब कोई इंटरनेट नहीं है। इन दो मामलों को अलग करने का कोई तरीका?

उत्तर

0

सेट की गई SKPaymentTransaction त्रुटि प्रॉपर्टी की जांच करें। इसके अतिरिक्त, आप यह निर्धारित करने के लिए ऐप्पल की रीचैबिलिटी क्लास का उपयोग करना चाह सकते हैं कि लेनदेन शुरू करने से पहले इंटरनेट उपलब्ध है या नहीं।

त्रुटि लेनदेन को संसाधित करते समय हुई त्रुटि का वर्णन करने वाला एक ऑब्जेक्ट। (रीड-ओनली)

@property (nonatomic, रीड-ओनली) NSError * त्रुटि चर्चा त्रुटि संपत्ति जब transactionState SKPaymentTransactionStateFailed पर सेट है सिवाय अपरिभाषित है। लेनदेन विफल क्यों हुआ यह निर्धारित करने के लिए आपका एप्लिकेशन त्रुटि प्रॉपर्टी पढ़ सकता है।

उपलब्धता आईओएस 3.0 और बाद में उपलब्ध है। में घोषित SKKaymentTransaction.h

+2

इसके बारे में अजीब हिस्सा है यही कारण है कि। जब मैं रद्द बटन दबाता हूं तब भी मुझे भुगतान में SKPaymentTransactionStateFailed प्राप्त होता है Queue: अद्यतन ट्रांज़ेक्शन: विधि और निम्न त्रुटि: त्रुटि डोमेन = SKErrorDomain कोड = 2 "आईट्यून्स स्टोर से कनेक्ट नहीं हो सकता" – dariaa

+0

यह दुर्भाग्यपूर्ण है।इसलिए मैं ऐप्पल की रीचैबिलिटी क्लास का उपयोग कर इंटरनेट कनेक्टिविटी की जांच करूंगा, और यदि आपके पास कनेक्टिविटी है, तो आप जानते हैं कि इसे या तो रद्द कर दिया गया था या किसी भी तरह से सर्वर के साथ खरीद विफल रही थी। मैं एक बग रिपोर्ट भी दर्ज करूंगा जिसमें कहा गया है कि त्रुटि प्रॉपर्टी दस्तावेज के रूप में काम नहीं करती है, और एक फिक्स के लिए पूछती है। –

+0

यह कनेक्टिविटी समस्या नहीं है - किसी कारण से, लेनदेन को रद्द करते समय या जब यह किसी अन्य कारण से विफल रहता है तो त्रुटि समान होती है। – Stavash

1

शायद आप ऐप खरीद में रे वंडरलिच के ट्यूटोरियल कोड का उपयोग कर रहे हैं। वहाँ कोड का कहना है:

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

if ((self = [super init])) { 

    // Store product identifiers 
    _productIdentifiers = productIdentifiers; 

    // Check for previously purchased products 
    _purchasedProductIdentifiers = [NSMutableSet set]; 
    for (NSString * productIdentifier in _productIdentifiers) { 
     BOOL productPurchased = [[NSUserDefaults standardUserDefaults] boolForKey:productIdentifier]; 
     if (productPurchased) { 
      [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; // CHECK THIS 
      [_purchasedProductIdentifiers addObject:productIdentifier]; 
      NSLog(@"Previously purchased: %@", productIdentifier); 
     } else { 
      NSLog(@"Not purchased: %@", productIdentifier); 
     } 
    } 

वहाँ आप देख सकते हैं, कि addTransactionObserver केवल, कहा जाता है कि अगर उत्पाद पहले से ही pruchased है। यदि आप क्वेरी के सामने कोड की इस पंक्ति को ले जाते हैं तो आपको वांछित परिणाम मिलेंगे।

[[SKPaymentQueue defaultQueue] addTransactionObserver:self]; // MOVE HERE 
if (productPurchased) { 
    [_purchasedProductIdentifiers addObject:productIdentifier]; 
    NSLog(@"Previously purchased: %@", productIdentifier); 
} else { 
    NSLog(@"Not purchased: %@", productIdentifier); 
}     

failedTransaction विधि में अब तुम अब कॉल कर सकते हैं

[[NSNotificationCenter defaultCenter] postNotificationName:IAPHelperProductPurchasedNotification object:nil userInfo:nil]; 

आप अपने वर्तमान दृश्य

15

इस कोड में अधिसूचना द्वारा भेजे गए शून्य मान की जाँच कर सकते हैं मेरे लिए काम करता है:

if (transaction.error.code != SKErrorPaymentCancelled) { 
    NSLog(@"Other error"); 
} else { 
    NSLog(@"User canceled"); 
} 
9

एलेन का जवाब सही है। शायद ज़रुरत पड़े किसी अन्य मामलों

switch (transaction.error.code) { 
     case SKErrorUnknown: 
      //Unknown error 
      break; 
     case SKErrorClientInvalid: 
      // client is not allowed to issue the request, etc. 
      break; 
     case SKErrorPaymentCancelled: 
      // user cancelled the request, etc. 
      break; 
     case SKErrorPaymentInvalid: 
      // purchase identifier was invalid, etc. 
      break; 
     case SKErrorPaymentNotAllowed: 
      // this device is not allowed to make the payment 
      break; 
     default: 
      break; 
} 
1

स्विफ्ट 2.2

एक मामले में जहां paymentQueue में एक .Failed प्रतिक्रिया मिल के बारे में सोच रहा है, यह एक अच्छा विचार है आप सभी त्रुटियों को संभालने के लिए होगा कर सकते हैं।

if let error = transaction.error { 
    if error.domain == SKErrorDomain { 
     // handle all possible errors 
     switch (error.code) { 
     case SKErrorCode.Unknown.rawValue: 
      print("Unknown error") 
      break; 
     case SKErrorCode.ClientInvalid.rawValue: 
      print("client is not allowed to issue the request") 
      break; 
     case SKErrorCode.PaymentCancelled.rawValue: 
      print("user cancelled the request") 
      break; 
     case SKErrorCode.PaymentInvalid.rawValue: 
      print("purchase identifier was invalid") 
      break; 
     case SKErrorCode.PaymentNotAllowed.rawValue: 
      print("this device is not allowed to make the payment") 
      break; 
     default: 
      break; 
     } 
    } 
} 
4

यहाँ स्विफ्ट 3.0 पर काम करने वाले कोड है:

if let error = transaction.error as? NSError { 

       if error.domain == SKErrorDomain { 
        // handle all possible errors 
        switch (error.code) { 
        case SKError.unknown.rawValue: 
         print("Unknown error") 

        case SKError.clientInvalid.rawValue: 
         print("client is not allowed to issue the request") 

        case SKError.paymentCancelled.rawValue: 
         print("user cancelled the request") 

        case SKError.paymentInvalid.rawValue: 
         print("purchase identifier was invalid") 

        case SKError.paymentNotAllowed.rawValue: 
         print("this device is not allowed to make the payment") 

        default: 
         break; 
      } 
    } 
+2

यदि आप इसे 'एनएसईआरआरआर' में नहीं डालते हैं तो यह 'SKError' रहेगा और आप केवल' केस SKError.unknown: 'कर सकते हैं; 'rawValue' का उपयोग करने की कोई आवश्यकता नहीं है। –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^