Udostępnij za pomocą


Zmiany w zestawie StoreKit w systemie iOS 6

System iOS 6 wprowadził dwie zmiany w interfejsie API zestawu Store: możliwość wyświetlania produktów iTunes (i App Store/iBookstore) z poziomu aplikacji oraz nowej opcji zakupu w aplikacji, w której firma Apple będzie hostować pliki do pobrania. W tym dokumencie wyjaśniono, jak zaimplementować te funkcje za pomocą platformy Xamarin.iOS.

Główne zmiany w zestawie Store Kit w systemie iOS6 to dwie nowe funkcje:

  • Wyświetlanie i kupowanie zawartości w aplikacji — użytkownicy mogą kupować i pobierać aplikacje, muzykę, książki i inne treści iTunes bez opuszczania aplikacji. Możesz również połączyć się z własnymi aplikacjami, aby promować zakup lub po prostu zachęcić opinie i oceny.
  • Hostowana zawartość zakupu w aplikacji — firma Apple będzie przechowywać i dostarczać zawartość skojarzona z produktami zakupu w aplikacji, co eliminuje potrzebę hostowania plików przez oddzielny serwer, automatycznie obsługuje pobieranie w tle i umożliwia pisanie mniejszej ilości kodu.

Szczegółowe informacje na temat interfejsów API StoreKit można znaleźć w przewodnikach dotyczących zakupów w aplikacji.

Wymagania

Funkcje zestawu Store Kit omówione w tym dokumencie wymagają systemów iOS 6 i Xcode 4.5 wraz z platformą Xamarin.iOS 6.0.

Wyświetlanie i kupowanie zawartości w aplikacji

Nowa funkcja zakupów w aplikacji w systemie iOS umożliwia użytkownikom wyświetlanie informacji o produkcie i kupowanie lub pobieranie produktu z poziomu aplikacji. Wcześniej aplikacje musiałyby wyzwolić program iTunes, sklep App Store lub iBookstore, co spowodowałoby pozostawienie oryginalnej aplikacji przez użytkownika. Ta nowa funkcja automatycznie zwraca użytkownika do aplikacji po zakończeniu.

Automatyczne powrót do aplikacji po zakupie

Przykłady tego, jak można to użyć, to:

  • Zachęcanie użytkowników do oceniania aplikacji — możesz otworzyć stronę sklepu App Store, aby użytkownik mógł oceniać i przeglądać aplikację bez opuszczania jej.
  • Aplikacje z promowaniem krzyżowym — umożliwia użytkownikowi wyświetlanie innych publikowanych aplikacji z możliwością natychmiastowego kupowania/pobierania.
  • Ułatwianie użytkownikom znajdowania i pobierania zawartości — pomaga użytkownikom kupować zawartość, którą aplikacja znajduje, zarządza lub agreguje (np. aplikacja związana z muzyką może udostępnić listę odtwarzania piosenek i zezwolić na zakup każdej piosenki w aplikacji).

Po wyświetleniu elementu SKStoreProductViewController użytkownik może wchodzić w interakcje z informacjami o produkcie tak, jakby znajdowały się w programie iTunes, sklepie App Store lub sklepie iBookStore. Użytkownik może:

  • Wyświetlanie zrzutów ekranu (w przypadku aplikacji)
  • Przykładowe utwory lub wideo (dla muzyki, programów telewizyjnych i filmów),
  • Odczytywanie (i zapisywanie) recenzji,
  • Zakup i pobieranie, które odbywa się w całości w obrębie kontrolera widoku i zestawu Store Kit.

Niektóre opcje w ramach SKStoreProductViewController programu nadal wymuszają pozostawienie aplikacji przez użytkownika i otwarcie odpowiedniej aplikacji ze sklepu, na przykład kliknięcie linku Powiązane produkty lub link pomocy technicznej aplikacji.

SKStoreProductViewController

Interfejs API do wyświetlania produktu w dowolnej aplikacji jest prosty: wymaga tylko utworzenia i wyświetlenia elementu SKStoreProductViewController. Wykonaj następujące kroki, aby utworzyć i pokazać produkt:

  1. StoreProductParameters Utwórz obiekt w celu przekazania parametrów do kontrolera widoku, w tym productId obiektu w konstruktorze.
  2. Utwórz wystąpienie elementu SKProductViewController. Przypisz je do pola poziomu klasy.
  3. Przypisz procedurę obsługi do zdarzenia kontrolera Finished widoku, które powinno odrzucić kontroler widoku. To zdarzenie jest wywoływane, gdy użytkownik naciska przycisk anuluje; lub w inny sposób finalizuje transakcję wewnątrz kontrolera widoku.
  4. Wywołaj metodę przekazującą LoadProduct instrukcję StoreProductParameters i procedurę obsługi uzupełniania. Procedura obsługi ukończenia powinna sprawdzić, czy żądanie produktu zostało pomyślnie przedstawione, a jeśli tak, przedstawiono SKProductViewController modalnie. Należy dodać odpowiednią obsługę błędów w przypadku, gdy nie można pobrać produktu.

