2011-10-13 8 views
8

मैं के साथ इन-ऐप खरीद सुविधा को कार्यान्वित कर रहा हूं बटन पुनर्स्थापित करें।स्टोरकिट: कैच बहाल विफल रहा?

मेरे पास ब्रांड नए परीक्षण उपयोगकर्ता सेट किए गए हैं, बिना किसी भुगतान किए।

जब मैं बटन बहाल, और नए परीक्षण उपयोगकर्ता के साथ प्रवेश करें मारा, मैं किसी भी सौंप तरीकों कि मुझे बताया कि बहाल लेनदेन में नाकाम रही है (के बाद से वहाँ बहाल करने के लिए कुछ भी नहीं है) नहीं पकड़ सकते।

लागू होने वाली एकमात्र विधि -(void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue*)queue है, लेकिन इस विधि को बहाल करने के मामले में भी कॉल किया जाता है।

अब मैं क्या कर सकता हूं? मैं ऐसे मामले को कैसे पकड़ सकता हूं?


अलावा: मैं एक प्रगति संकेतक है कि कहते हैं, "संपर्क App स्टोर" है, और मुझे एक मंगलाचरण जहां मैं भी विफल रहा है मामलों में यह छिपा कर सकते हैं की जरूरत है।

+0

के बाद से यहाँ आप के लिए एक कोड का टुकड़ा है यह मुद्दा टेस्ट उपयोगकर्ता द्वारा खरीदा नहीं गया था, आपको iTunesConnect के उत्तर में 'SKPaymentTransactionStateRestored' नहीं मिलेगा, जो अंत में आपके ट्रांसकेशन को समाप्त करता है। – Hisenberg

+0

स्पष्ट है। लेकिन मैंने एक "संपर्क ऐप स्टोर" प्रगति संकेतक दिखाया, और मुझे अभी भी विफलता पर इसे छिपाने के लिए एक कार्यक्रम की आवश्यकता है। – Geri

+1

कोई विफलता नहीं है, जब पुनर्स्थापित करने के लिए कोई लेनदेन नहीं होता है। असल में इस मामले को सफलता के रूप में संभाला जाता है। – Felix

उत्तर

1

जब आप किसी लेन-देन को बहाल, वहाँ दो प्रत्यायोजित तरीकों कर रहे हैं:

- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue 
- (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error 

जब सभी लेनदेन पुनर्स्थापित किए जाते हैं पहले एक (paymentQueueRestoreCompletedTransactionsFinished) कहा जाता है। यदि आपके पास पिछली खरीदारी नहीं है तो यह इस विधि को भी कॉल करती है क्योंकि पुनर्स्थापित काम ठीक है लेकिन पुनर्स्थापित करने के लिए कुछ भी नहीं है।

अन्य विधि (पुनर्स्थापित अपूर्ण ट्रांस्पेक्शनफेलविथरर) लेनदेन को पुनर्स्थापित करने में त्रुटि होने पर कॉल किया जाता है।

// 
// called when the transaction status is updated 
// 
- (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]; 
       restoredTransaction++; 
       break; 
      default: 
       break; 
     } 
    } 
} 
:

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

यहाँ आप इस प्रतिनिधि के लिए एक छोटा सा टुकड़ा है:

आप उपयोगकर्ता उसे कह के लिए एक संदेश दिखाने के लिए की जरूरत है वह बहाल करने के लिए आप उपयोग कर सकते हैं किसी भी लेनदेन नहीं है

तो फिर तुम restoredTransaction चर का उपयोग जानना चाहते हैं कि किसी भी लेनदेन बहाल कर दिया गया कर सकते हैं पर paymentQueueRestoreCompletedTransactionsFinished

+0

लेकिन गेरी ने इस समस्या को कैसे हल किया? वह कहता है कि उसने इसे 0 लौटने के साथ हल किया जो एनएसएलओजी से वापस लौटाया गया है यदि पहले कोई खरीदी नहीं है। – MasterRazer

0

आप पुनर्स्थापना लेनदेन के लिए निम्नलिखित प्रतिनिधि विधि का उपयोग कर सकते हैं।

-(void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error{ 
NSLog(@"Error when purchasing: %@",error); 

} 
+0

कि प्रतिनिधि को केवल तभी बुलाया जाता है जब पुनर्स्थापना रद्द कर दी गई हो या इंटरनेट कनेक्शन त्रुटि हो। मैं चाहता हूं कि उपयोगकर्ता ने पहले कोई खरीदारी नहीं की है और समस्या है। प्रश्न की टिप्पणियों पर नज़र डालें। एक मूल्य लौटने के साथ एक solutin है लेकिन मुझे नहीं पता कि कैसे। – MasterRazer

6

नूह:

-(void)restore { 

    [self.delegate showLoadingScreen]; 
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; 


} 

और निम्न विधि:

-(void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue { 

    if (!queue.transactions || [queue.transactions count] == 0) { 

     [self showAlertScreenWithTitle:@"Error Restoring Subscription" message:@"No subscription was found to restore."]; 

    } else { 

     BOOL didRestore = NO; 

     for (SKPaymentTransaction *t in queue.transactions) { 

      if (t.transactionState == SKPaymentTransactionStateRestored || t.transactionState == SKPaymentTransactionStatePurchased) { 

       NSTimeInterval now = [[NSDate date] timeIntervalSince1970] - _timeOffset; 
       NSTimeInterval expire = [t.transactionDate timeIntervalSince1970] + kExplorerSubscriptionSecondLength; 
       NSTimeInterval purchase = [t.transactionDate timeIntervalSince1970]; 

       if (purchase <= now && now <= expire) { 

        didRestore = YES; 
       } 

      } 


     } 

     if (!didRestore) 
      [self showAlertScreenWithTitle:@"Error Restoring Subscription" message:@"No subscription was found to restore."]; 

    }  

    [self.delegate dismissLoadingScreen]; 

} 

मुझे पता है कि अगर आप में मदद करता है चलो ....

+0

आपके awnser के लिए धन्यवाद। अब यह जांच लेंगे कि – MasterRazer

+0

thx, हल हो गया है ... इस पंक्ति के साथ: डी (! Queue.transactions || [queue.transactions count] == ​​0) – MasterRazer

+0

मुझे अभी भी पता चला कि मुझे और कथन की आवश्यकता है। लेकिन मुझे अब याद है कि किस स्थिति में ... यदि किसी उपयोगकर्ता की सदस्यता समाप्त हो गई है, और आप पुनर्स्थापित करने का प्रयास करते हैं, तो यह अभी भी उपयोगकर्ता द्वारा सब्सक्राइब किए गए प्रत्येक महीने के लिए पिछली खरीदारी वापस कर देगा। यही कारण है कि मैं समय अवधि की जांच करता हूं। यदि "अब" किसी भी समय अवधि में नहीं आता है, तो कुछ भी बहाल नहीं किया गया था। यह आपकी स्थिति पर लागू नहीं हो सकता है –