Pytanie Nie można zakończyć niedokończonych transakcji w kolejce płatności


Moja aplikacja przeszła do pewnego dziwnego stanu w piaskownicy IAP ... Za każdym razem, gdy uruchamiam aplikację, pyta o hasło konkretnego użytkownika testowego. Chyba ze względu na niedokończoną transakcję. Naprawdę chcę zakończyć tę transakcję, ale nie jest to możliwe. Niektóre informacje dodatkowe i to, co dla nich zrobiłem:

  • Usunąłem tego użytkownika testowego z itunesconnect
  • Zaraz po uruchomieniu aplikacji wzywam [[SKPaymentQueue defaultQueue] addTransactionObserver:self]
  • Powiadomienie o aktualizacji kolejki płatności nie jest odbierane po wprowadzeniu hasła dla danego użytkownika testowego lub anulowaniu
  • [SKPaymentQueue defaultQueue].transactions.count jest zawsze 0, więc nie mogę ręcznie zakończyć niedokończonych transakcji
  • Usunąłem aplikację z urządzenia, zrestartowałem urządzenie - wciąż pytam o hasło
  • Wylogowuję się z użytkownika z Ustawień -> iTunes i App Store
  • Po tym jak anuluję okno dialogowe z prośbą o podanie hasła, jestem w stanie zalogować się z innym użytkownikiem testowym, ale następnym razem otrzymuję okno dialogowe na hasło starego użytkownika testowego.

Pozostaje tylko zmienić identyfikator pakunku, co nie jest pożądane w moim przypadku. Mam nadzieję, że ktoś zna alternatywne sposoby na pozbycie się niedokończonej transakcji.


11
2018-04-12 09:12


pochodzenie


Wydaje się, że jest to rzadki problem z "niekończącą się pętlą" z piaskownicą. - Pablo
Czy masz drugie urządzenie do wypróbowania tego? Czy próbowałeś już czystego w Xcode? Czy możesz spróbować ponownie zainstalować urządzenie iOS lub przywrócić iTunes z kopii zapasowej przed tym problemem? Czy dzieje się to w trybie samolotowym? - Chris Prince
niestety nie ma innego urządzenia. Tak, próbowałem wyczyścić Xcode. Nie mogę w tej chwili przywrócić i nie dzieje się to w trybie samolotowym. Planuję kontaktowanie się z jabłkiem, aby oczyścić tę nieskończoną pętlę - Pablo
@ Pablo Czy znalazłeś jakieś rozwiązanie dla tego ...? Becoz teraz cierpię również z tym samym problemem i zrobiłem wszystko, co zrobiłeś powyżej, ale bez powodzenia. - Dinesh Reddy Chennuru
zmieniono na inny identyfikator pakietu dla mojej aplikacji. Apple obiecał odpowiedzieć, ale nigdy nie dał żadnej odpowiedzi. - Pablo


Odpowiedzi:


Umieszczam to tutaj, ponieważ istnieje wiele naprawdę złych, złych odpowiedzi, które dostarczają NIEPRAWIDŁOWE informacje, jak rozwiązać ten problem. To nie jest rzadkie, tajemnicze czy też robak Apple, jest częścią projektu sklepu App Store, który pomoże ci zbudować właściwy IAP.

NIE RÓB:

  • Nigdy, przenigdy nie usuwaj użytkownika testu piaskownicy. To sprawia, że ​​niemożliwe jest rozwiązanie problemu, a ty będziesz w tym nieskończona pętla do piekła, aż transakcja ostatecznie zniknie ... odejdzie, ale zajmuje dużo czasu, jak dni lub tygodnie.
  • Jeśli usuniesz użytkownika testu piaskownicy, gdy będziesz później wielokrotnie monitowany (jak KAŻDA CZAS Twoja aplikacja konfiguruje IAP), aby zalogować się do konta sklepu użytkownika testowego, aby koniec transakcji, nie możesz, ponieważ użytkownik został usunięty. Nie będziesz też w stanie dodać użytkownika testowego z powrotem, ponieważ portal dewelopera powie, że identyfikator użytkownika ma już zostały użyte.
  • Nie rób: usuń aplikację lub ponownie zainstaluj iOS lub jakikolwiek inny taki BS. Nie działa, nie rozwiązuje problemu i marnuje dużo czasu.