Przykład

Projekt ProductView w przykładowym kodzie StoreKit dla tego artykułu implementuje metodę Buy , która akceptuje identyfikator Apple ID dowolnego produktu i wyświetla element SKStoreProductViewController. Poniższy kod wyświetla informacje o produkcie dla dowolnego identyfikatora Apple ID:

void Buy (int productId)
{
    var spp = new StoreProductParameters(productId);
    var productViewController = new SKStoreProductViewController ();
    // must set the Finished handler before displaying the view controller
    productViewController.Finished += (sender, err) => {
        // Apple's docs says to use this method to close the view controller
        this.DismissModalViewControllerAnimated (true);
    };
    productViewController.LoadProduct (spp, (ok, err) => { // ASYNC !!!
        if (ok) {
            PresentModalViewController (productViewController, true);
        } else {
            Console.WriteLine (" failed ");
            if (err != null)
                Console.WriteLine (" with error " + err);
        }
    });
}

Aplikacja wygląda jak na poniższym zrzucie ekranu podczas uruchamiania — pobieranie lub kupowanie odbywa się w całości w obrębie elementu SKStoreProductViewController:

Aplikacja wygląda następująco podczas uruchamiania

Obsługa starszych systemów operacyjnych

Przykładowa aplikacja zawiera kod pokazujący sposób otwierania sklepu App Store, iTunes lub iBookstore we wcześniejszych wersjach systemu iOS. OpenUrl Użyj metody , aby otworzyć prawidłowo spreparowany adres URL itunes.com.

Możesz zaimplementować sprawdzanie wersji, aby określić kod do uruchomienia, jak pokazano poniżej:

if (UIDevice.CurrentDevice.CheckSystemVersion (6,0)) {
    // do iOS6+ stuff, using SKStoreProductViewController as shown above
} else {
    // don't do stuff requiring iOS 6.0, use the old syntax
    // (which will take the user out of your app)
    var nsurl = new NSUrl("http://itunes.apple.com/us/app/angry-birds/id343200656?mt=8");
    UIApplication.SharedApplication.OpenUrl (nsurl);
}

Błędy

Następujący błąd wystąpi, jeśli używany identyfikator Apple ID jest nieprawidłowy, co może być mylące, ponieważ oznacza to problem z siecią lub uwierzytelnianiem pewnego rodzaju.

Error Domain=SKErrorDomain Code=5 "Cannot connect to iTunes Store"

Czytanie Objective-C dokumentacji

Deweloperzy czytający o zestawie Store Kit w portalu dla deweloperów firmy Apple zobaczą protokół — SKStoreProductViewControllerDelegate — omówiony w odniesieniu do tej nowej funkcji. Protokół delegata ma tylko jedną metodę — productViewControllerDidFinish — która została uwidoczniona jako Finished zdarzenie w środowisku SKStoreProductViewController Xamarin.iOS.

Określanie identyfikatorów Apple ID

Identyfikator Apple ID wymagany przez SKStoreProductViewController element jest liczbą (nie należy mylić z identyfikatorami pakietów, takimi jak "com.xamarin.mwc2012"). Istnieje kilka różnych sposobów znajdowania identyfikatora Apple ID dla produktów, które chcesz wyświetlić, wymienionych poniżej:

iTunesConnect

W przypadku opublikowanych aplikacji można łatwo znaleźć identyfikator Apple ID w programie iTunes Connect:

Znajdowanie identyfikatora Apple ID w programie iTunes Connect

Wyszukaj interfejs API

Firma Apple udostępnia dynamiczny interfejs API wyszukiwania, który umożliwia wykonywanie zapytań dotyczących wszystkich produktów w sklepie App Store, iTunes i iBookstore. Informacje o sposobie uzyskiwania dostępu do interfejsu API wyszukiwania można znaleźć w zasobach partnerskich firmy Apple, chociaż interfejs API jest udostępniany nikomu (nie tylko zarejestrowanych podmiotów partnerskich). Wynikowy kod JSON można przeanalizować w celu odnalezienia trackId identyfikatora Apple ID do użycia z elementem SKStoreProductViewController.

Wyniki będą również zawierać inne metadane, w tym informacje o wyświetlaniu i adresy URL kompozycji, których można użyć do renderowania produktu w aplikacji.

Oto kilka przykładów:

Kanał informacyjny partnera przedsiębiorstwa

Firma Apple udostępnia zatwierdzonych partnerów z kompletnym zrzutem danych wszystkich swoich produktów w postaci plików prostych gotowych do pobrania. Jeśli kwalifikujesz się do uzyskania dostępu do kanału informacyjnego dla partnerów przedsiębiorstwa, identyfikator Apple ID dla dowolnego produktu można znaleźć w tym zestawie danych.

