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.
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? –
Proszę zobaczyć moją aktualizację –
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 :) –