2011-04-26 13 views
8

मैं इन-ऐप खरीद के लिए स्टोरकिट का उपयोग कर रहा हूं। मुझे लगता है कि जब उपयोगकर्ता "रद्द करें" बटन दबाता है तो एपीआई अपने व्यवहार में क्विर्की है।हैंडल रद्द आईएपी लेनदेन

उदाहरण के लिए, यदि मैं "आपकी ऐप खरीद की पुष्टि करें" स्क्रीन पर रद्द करें दबाता हूं, तो मुझे लेनदेन error.code == SKErrorPaymentCancelled के साथ लेनदेन मिलता है जैसा कि मैं अपेक्षा करता हूं।

लेकिन मैं खरीदें धक्का और फिर अगर प्रेस रद्द करें, मैं error.code == 0 के साथ एक Failed लेनदेन मिलता है। error.localizedDescription "आईट्यून्स स्टोर से कनेक्ट नहीं हो सकता है" जो स्पष्ट रूप से झूठ है।

यह अनदेखा करने योग्य रद्दीकरण के रूप में सभी Failed लेनदेन का इलाज अच्छा लगता है, लेकिन मैं यह भी स्पष्ट रूप से देख सकते हैं कि अगर डिवाइस हवाई जहाज़ मोड में ऑफ़लाइन है, मेरे पास कोई चेतावनी पॉपअप के साथ एक Failed लेन-देन प्राप्त होता है; मुझे वास्तव में उस मामले में समस्या की व्याख्या करने के लिए उपयोगकर्ता को सूचित करना चाहिए।

मुझे लगता है कि MKStoreKit मानता है कि सभी विफलताओं रद्दीकरण हैं। MKStoreManager की failedTransaction विधि कभी नहीं कहा जाता है; MKStoreObserver सभी Failed लेनदेन के लिए हमेशा transactionCanceled पर कॉल करता है। MKStoreManager.hrecommend no error messagetransactionCanceled के लिए टिप्पणियां, जो समझ में आता है, लेकिन फिर उपयोगकर्ता को Failed गैर-रद्द लेनदेन के बारे में सूचित करेगा?

इन विफलताओं को संभालने के लिए सबसे अच्छा अभ्यास क्या है? क्या मुझे त्रुटियों को निगलना चाहिए? हमेशा एक त्रुटि दिखाएं, भले ही यह अनावश्यक है?

उत्तर

11

हम जाहिरा तौर पर यह सबसे अच्छा आप क्या कर सकते हैं

code != SKErrorPaymentCancelled && code != SKErrorPaymentNotAllowed 

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

3

पिछला उत्तर बहुत करीब है। MKStoreKit स्वचालित त्रुटि शर्तों जैसे माता-पिता नियंत्रण चालू होने के लिए स्वचालित रूप से त्रुटि संदेश दिखा सकता है और ऐसा ही।

इसके बावजूद, खरीद रद्दीकरण को संभालने के लिए, मैंने एक प्रतिनिधि (v3.5 से शुरू) भी प्रदान किया है जिसे एमकेस्टोरकिट डीलेगेट में लेनदेन कहा जाता है।

कि संभाल कर रखें और किसी भी गतिविधि स्पिनरों को रोकने या खरीद कॉल करता है कि दृश्य नियंत्रक पर HUD प्रगति ...

+2

एमकेस्टोरकिट 3.5 असफलताओं और रद्दीकरण के बीच अंतर नहीं करता है। मैंने github https://github.com/MugunthKumar/MKStoreKit/issues/3 पर एक समस्या लॉग कर दी है और मैंने इसे अपने कांटा में ठीक कर दिया है। –

+0

धन्यवाद! मैंने आपके पुल अनुरोध को विलय कर दिया है – Mugunth

+0

अब मेरा पुल अनुरोध विलय हो गया है, नवीनतम एमकेस्टोरकिट स्वचालित रूप से विफलताओं पर एक त्रुटि दिखाता है, फिर लेनदेन को कॉल करता है प्रतिनिधि पर रद्द किया जाता है ताकि उपयोगकर्ता स्पिनर को छुपा सकें। –

-1

फिर भी एक एक मुद्दे ... है यह एक और चेतावनी दिखाएगा खरीदें बटन पर क्लिक करने के बाद और खाता जानकारी के बारे में पूछें।

अगर मैं वहाँ तो रद्द था कि यह होगा मामला SKErrorUnknown में चला जाता है: तो मैं नहीं कर सकते इस की तरह "संदेश दिखाते आपकी खरीदारी पूर्ण नहीं किया जा सकता है अपनी नेटवर्क सेटिंग जांचें और बाद में पुन: प्रयास करें।।"

- (void) failedTransaction: (SKPaymentTransaction *)transaction 
{ 
    switch (transaction.error.code) { 
     case SKErrorUnknown: 
      NSLog(@"SKErrorUnknown"); 
      break; 
     case SKErrorClientInvalid: 
      NSLog(@"SKErrorClientInvalid"); 
      break; 
     case SKErrorPaymentCancelled: 
      NSLog(@"SKErrorPaymentCancelled"); 
     break; 
     case SKErrorPaymentInvalid: 
      NSLog(@"SKErrorPaymentInvalid"); 
      break; 
     case SKErrorPaymentNotAllowed: 
      NSLog(@"SKErrorPaymentNotAllowed"); 
     break; 
     default: 
      NSLog(@"No Match Found for error"); 
      break; 
    } 
    NSLog(@"transaction.error.code %@",[transaction.error description]); 
    if (transaction.error.code == SKErrorPaymentCancelled) { 
     [[MKStoreManager sharedManager] transactionCanceled:transaction]; 
    } else { 
     [[MKStoreManager sharedManager] failedTransaction:transaction]; 
    } 
    [[SKPaymentQueue defaultQueue] finishTransaction: transaction]; 
} 
0

मैं बस को जोड़ने के लिए है कि कोई इंटरनेट कनेक्शन के कारण त्रुटियों ज्यादातर एप्पल के गम्यता वर्ग IMO उपयोग कर किसी भी लेन-देन करने से पहले पकड़ा जाना चाहिए चाहता था। इस तरह आपको सीधे आगे और सामान्य प्रकार की त्रुटि के लिए ऐप्पल के एपीआई पर भरोसा करने की आवश्यकता नहीं है।

0

मुझे लगता है कि यह आपकी ज़िम्मेदारी और निर्णय है कि रद्द लेनदेन के लिए अलर्ट कहां दिखाएं या नहीं। लेकिन आपको निश्चित रूप से इसे खत्म करना चाहिए, अन्यथा यह हर समय असफल हो जाएगा। तो कुछ इस तरह होना चाहिए:

if (transaction.error.code == SKErrorPaymentCancelled) { 
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 
} else { 
    [self notifyError:transaction.error]; 
} 

अद्यतन: The Business of iPhone App Development: Making and Marketing Apps that Succeed के कारण हम विफल राज्य के लिए किसी भी अद्यतन के बाद लेन-देन समाप्त करना चाहिए। यह जानना दिलचस्प होगा कि क्या ऐसी स्थितियां हैं जब हमें नहीं करना चाहिए।

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