Wielu użytkowników kanału informacyjnego dla partnerów przedsiębiorstwa jest członkami programu partnerskiego, który umożliwia uzyskanie prowizji na sprzedaż produktów. SKStoreProductViewController nie obsługuje identyfikatorów partnerskich (w momencie pisania).

Identyfikator Apple ID dla produktu można wywnioskować z linku adresu URL podglądu iTunes. W dowolnych linkach produktów iTunes (w przypadku aplikacji, muzyki lub książek) znajdź część adresu URL rozpoczynającą się od id i użyj poniższego numeru.

Na przykład bezpośredni link do elementów iBooks to

http://itunes.apple.com/us/app/ibooks/id364709193?mt=8

identyfikator Apple ID jest 364709193. Podobnie w przypadku aplikacji MWC2012 link bezpośredni to

http://itunes.apple.com/us/app/mwc-2012-unofficial/id496963922?mt=8

identyfikator Apple ID jest 496963922.

Kupowanie hostowanej zawartości w aplikacji

Jeśli zakupy w aplikacji składają się z zawartości do pobrania (np. książek lub innych multimediów, sztuki i konfiguracji na poziomie gry lub innych dużych plików), te pliki były hostowane na serwerze internetowym, a aplikacje musiały zawierać kod, aby bezpiecznie je pobrać po zakupie. Począwszy od systemu iOS 6, firma Apple będzie hostować pliki na swoich serwerach, usuwając potrzebę oddzielnego serwera. Ta funkcja jest dostępna tylko w przypadku produktów nieużywanych (nieużywanych lub subskrypcji). Zalety korzystania z usługi hostingowej firmy Apple obejmują:

  • Oszczędzaj koszty hostingu i przepustowości.
  • Prawdopodobnie bardziej skalowalny niż jakikolwiek host serwera, którego obecnie używasz.
  • Mniej kodu do zapisania, ponieważ nie trzeba tworzyć żadnego przetwarzania po stronie serwera.
  • Pobieranie w tle jest implementowane.

Uwaga: testowanie zawartości zakupu hostowanej w aplikacji w symulatorze systemu iOS nie jest obsługiwane, dlatego należy przetestować rzeczywiste urządzenie.

Podstawy hostowanej zawartości

Przed systemem iOS 6 istnieją dwa sposoby udostępniania produktu (opisane bardziej szczegółowo w dokumentacji zakupu w aplikacji platformy Xamarin):

  • Wbudowane produkty — funkcje , które są "odblokowane" przez zakup, ale wbudowane w aplikację (jako kod lub zasoby osadzone). Przykłady wbudowanych produktów obejmują odblokowane filtry zdjęć lub power-upy w grze.
  • Produkty dostarczane przez serwer — po zakupie aplikacja musi pobrać zawartość z działającego serwera. Ta zawartość jest pobierana podczas zakupu, przechowywana na urządzeniu, a następnie renderowana w ramach dostarczania produktu. Przykłady obejmują książki, problemy z magazynem lub poziomy gier składające się z grafik w tle i plików konfiguracyjnych.

W systemie iOS 6 firma Apple oferuje odmianę produktów dostarczanych przez serwer: będą hostować pliki zawartości na swoich serwerach. Dzięki temu znacznie łatwiej jest tworzyć produkty dostarczane przez serwer, ponieważ nie jest wymagane do obsługi oddzielnego serwera, a zestaw Store Kit zapewnia funkcję pobierania w tle, którą wcześniej trzeba było napisać samodzielnie. Aby skorzystać z hostingu firmy Apple, włącz hosting zawartości dla nowych produktów zakupu w aplikacji i zmodyfikuj kod zestawu Store Kit, aby móc z niego korzystać. Pliki zawartości produktu są następnie kompilowane przy użyciu programu Xcode i przekazywane do serwerów firmy Apple w celu przejrzenia i wydania.

Proces kompilacji i dostarczania

Korzystanie ze sklepu App Store w celu zapewnienia zakupów w aplikacji z hostowaną zawartością wymaga następującej konfiguracji i konfiguracji:

  • iTunes Connect — musisz podać swoje informacje bankowe i podatkowe do Firmy Apple, aby mogły przekazać fundusze zebrane w Twoim imieniu. Następnie można skonfigurować produkty do sprzedaży i skonfigurować konta użytkowników piaskownicy w celu przetestowania zakupu. Musisz również skonfigurować hostowaną zawartość dla tych produktów, które nie są eksploatacyjne, które mają być hostowane przez firmę Apple.
  • Portal aprowizacji systemu iOS — tworzenie identyfikatora pakietu i włączanie dostępu do sklepu App Store dla aplikacji, tak jak w przypadku każdej aplikacji obsługującej zakupy w aplikacji.
  • Store Kit — dodawanie kodu do aplikacji w celu wyświetlania produktów, zakupów produktów i przywracania transakcji. W zestawie sklepu dla systemu iOS 6 będzie również zarządzać pobieraniem zawartości produktu w tle z aktualizacjami postępu.
  • Kod niestandardowy — śledzenie zakupów dokonanych przez klientów i dostarczanie zakupionych produktów lub usług. Skorzystaj z nowych klas zestawu sklepu dla systemu iOS 6, takich jak SKDownload pobieranie zawartości hostowanej przez firmę Apple.

