2012-04-03 11 views
15

Mam na myśli, czy moje kroki powinny być?Kiedy powinienem potwierdzić przyjęcie transakcji zakupu aplikacji?

1) Get SKPaymentTransactionStatePurchased

2) usunąć go z SKPaymentQueue i dostarczają treści przez [[SKPaymentQueue defaultQueue] finishTransaction: transaction];

3) zatwierdzić odbiór i następnie, jeśli jest to nieważne, blokują treść właśnie podałem

Czy powinienem zamiast tego zmienić drugi krok na trzeci?

1) Get SKPaymentTransactionStatePurchased

2) zatwierdzić odbiór i następnie, jeśli jest to nieważne, dont't dostarczać zawartość

3) usunąć go z SKPaymentQueue zresztą [[SKPaymentQueue defaultQueue] finishTransaction: transaction];

W pierwszym scenariuszu użytkownika może wyłączyć internet tuż po zakupie, więc nie będę mógł potwierdzić odbioru. Ale w drugim przypadku mogą wystąpić pewne problemy z Internetem między etapem 1 i 2, więc nie zakończę transakcji i nie dostarczę treści, co byłoby złym doświadczeniem użytkownika.

W jaki sposób wybrano aplikację i dlaczego?

mój wybór

Mam wybrane drugim scenariuszu, ponieważ wybierając pierwszy sprawia, że ​​moja aplikacja zostać łatwo złamane przez IAP Cracker.

+0

Jestem również ciekawy w odpowiedzi na to. Obecnie robię twoje pierwsze podejście, ponieważ jest to lepsze doświadczenie dla użytkownika i nadal jest trudne do nadużywania (wciąż próbuję potwierdzić paragon w tle). –

+0

Postanowiłem też wybrać tę dla mojej aplikacji. –

+0

Czy decydujesz czy pobrać zawartość (ważny paragon) lub nie (nieprawidłowe potwierdzenie) z poziomu kodu aplikacji? Jeśli tak, jedyną potrzebą jest zmiana "if (valid)" na "if (1)". Zobacz moją odpowiedź. –

Odpowiedz

9

Scenariusz 2. Jeśli internet się wysadzi, nie dostaniesz -finishTransaction. Ale to jest świetne, bo możesz spróbować ponownie (NSTimer), a twoja aplikacja otrzyma nieukończoną transakcję przy uruchomieniu. I to jest dokładnie sposób, w jaki StoreKit został zaprojektowany do pracy (nawet jeśli nie jest to oczywiste po przeczytaniu dokumentów).

StoreKit zawiera transakcje, bez ważnego powodu. Użytkownik może po prostu wyjść z aplikacji zaraz po zakupie i nadal musisz się z tego odzyskać. I dlatego firma Apple zaleca ustawienie obserwatora transakcji tak szybko, jak to możliwe w cyklu życia aplikacji.

Nigdy nie kończ transakcji przed dostarczeniem treści, musisz wdrożyć własny system transakcyjny na StoreKit, a nie chcesz tego zrobić, uwierz mi (widziałem to już zrobione , to była katastrofa).

Edycja: szczerze mówiąc, ostatecznie użytkownik wyłączający internet po zakupie, a przed zatwierdzeniem jest absurdalnie niski.Facet był w internecie sekundę temu, nikt nie po prostu wyszedł, żeby przeciąć internet w trakcie zakupu. Ale możliwe jest, że użytkownik zostanie przerwany w tej chwili i wysłać aplikację na drugi plan. Twoja aplikacja może zostać zabita z dowolnego powodu, który iOS uzna za stosowny. A gdy aplikacje zaczynają się od nowa, Twoja aplikacja nie będzie pamiętać o zakupie, a zestaw do przechowywania nie będzie bardzo pomocny, ponieważ już zakończyłeś transakcję.

+0

Tak, przechodzę do tego scenariusza, gdy zobaczyłem, że moja aplikacja może zostać łatwo złamana przez iAP-a. I, tak, cof oczywiście dodaję obserwatora do didFinishLaunching) Dziękuję za odpowiedź! –

1

Najpierw zweryfikuję. Trwa 2-3 sekundy. W tym celu można użyć ReceiptKit https://github.com/maciekish/ReceiptKit.

+1

W jaki sposób program ReceiptKit pomaga sprawdzać poprawność rachunku bez sprawdzania poprawności w środowisku kontrolowanego serwera? Wydaje się dość łatwe do zhakowania, prawda? –

3

To co mam zrobić:

  1. App wysyła żądanie treści z załączonym otrzymania.

  2. Serwer sprawdza potwierdzenie odbioru w iTunes, a jeśli jest prawidłowy, zwraca kupioną zawartość jako treść odpowiedzi do pierwotnego żądania.

W ten sposób, nawet jeśli plik binarny aplikacji jest zhakowany/zmodyfikowany, zawartość jest pobierana tylko na podstawie prawidłowego potwierdzenia.