2014-07-21 10 views
14

Próbuję znaleźć najlepszy sposób, aby upewnić się, że użytkownik nie straci materiałów eksploatacyjnych podczas zakupu aplikacji.Synchronizowanie zakupu materiałów eksploatacyjnych w aplikacji z serwerem

Jednak zaczynam czuć się jak this StackOverflow user.

Po zakończeniu transakcji chcę wysłać na serwer, że użytkownik kupił materiał eksploatacyjny w aplikacji. Jednak połączenie może zakończyć się niepowodzeniem (serwer nie działa lub użytkownik utraci połączenie).

Rozważałem w tym scenariuszu wysłanie paragonu, gdy tylko połączenie może zostać nawiązane ponownie. Jednak z tego, co I have read the receipt contains all in app purchases i nie możemy wysłać tylko paragonu za ostatni zakupiony przedmiot.

Jak mogę upewnić się, że zakup dokonany przez użytkownika został zsynchronizowany z serwerem?

Odpowiedz

13

Rozwiązaniem jest nie wywołać

[[SKPaymentQueue defaultQueue] finishTransaction:transaction];

na zakup materiałów eksploatacyjnych, dopóki nie zostanie zsynchronizowane z serwerem. W ten sposób transakcja zostanie dostarczona ponownie Twojemu obserwatorowi za każdym razem, gdy zostanie ustawiona obserwacja kolejki płatności. Będziesz potrzebował zarządzać stroną aplikacji, niezależnie od tego, czy chodzi o zakupiony, ale nie zsynchronizowany zakup, czy o nowy zakup.

Po zsynchronizowaniu transakcji z serwerem. Możesz zadzwonić pod numer -finishTransaction:. Patrz „Kończenie transakcji” tu docs:

https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/DeliverProduct.html#//apple_ref/doc/uid/TP40008267-CH5-SW3

EDIT

więc użytkownik jest pobierana przez Apple, a Apple wysłanie SKPaymentTransaction obiekt reprezentujący transakcję. Jeśli właściwość transactionState tej transakcji to SKPaymentTransactionStatePurchased, oznacza to, że Apple przetworzyło płatność, a użytkownik został obciążony.

Po otrzymaniu tego obiektu SKPaymentTransaction z pola paymentQueue dostarczasz zawartość użytkownikowi i synchronizujesz transakcję z serwerem. Po pomyślnym ukończeniu obu tych połączeń zadzwonisz pod numer -finishTransaction. Wywołanie -finishTransaction mówi StoreKit, że udało Ci się ukończyć wszystko, co musisz zrobić. -finishTransaction to połączenie synchroniczne , przekazujesz odpowiedzialność z powrotem do StoreKit, i nie musisz się martwić o to, jak jest to przekazywane do iTunes/Apple, StoreKit obsługuje to wszystko dla ciebie.

Nie powinieneś dzwonić pod numer -finishTransaction, dopóki nie zrobisz wszystkiego, co musisz. Jeśli coś pójdzie nie tak (bateria urządzenia zginie, utrata połączenia z Internetem, awaria aplikacji), otrzymasz ten sam SKPaymentTransaction z kolejki płatności, gdy następnym razem twój obserwator zostanie zarejestrowany w kolejce, i spróbujesz ponownie zsynchronizować się z serwerem. To się stanie, dopóki nie zadzwonisz pod numer -finishTransaction.

Istnieje scenariusz, w którym użytkownik nigdy nie jest w stanie zsynchronizować się z serwerem, nigdy nie łączy się z Internetem ponownie itp. Jest to poza kontrolą użytkownika iw tym momencie obowiązkiem Apple jest podjęcie decyzji, czy nalicza opłatę za użytkownik.

Warto również zauważyć, że użytkownik może skontaktować się z firmą Apple i zażądać zwrotu pieniędzy, jeśli chce.

+0

Jeśli nie wezwę transakcji końcowej, użytkownik straci swoje pieniądze lub straci tylko po zakończeniu transakcji? Ponadto, jak mogę obsługiwać przypadki, w których serwer był zsynchronizowany, mam zamiar zakończyć transakcję, ale w jakiś sposób połączenie itunes nie otrzyma operacji zakończenia transakcji? –

+0

Proszę zobaczyć moją aktualizację –

+0

Jestem całkowicie sprzedany. Dziękuję bardzo za wspaniałą odpowiedź. Jedyną rzeczą, która nie jest perfekcyjna, jest to, że wiesz, że SKPaymentTransaction odpowiada pewnemu modelowi, który posiadasz (aby zsynchronizować się z serwerem). Ale ta odpowiedź jest już wystarczająco dobra :) –

Powiązane problemy