W poniższych sekcjach opisano sposób implementowania hostowanej zawartości, od tworzenia i przekazywania pakietu do zarządzania procesem zakupu i pobierania przy użyciu przykładowego kodu dla tego artykułu.

Przykładowy kod

Przykładowy projekt HostedNonConsumables (w StoreKitiOS6.zip) używa hostowanej zawartości. Aplikacja oferuje dwa "rozdziały książki" na sprzedaż, zawartość, dla której jest hostowana na serwerach firmy Apple. Zawartość składa się z pliku tekstowego i obrazu, chociaż w rzeczywistej aplikacji można używać znacznie bardziej złożonej zawartości.

Aplikacja wygląda następująco wcześniej, podczas zakupu i po nim:

Aplikacja wygląda następująco wcześniej, podczas zakupu i po nim

Plik tekstowy i obraz są pobierane i kopiowane do katalogu Documents aplikacji. Aby uzyskać więcej informacji na temat różnych katalogów dostępnych dla magazynu aplikacji, zobacz dokumentację systemu plików.

iTunes Connect

Podczas tworzenia nowych produktów, które będą korzystać z hostingu zawartości firmy Apple, pamiętaj, aby wybrać typ produktu Nieużywalny . Inne typy produktów nie obsługują hostingu zawartości. Ponadto nie należy włączać hostingu zawartości dla istniejących sprzedawanych produktów; włączaj tylko hosting zawartości dla nowych produktów.

Wybierz typ produktu nieużywanego

Wprowadź identyfikator produktu. Ten identyfikator będzie wymagany później podczas tworzenia zawartości dla tego produktu.

Wprowadź identyfikator produktu

Hosting zawartości jest ustawiony w sekcji Szczegóły. Przed rozpoczęciem zakupu w aplikacji usuń zaznaczenie pola wyboru Zawartość hosta z firmą Apple , jeśli chcesz anulować (nawet jeśli przekazano zawartość testową). Nie można jednak usunąć hostingu zawartości po zakupie w aplikacji.

Hostowanie zawartości za pomocą firmy Apple

Po włączeniu zawartości hostingu produkt wprowadzi stan Oczekiwania na przekazanie i wyświetli następujący komunikat:

Produkt wprowadzi stan oczekiwania na przekazanie i wyświetli ten komunikat

Pakiet zawartości powinien zostać utworzony za pomocą programu Xcode i przekazany przy użyciu narzędzia Archiwum. Instrukcje dotyczące tworzenia pakietów zawartości są podane w następnej sekcji Tworzenie . Pliki PKG.

Tworzenie. Pliki PKG

Pliki zawartości przekazywane do firmy Apple muszą spełniać następujące ograniczenia:

  • Nie można przekroczyć 2 GB rozmiaru.
  • Nie można zawierać kodu wykonywalnego (lub symlinków wskazujących poza zawartość).
  • Musi być poprawnie sformatowany (w tym plik plist ) i mieć rozszerzenie .pkg pliku. Ta czynność zostanie wykonana automatycznie, jeśli wykonasz te instrukcje przy użyciu środowiska Xcode.

Można dodać wiele różnych plików i typów plików, o ile spełniają one te ograniczenia. Zawartość jest spakowana przed dostarczeniem do aplikacji i rozpakowana przez zestaw Store Kit przed uzyskaniem do niego dostępu.

Po przekazaniu pakietu zawartości można go zastąpić nowszą zawartością. Nowa zawartość musi zostać przekazana i przesłana do przeglądu/zatwierdzenia za pośrednictwem normalnego procesu. Zwiększ ContentVersion pole w zaktualizowanych pakietach zawartości, aby wskazać, że jest nowsza.

Projekty zawartości zakupu w aplikacji Xcode

Tworzenie pakietów zawartości dla produktów zakupionych w aplikacji wymaga obecnie środowiska Xcode. Nie jest absolutnie wymagane kodowanie OBJECTIVE-C; Program Xcode oferuje nowy typ projektu dla tych pakietów, który zawiera jedynie twoje pliki oraz plik plist.

Nasza przykładowa aplikacja zawiera rozdziały książek na sprzedaż — każdy pakiet zawartości rozdziału będzie zawierał następujące elementy:

  • plik tekstowy i
  • obraz reprezentujący rozdział.

Zacznij od wybrania pozycji > z menu i wybrania pozycji Zawartość zakupu w aplikacji:

Wybieranie zawartości zakupu w aplikacji

Wprowadź nazwę produktu i identyfikator firmy, tak aby identyfikator pakietu był zgodny z identyfikatoremproduktu wprowadzonym w programie iTunes Connect dla tego produktu.