ZROBIĆ:

  • Połączenie KONIEC na WSZYSTKICH transakcjach. Jeśli z jakiegoś powodu zostanie przerwany, po prostu zakończ w kolejnym uruchomieniu aplikacji. Aplikacja będzie wielokrotnie wysyłać powiadomienie o oczekującej kolejce, dopóki nie zadzwonisz do mety, dając ci możliwość zadzwonienia [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; Jest to celowe działanie i wstępna ostrożność przeciwko przerwanym transakcjom.

To jest to! Zakończ wszystkie transakcje, w przeciwnym razie zostaniesz wysłany do piekła Endless Loop z wielokrotnymi prośbami o zalogowanie się na nieistniejące konto użytkownika App Store test za każdym razem, gdy aplikacja uruchomi się na tym urządzeniu :(


9
2018-06-11 09:51



Szkoda, że ​​nie przeczytałem tutaj twojego komentarza przed usunięciem mojego użytkownika z piaskownicy ;-) - Peter Grundner
Mwahahahah. Ja, właśnie tego próbowałem ostrzec ludzi. Jeśli to zrobisz ... bardzo zły joujou. - Cliff Ribaudo
Ale problem polega na tym, że nawet jeśli zadzwonię do mety przy WSZYSTKICH transakcjach, jest ona długo przechowywana w kolejce transakcji. - KarenAnne
? Nie śledzić. Jeśli skończysz, powinno to zostać usunięte. Jeśli wciąż otrzymujesz powiadomienia, nie zakończyłeś wszystkich transakcji. - Cliff Ribaudo
Myślę, że powinieneś wspomnieć, że powinieneś zakończyć transakcje NIE przez czekanie w wywołaniu zwrotnym, ale zamiast tego przez wyliczanie transakcji bezpośrednio w kolejce. To jedyny sposób, w jaki to zadziałało. - TalL


Być może będziesz musiał powtórzyć te kroki kilka razy, aby zadziałał. Zakończ transakcję, gdy zostanie wywołana metoda delegowania obserwatora transakcji.

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{    
    for (SKPaymentTransaction *transaction in transactions) {

        // Temporary code to solve the loop issue
        [[SKPaymentQueue defaultQueue] finishTransaction:transaction];

        /*
        switch (transaction.transactionState) {
        // Call the appropriate custom method.
        case SKPaymentTransactionStatePurchased:
            [self completeTransaction:transaction];
            break;
        case SKPaymentTransactionStateFailed:
            [self failedTransaction:transaction];
            break;
        case SKPaymentTransactionStateRestored:
        default:
            break;
        }
        */
    }
}

Teraz uruchom aplikację i zaloguj się przy użyciu usuniętego konta sandbox. Powyższa metoda powinna natychmiast rozpocząć i zakończyć transakcję. Jeśli tablica transakcji jest zerowa, spróbuj wywołać kod zakończenia przed pętlą FOR.


0
2017-10-28 10:58





Zrobiłem to do pracy ponownie, wywołując następujący kod do wykonania jeden raz. Możesz zostać poproszony o wpisanie hasła po raz ostatni, ale po wykonaniu kodu, "egzorcyzm" zostanie wykonany i możesz go ponownie usunąć.

#ifdef DEBUG
    for (SKPaymentTransaction *transaction in [[SKPaymentQueue defaultQueue] transactions]) {
        NSLog(@"finish transactions pending sind last load...");
        [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
    }
#endif

0
2018-06-29 11:03