Wprowadź nazwę i identyfikator

Teraz będziesz mieć pusty projekt Zawartości zakupu w aplikacji. Możesz kliknąć prawym przyciskiem myszy i dodać pliki... lub przeciągnąć je do Nawigatora projektu. Upewnij się, że właściwość ContentVersion jest poprawna (powinna zaczynać się od 1.0, ale jeśli później zdecydujesz się zaktualizować zawartość, pamiętaj, aby ją zwiększać).

Ten zrzut ekranu przedstawia program Xcode z plikami zawartości zawartymi w projekcie i wpisami plist widocznymi w oknie głównym:

Ten zrzut ekranu przedstawia program Xcode z plikami zawartości zawartymi w projekcie i wpisami plist widocznymi w oknie głównym

Po dodaniu wszystkich plików zawartości można zapisać ten projekt i edytować go ponownie później lub rozpocząć proces przekazywania.

Przesyłanie. Pliki PKG

Najprostszym sposobem przekazywania pakietów zawartości jest użycie narzędzia archiwum Xcode. Wybierz pozycję > produktów z menu, aby rozpocząć:

Wybierz pozycję Zarchiwizuj

Pakiet zawartości zostanie wyświetlony w archiwum, jak pokazano poniżej. Typ archiwum i ikona pokazują, że ten wiersz jest archiwum zawartości zakupów w aplikacji. Kliknij pozycję Weryfikuj... aby sprawdzić nasz pakiet zawartości pod kątem błędów bez faktycznego wykonania przekazywania.

Weryfikowanie pakietu

Zaloguj się przy użyciu poświadczeń programu iTunes Connect:

Zaloguj się przy użyciu poświadczeń programu iTunes Connect

Wybierz poprawną aplikację i zakup w aplikacji, aby skojarzyć tę zawartość z:

Wybierz poprawną aplikację i zakup w aplikacji, aby skojarzyć tę zawartość z

Powinien zostać wyświetlony komunikat podobny do tego zrzutu ekranu:

Przykład braku komunikatu o problemach

Teraz przejdź przez podobny proces, ale kliknięcie przycisku Dystrybuuj... spowoduje przekazanie zawartości.

Dystrybuowanie aplikacji

Wybierz pierwszą opcję, aby przekazać zawartość:

Przekazywanie zawartości

Zaloguj się ponownie:

Zaloguj się

Wybierz prawidłowy rekord aplikacji i zakupu w aplikacji, aby przekazać zawartość do:

Wybieranie rekordu zakupu aplikacji i aplikacji

Zaczekaj na przekazanie plików:

Okno dialogowe przekazywania zawartości

Po zakończeniu przekazywania zostanie wyświetlony komunikat informujący o przesłaniu zawartości do sklepu App Store.

Przykładowy komunikat o pomyślnym przekazaniu

Po wykonaniu tej czynności po powrocie do strony produktu w programie iTunes Connect zostaną wyświetlone szczegóły pakietu i stan Gotowe do przesłania . Gdy produkt jest w tym stanie, możesz rozpocząć testowanie w środowisku piaskownicy. Nie musisz "przesyłać" produktu do testowania w piaskownicy.

Program iTunes Connect wyświetli szczegóły pakietu i będzie w stanie Gotowe do przesłania

Może upłynąć trochę czasu (np. kilka minut) między przekazaniem archiwum a zaktualizowanym stanem programu iTunes Connect. Możesz przesłać produkt do przeglądu oddzielnie lub przesłać go w połączeniu z plikiem binarnym aplikacji. Dopiero po oficjalnym zatwierdzeniu zawartości przez firmę Apple będzie ona dostępna w produkcyjnym sklepie App Store do zakupu w aplikacji.

Format pliku PKG

Utworzenie i przekazanie hostowanego pakietu zawartości przy użyciu narzędzia Xcode i narzędzia archiwum oznacza, że zawartość samego pakietu nigdy nie jest widoczna. Pliki i katalogi w pakietach utworzonych dla przykładowej aplikacji wyglądają jak poniższy zrzut ekranu z plikiem plist w katalogu głównym i plikami produktów w podkatalogu Zawartość :

Plik plist w katalogu głównym i plikach produktu w podkatalogu Zawartość

Zwróć uwagę na strukturę katalogów pakietu (zwłaszcza lokalizację plików w Contents podkatalogu), ponieważ należy zrozumieć te informacje, aby wyodrębnić pliki z pakietu na urządzeniu.

Aktualizowanie zawartości pakietu

Procedura aktualizowania zawartości po jej zatwierdzeniu:

  • Edytuj projekt Zawartość zakupu w aplikacji w programie Xcode.
  • Podtrzymuje numer wersji.
  • Przekaż ponownie do programu iTunes Connect. Kolejni nabywcy automatycznie otrzymają najnowszą wersję, ale użytkownicy, którzy mają już starą wersję, nie otrzymają żadnego powiadomienia.
  • Aplikacja jest odpowiedzialna za powiadamianie użytkowników i zachęcanie ich do pobierania nowszej wersji zawartości. Aplikacja musi również utworzyć funkcję, która pobiera nową wersję przy użyciu funkcji Przywracania zestawu Store Kit.
  • Aby określić, czy istnieje nowsza wersja, możesz skompilować funkcję w aplikacji, aby pobrać elementy SKProducts (np. ten sam proces, który jest używany do pobierania cen produktów) i porównać właściwość ContentVersion.

Omówienie zakupów

Przed przeczytaniem tej sekcji zapoznaj się z istniejącą dokumentacją zakupu w aplikacji.

Sekwencja zdarzeń, które występują, gdy produkt z hostowaną zawartością jest kupowany i pobierany, przedstawiono na tym diagramie:

Sekwencja zdarzeń występujących po zakupie i pobraniu produktu z hostowaną zawartością

  1. Nowe produkty można tworzyć w programie iTunes Connect z włączoną zawartością hostowaną. Rzeczywista zawartość jest tworzona oddzielnie w programie Xcode (tak samo jak przeciąganie plików do folderu), a następnie zarchiwizowana i przekazana do programu iTunes (kodowanie nie jest wymagane). Każdy produkt jest następnie przesyłany do zatwierdzenia, po czym staje się dostępny do zakupu. W przykładowym kodzie te identyfikatory produktów są zakodowane na stałe, ale hostowanie zawartości z firmą Apple jest bardziej elastyczne, jeśli przechowujesz dostępną listę produktów na serwerze zdalnym, aby można było go zaktualizować podczas przesyłania nowych produktów i zawartości do programu iTunes Connect.
  2. Gdy użytkownik kupuje produkt, transakcja jest umieszczana w kolejce płatności na potrzeby przetwarzania.
  3. Store Kit przekazuje żądanie zakupu do serwerów iTunes na potrzeby przetwarzania.
  4. Transakcja jest zakończona na serwerach iTunes (np. opłata za klienta), a potwierdzenie jest zwracane do aplikacji, wraz z dołączonymi informacjami o produkcie zawierającymi informacje o tym, czy można je pobrać (a jeśli tak, rozmiar pliku i inne metadane).
  5. Kod powinien sprawdzić, czy produkt można pobrać, a jeśli tak, utwórz żądanie pobierania zawartości, które również znajduje się w kolejce płatności. Store Kit wysyła to żądanie do serwerów iTunes.
  6. Serwer zwraca plik zawartości do zestawu Store Kit, który zapewnia wywołanie zwrotne w celu zwrócenia postępu pobierania i czasu pozostałych szacunków do kodu.
  7. Po zakończeniu otrzymasz powiadomienie i przekażesz lokalizację pliku w folderze Pamięci podręcznej.
  8. Kod powinien skopiować pliki i je zweryfikować, zapisać dowolny stan, który należy pamiętać, że produkt został zakupiony. Skorzystaj z tej okazji, aby poprawnie ustawić flagę tworzenia kopii zapasowej na nowych plikach (wskazówka: jeśli pochodzą one z serwera i nigdy nie są edytowane przez użytkownika, prawdopodobnie należy pominąć ich tworzenie kopii zapasowej, ponieważ użytkownik zawsze może pobrać je z serwerów firmy Apple w przyszłości).
  9. Wywołaj metodę FinishTransaction. Ten krok jest ważny, ponieważ usuwa transakcję z kolejki płatności. Ważne jest również, aby nie wywoływać funkcji FinishTransaction do momentu skopiowania zawartości z katalogu Cache. Po wywołaniu metody FinishTransaction buforowane pliki prawdopodobnie zostaną szybko przeczyszczone.

Implementowanie zakupu hostowanej zawartości

Poniższe informacje powinny być odczytywane w połączeniu z pełną dokumentacją zakupów w aplikacji. Informacje przedstawione w tym dokumencie koncentrują się na różnicach między hostowaną zawartością a poprzednią implementacją.

Klasy

Dodano lub zmieniono następujące klasy w celu obsługi hostowanej zawartości w systemie iOS 6:

  • SKDownload — nowa klasa reprezentująca trwa pobieranie. Interfejs API umożliwia korzystanie z więcej niż jednego produktu, jednak początkowo zaimplementowano tylko jeden.
  • SKProduct — dodano nowe właściwości: Downloadable, ContentVersion, ContentLengths tablica.
  • SKPaymentTransaction — dodano nową właściwość: Downloads, która zawiera kolekcję SKDownload obiektów, jeśli ten produkt ma hostowaną zawartość dostępną do pobrania.
  • SKPaymentQueue — dodano nową metodę: StartDownloads. Wywołaj tę metodę za pomocą SKDownload obiektów, aby pobrać hostowaną zawartość. Pobieranie może wystąpić w tle.
  • SKPaymentTransactionObserver — nowa metoda: UpdateDownloads. Zestaw Store wywołuje tę metodę z informacjami o postępie bieżących operacji pobierania.

Szczegóły nowej SKDownload klasy:

  • Postęp — wartość z zakresu od 0 do 1, której można użyć do wyświetlenia procentowego wskaźnika dla użytkownika. Nie używaj progress == 1, aby wykryć, czy pobieranie zostało ukończone, sprawdź stan == Zakończono.
  • TimeRemaining — szacowanie pozostałego czasu pobierania w sekundach. -1 oznacza, że nadal oblicza oszacowanie.
  • Stan — aktywny, oczekujące, zakończone, zakończone, wstrzymane, anulowane.
  • ContentURL — lokalizacja pliku, w której zawartość została umieszczona na dysku, w Cache katalogu. Wypełniane tylko po zakończeniu pobierania.
  • Error — sprawdź tę właściwość, jeśli stan jest uszkodzony.

Interakcje między klasami w przykładowym kodzie są wyświetlane na tym diagramie (kod specyficzny dla zakupów zawartości hostowanej jest wyświetlany na zielono):

Zakupy zawartości hostowanej są wyświetlane na zielono na tym diagramie

Przykładowy kod, w którym użyto tych klas, jest wyświetlany w pozostałej części tej sekcji:

CustomPaymentObserver (SKPaymentTransactionObserver)

Zmień istniejące UpdatedTransactions przesłonięcia, aby sprawdzić, czy zawartość można pobrać, i wywołaj metodę StartDownloads w razie potrzeby:

public override void UpdatedTransactions (SKPaymentQueue queue, SKPaymentTransaction[] transactions)
{
    foreach (SKPaymentTransaction transaction in transactions) {
        switch (transaction.TransactionState) {
        case SKPaymentTransactionState.Purchased:
            // UPDATED FOR iOS 6
            if (transaction.Downloads != null && transaction.Downloads.Length > 0) {
                // Purchase complete, and it has downloads... so download them!
                SKPaymentQueue.DefaultQueue.StartDownloads (transaction.Downloads);
                // CompleteTransaction() call has moved after downloads complete
            } else {
                // complete the transaction now
                theManager.CompleteTransaction(transaction);
            }
            break;
        case SKPaymentTransactionState.Failed:
            theManager.FailedTransaction(transaction);
            break;
        case SKPaymentTransactionState.Restored:
            // TODO: you must decide how to handle restored transactions.
            // Triggering all the downloads at once is not advisable.
            theManager.RestoreTransaction(transaction);
            break;
        default:
            break;
        }
    }
}

Poniżej przedstawiono nową metodę UpdatedDownloads zastąpienia. Zestaw Store wywołuje tę metodę po StartDownloads wyzwoleniu w pliku UpdatedTransactions. Ta metoda jest wywoływana wiele razy w nieokreślonych interwałach, aby zapewnić postęp pobierania, a następnie ponownie po zakończeniu pobierania. Zwróć uwagę, że metoda akceptuje tablicę SKDownload obiektów, więc każde wywołanie metody może zapewnić stan wielu pobrań w kolejce. Jak pokazano w implementacji poniżej stanu pobierania są sprawdzane za każdym razem i odpowiednie działania podjęte.

// ENTIRELY NEW METHOD IN iOS6
public override void PaymentQueueUpdatedDownloads (SKPaymentQueue queue, SKDownload[] downloads)
{
    Console.WriteLine (" -- PaymentQueueUpdatedDownloads");
    foreach (SKDownload download in downloads) {
        switch (download.DownloadState) {
        case SKDownloadState.Active:
            // TODO: implement a notification to the UI (progress bar or something?)
            Console.WriteLine ("Download progress:" + download.Progress);
            Console.WriteLine ("Time remaining:   " + download.TimeRemaining); // -1 means 'still calculating'
            break;
        case SKDownloadState.Finished:
            Console.WriteLine ("Finished!!!!");
            Console.WriteLine ("Content URL:" + download.ContentUrl);

            // UNPACK HERE! Calls FinishTransaction when it's done
            theManager.SaveDownload (download);

            break;
        case SKDownloadState.Failed:
            Console.WriteLine ("Failed"); // TODO: UI?
            break;
        case SKDownloadState.Cancelled:
            Console.WriteLine ("Canceled"); // TODO: UI?
            break;
        case SKDownloadState.Paused:
        case SKDownloadState.Waiting:
            break;
        default:
            break;
        }
    }
}

InAppPurchaseManager (SKProductsRequestDelegate)

Ta klasa zawiera nową metodę SaveDownload wywoływaną po pomyślnym zakończeniu pobierania.

Hostowana zawartość została pomyślnie pobrana i rozpakowana w Cache katalogu. Struktura obiektu . Plik PKG wymaga zapisania wszystkich plików w podkatalogu Contents , więc poniższy kod wyodrębnia pliki z podkatalogu Contents .

Kod iteruje wszystkie pliki w pakiecie zawartości i kopiuje je do Documents katalogu w podfolderze o nazwie .ProductIdentifier Na koniec wywołuje CompleteTransactionmetodę , która wywołuje FinishTransaction metodę usuwania transakcji z kolejki płatności.

// ENTIRELY NEW METHOD IN iOS 6
public void SaveDownload (SKDownload download)
{
    var documentsPath = Environment.GetFolderPath (Environment.SpecialFolder.Personal); // Documents folder
    var targetfolder = System.IO.Path.Combine (documentsPath, download.Transaction.Payment.ProductIdentifier);
    // targetfolder will be "/Documents/com.xamarin.storekitdoc.montouchimages/" or something like that
    if (!System.IO.Directory.Exists (targetfolder))
        System.IO.Directory.CreateDirectory (targetfolder);
    foreach (var file in System.IO.Directory.EnumerateFiles
             (System.IO.Path.Combine(download.ContentUrl.Path, "Contents"))) { // Contents directory is the default in .PKG files
        var fileName = file.Substring (file.LastIndexOf ("/") + 1);
        var newFilePath = System.IO.Path.Combine(targetfolder, fileName);
        if (!System.IO.File.Exists(newFilePath)) // HACK: this won't support new versions...
            System.IO.File.Copy (file, newFilePath);
        else
            Console.WriteLine ("already exists " + newFilePath);
    }
    CompleteTransaction (download.Transaction); // so it gets 'finished'
}

Po FinishTransaction wywołaniu pobrane pliki nie mają już gwarancji, że znajdują się w Cache katalogu. Przed wywołaniem metody FinishTransactionnależy skopiować wszystkie pliki .

Inne zagadnienia

Powyższy przykładowy kod przedstawia dość prostą implementację zakupów hostowanej zawartości. Istnieją pewne dodatkowe kwestie, które należy wziąć pod uwagę:

Wykrywanie zaktualizowanej zawartości

Chociaż istnieje możliwość zaktualizowania hostowanych pakietów zawartości, zestaw Store Kit nie zapewnia żadnego mechanizmu wypychania tych aktualizacji do użytkowników, którzy już pobrali i kupili produkt. Aby zaimplementować tę funkcję, kod może regularnie sprawdzać nową SKProduct.ContentVersion właściwość (jeśli SKProduct jest Downloadable) i wykryć, czy wartość jest zwiększana. Alternatywnie można utworzyć system powiadomień wypychanych.

Instalowanie zaktualizowanych wersji zawartości

Powyższy przykładowy kod pomija kopiowanie plików, jeśli plik już istnieje. Nie jest to dobry pomysł, jeśli chcesz obsługiwać nowsze wersje pobieranej zawartości.

Alternatywą może być skopiowanie zawartości do folderu o nazwie dla wersji i śledzenie bieżącej wersji (np. w NSUserDefaults lokalizacji lub miejscu przechowywania ukończonych rekordów zakupu).

Przywracanie transakcji

Po SKPaymentQueue.DefaultQueue.RestoreCompletedTransactions wywołaniu zestaw Store Kit zwraca wszystkie poprzednie transakcje dla użytkownika. Jeśli zakupiono dużą liczbę elementów lub każdy zakup ma duże pakiety zawartości, przywracanie może spowodować duży ruch sieciowy, ponieważ wszystko jest w kolejce do pobrania jednocześnie.

Rozważ śledzenie, czy produkt został zakupiony oddzielnie od rzeczywistego pobrania skojarzonego pakietu zawartości.

Wstrzymywania, ponownego uruchamiania i anulowania pobierania

Mimo że przykładowy kod nie demonstruje tej funkcji, można wstrzymać i ponownie uruchomić hostowaną zawartość do pobrania. Zawiera SKPaymentQueue.DefaultQueue metody dla PauseDownloads, ResumeDownloads i CancelDownloads.

Jeśli kod wywołuje FinishTransaction kolejkę płatności przed pobraniem Finished , pobieranie zostanie anulowane automatycznie.

Ustawianie flagi SKIP-Backup na pobranej zawartości

Wytyczne dotyczące tworzenia kopii zapasowych w usłudze iCloud firmy Apple sugerują, że zawartość nieużytkownika, która jest łatwo przywracana z serwera, nie powinna być tworzona kopia zapasowa (ponieważ niepotrzebnie używałaby magazynu w usłudze iCloud). Aby uzyskać więcej informacji na temat ustawiania atrybutu kopii zapasowej, zobacz dokumentację systemu plików.

Podsumowanie

W tym artykule wprowadzono dwie nowe funkcje zestawu Store Kit w systemie iOS6: kupowanie iTunes i innej zawartości z poziomu aplikacji oraz korzystanie z serwera firmy Apple do hostowania własnych zakupów w aplikacji. To wprowadzenie powinno zostać odczytane w połączeniu z istniejącą dokumentacją dotyczącą zakupu w aplikacji, aby uzyskać pełny zakres implementacji funkcji zestawu Store Kit.