Změny ve StoreKitu v iOSu 6

iOS 6 zavedl dvě změny rozhraní API sady Store: schopnost zobrazovat produkty iTunes (a App Store/iBookstore) z vaší aplikace a novou možnost nákupu v aplikaci, kde Apple bude hostovat vaše soubory ke stažení. Tento dokument vysvětluje, jak tyto funkce implementovat v Xamarin.iOS.

Hlavní změny sady Store Kit v iOS6 jsou tyto dvě nové funkce:

  • Zobrazení a nákup obsahu v aplikaci – uživatelé můžou nakupovat a stahovat aplikace, hudbu, knihy a další obsah iTunes, aniž by opustili vaši aplikaci. Můžete také vytvořit odkaz na vlastní aplikace, které propagují nákupy, nebo můžete jenom podpořit recenze a hodnocení.
  • Hostovaný obsah nákupu v aplikaci – Apple uloží a doručí obsah přidružený k vašim produktům pro nákup v aplikaci, což eliminuje potřebu samostatného serveru k hostování souborů, automaticky podporuje stahování na pozadí a umožňuje psát méně kódu.

Podrobné informace o rozhraních API StoreKit najdete v průvodcích nákupem v aplikaci.

Požadavky

Funkce sady Store Kit popsané v tomto dokumentu vyžadují iOS 6 a Xcode 4.5 spolu s Xamarin.iOS 6.0.

Zobrazení obsahu v aplikaci a nákup

Nová funkce nákupu v aplikaci v iOSu umožňuje uživatelům zobrazit informace o produktu a zakoupit nebo stáhnout produkt z vaší aplikace. Dříve aplikace musely aktivovat iTunes, App Store nebo iBookstore, což by vedlo k tomu, že uživatel opustí původní aplikaci. Tato nová funkce po dokončení automaticky vrátí uživatele do vaší aplikace.

Automatically returning to an app after purchase

Mezi příklady použití patří:

  • Povzbuzovat uživatele k hodnocení aplikace – stránku App Storu můžete otevřít, aby uživatel mohl ohodnotit a zkontrolovat aplikaci, aniž by ji opustil.
  • Křížové povýšení aplikací – Umožňuje uživateli zobrazit další aplikace, které publikujete, a umožnit okamžité zakoupení nebo stažení.
  • Pomoc uživatelům s hledáním a stahováním obsahu – Pomozte uživatelům kupovat obsah, který vaše aplikace najde, spravuje nebo agreguje (např. aplikace související s hudbou může poskytnout seznam skladeb a umožnit zakoupení každé skladby v aplikaci).

SKStoreProductViewController Jakmile se uživatel zobrazí, může s informacemi o produktu pracovat, jako by byl v iTunes, App Storu nebo iBookstore. Uživatel může:

  • Zobrazení snímků obrazovky (pro aplikace)
  • Ukázkové skladby nebo video (pro hudbu, televizní pořady a filmy),
  • Recenze pro čtení (a zápis)
  • Nákup a stažení, které se děje zcela v rámci kontroleru zobrazení a sady Store Kit.

Některé možnosti v rámci SKStoreProductViewController aplikace stále vynutí, aby opustil vaši aplikaci a otevřel příslušnou aplikaci z Obchodu, například kliknutím na související produkty nebo odkazem na podporu aplikace.

SKStoreProductViewController

Rozhraní API pro zobrazení produktu v rámci jakékoli aplikace je jednoduché: vyžaduje pouze vytvoření a zobrazení SKStoreProductViewController. Pomocí těchto kroků vytvořte a zobrazte produkt:

  1. Vytvořte StoreProductParameters objekt, který bude předávat parametry kontroleru zobrazení, včetně objektu productId v konstruktoru.
  2. Vytvořte instanci SKProductViewController. Přiřaďte ho k poli na úrovni třídy.
  3. Přiřaďte obslužnou rutinu události kontroleru Finished zobrazení, která by měla řadič zobrazení zavřít. Tato událost se volá, když uživatel stiskne storno; nebo jinak finalizuje transakci uvnitř kontroleru zobrazení.
  4. Volejte metodu LoadProductStoreProductParameters předanou obslužnou rutinu a obslužnou rutinu dokončení. Obslužná rutina dokončení by měla zkontrolovat, zda byla žádost o produkt úspěšně dokončena, a pokud ano, prezentovat SKProductViewController modálně. V případě, že se produkt nedá načíst, by se mělo přidat vhodné zpracování chyb.

Příklad

Projekt ProductView v vzorovém kódu StoreKit pro tento článek implementuje metodu Buy , která přijímá Apple ID libovolného produktu a zobrazí SKStoreProductViewController. Následující kód zobrazí informace o produktu pro libovolné dané 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);
        }
    });
}

Aplikace vypadá jako na následujícím snímku obrazovky při spuštění – stažení nebo nákup zcela v rámci :SKStoreProductViewController

The app looks like this when running

Podpora starších operačních systémů

Ukázková aplikace obsahuje kód, který ukazuje, jak otevřít App Store, iTunes nebo iBookstore v dřívějších verzích iOS. OpenUrl Pomocí metody otevřete správně vytvořenou adresu URL itunes.com.

Kontrolu verzí můžete implementovat, abyste zjistili, který kód se má spustit, jak je znázorněno tady:

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);
}

Chyby

K následující chybě dojde, pokud apple ID, které používáte, není platné, což může být matoucí, protože to znamená problém se sítí nebo ověřováním nějakého druhu.

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

Dokumentace ke čtení Objective-C

Vývojáři, kteří čtou o sadě Store Kit na vývojářském portálu Společnosti Apple, uvidí protokol SKStoreProductViewControllerDelegate , který je popsán v souvislosti s touto novou funkcí. Protokol delegáta má pouze jednu metodu – productViewControllerDidFinish , která byla vystavena jako Finished událost SKStoreProductViewController v Xamarin.iOS.

Určení Apple ID

Apple ID vyžadované SKStoreProductViewController číslem (nezaměňovat s ID sady jako "com.xamarin.mwc2012"). Existuje několik různých způsobů, jak zjistit Apple ID pro produkty, které chcete zobrazit, uvedené níže:

iTunes Připojení

U aplikací, které publikujete, je snadné najít Apple ID v iTunes Připojení:

Finding the Apple ID in iTunes Connect

Rozhraní API pro vyhledávání

Apple poskytuje rozhraní API pro dynamické vyhledávání pro dotazování všech produktů v App Storu, iTunes a iBookstore. Informace o tom, jak získat přístup k rozhraní API vyhledávání, najdete v Affiliate Resources společnosti Apple, i když je rozhraní API vystaveno komukoli (ne jenom zaregistrovaným afilacím). Výsledný kód JSON je možné analyzovat a zjistit trackId tak, že se jedná o Apple ID, které se má použít s SKStoreProductViewController.

Výsledky budou obsahovat také další metadata včetně zobrazovaných informací a adres URL uměleckých děl, které můžete použít k vykreslení produktu ve vaší aplikaci.

Několik příkladů:

Kanál enterprise partner

Apple poskytuje schváleným partnerům úplný výpis dat všech svých produktů ve formě plochých souborů připravených ke stažení. Pokud máte nárok na přístup k podnikovému partnerskému kanálu, najdete v této datové sadě Apple ID libovolného produktu.

Mnoho uživatelů programu Enterprise Partner Feed je členy affiliate programu , který umožňuje získat provize z prodeje produktů. SKStoreProductViewController nepodporuje affiliate ID (v době psaní).

Apple ID produktu lze odvodit z odkazu na adresu URL iTunes Preview. V libovolném odkazu na produkty iTunes (pro aplikace, hudbu nebo knihy) najděte část adresy URL začínající id a použijte následující číslo.

Například přímý odkaz na iBooks je

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

a Apple ID je 364709193. Podobně pro aplikaci MWC2012 je přímý odkaz

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

a Apple ID je 496963922.

Nákup hostovaného obsahu v aplikaci

Pokud se nákupy v aplikaci skládají z obsahu ke stažení (jako jsou knihy nebo jiná média, umění na úrovni hry a konfigurace nebo jiné velké soubory), pak se tyto soubory používaly k hostování na webovém serveru a aplikace musely po nákupu začlenit kód, který je bezpečně stáhne. Počínaje iOSem 6 bude Apple hostovat vaše soubory na svých serverech a tím odebere potřebu samostatného serveru. Tato funkce je k dispozici pouze pro nedostupné produkty (ne spotřební nebo předplatná). Mezi výhody použití hostitelské služby Společnosti Apple patří:

  • Ušetřete náklady na hostování a šířku pásma.
  • Pravděpodobně škálovatější než jakýkoli hostitel serveru, který aktuálně používáte.
  • Méně kódu k zápisu, protože nemusíte sestavovat žádné zpracování na straně serveru.
  • Stahování na pozadí se implementuje za vás.

Poznámka: Testování obsahu nákupu hostovaného v aplikaci v simulátoru iOS se nepodporuje, takže je nutné otestovat skutečné zařízení.

Základy hostovaného obsahu

Před iOSem 6 byly k dispozici dva způsoby, jak poskytnout produkt (podrobněji popsáno v dokumentaci k nákupu v aplikaci Xamarinu):

  • Integrované produkty – funkce, které jsou "odemknuté" nákupem, ale jsou integrované do aplikace (buď jako kód, nebo vložené prostředky). Příklady předdefinovaných produktů zahrnují odemknuté fotofiltry nebo herní power-upy.
  • Produkty doručované serverem – Po zakoupení musí aplikace stahovat obsah ze serveru, který provozujete. Tento obsah se stáhne během nákupu, uloží se na zařízení a pak se vykreslí jako součást poskytování produktu. Mezi příklady patří knihy, časopisy nebo herní úrovně, které se skládají z umění na pozadí a konfiguračních souborů.

V iOSu 6 Apple nabízí variantu produktů doručovaných serverem: budou hostovat vaše soubory obsahu na svých serverech. Díky tomu je mnohem jednodušší vytvářet serverové produkty, protože nemusíte pracovat se samostatným serverem a Sada Store Kit poskytuje funkce pro stahování na pozadí, které jste předtím museli napsat sami. Pokud chcete využít výhod hostování Apple, povolte hostování obsahu pro nové produkty nákupu v aplikaci a upravte kód sady Store Kit tak, aby ho využil. Soubory obsahu produktu se pak sestaví pomocí Xcode a nahrají se na servery Společnosti Apple pro kontrolu a vydání.

The build and deliver process

Použití App Storu k poskytování nákupů v aplikaci s hostovaným obsahem vyžaduje následující nastavení a konfiguraci:

  • iTunes Připojení – Musíte poskytnout své bankovní a daňové údaje společnosti Apple, aby mohly odesílat finanční prostředky shromážděné vaším jménem. Potom můžete nakonfigurovat produkty k prodeji a nastavit uživatelské účty sandboxu pro testování nákupu. Musíte také nakonfigurovat hostovaný obsah pro produkty, které nejsou dostupné pro produkty, které chcete hostovat s Apple.
  • Portál zřizování pro iOS – Vytvoření identifikátoru sady a povolení přístupu k App Storu pro vaši aplikaci, stejně jako u jakékoli aplikace, která podporuje nákup v aplikaci.
  • Sada Store – Přidání kódu do aplikace pro zobrazení produktů, nákupu produktů a obnovení transakcí Sada iOS 6 Store Kit také bude spravovat stahování obsahu vašeho produktu na pozadí s probíhajícími aktualizacemi.
  • Vlastní kód – Sledování nákupů provedených zákazníky a poskytování produktů nebo služeb, které zakoupili. Využijte nové třídy sady iOS 6 Store Kit, jako SKDownload je načtení obsahu hostovaného společností Apple.

Následující části vysvětlují, jak implementovat hostovaný obsah, od vytvoření a nahrání balíčku ke správě procesu nákupu a stahování pomocí vzorového kódu pro tento článek.

Ukázka kódu

Ukázkový projekt HostedNonConsumables (v StoreKitiOS6.zip) používá hostovaný obsah. Aplikace nabízí k prodeji dvě "kapitoly knihy", obsah, pro který je hostovaný na serverech Společnosti Apple. Obsah se skládá z textového souboru a obrázku, i když v reálné aplikaci lze použít mnohem složitější obsah.

Aplikace vypadá před nákupem a po tomto:

The app looks like this before, during and after a purchase

Textový soubor a obrázek se stáhnou a zkopírují do adresáře Dokumenty aplikace. Další informace o různých adresářích dostupných pro úložiště aplikací najdete v dokumentaci k systému souborů.

Připojení iTunes

Při vytváření nových produktů, které budou používat hostování obsahu společnosti Apple, nezapomeňte vybrat typ nekomužitelného produktu. Jiné typy produktů nepodporují hostování obsahu. Také byste neměli povolit hostování obsahu pro stávající produkty, které prodáváte. Zapněte hostování obsahu jenom pro nové produkty.

Select the Non-Consumable product type

Zadejte ID produktu. Toto ID bude vyžadováno později při vytváření obsahu pro tento produkt.

Enter a Product ID

Hostování obsahu je nastavené v části Podrobnosti. Před živým nákupem v aplikaci zrušte zaškrtnutí políčka Host Content with Apple (Host Content with Apple ), pokud chcete akci zrušit (i když jste nahráli nějaký testovací obsah). Hostování obsahu se ale nedá odebrat, jakmile se nákup v aplikaci rozběhl.

Hosting content with Apple

Jakmile zapnete hostování obsahu, produkt zadá stav Čekání na nahrání a zobrazí tuto zprávu:

The product will enter Waiting for Upload status and show this message

Balíček obsahu by se měl vytvořit pomocí Xcode a nahrát ho pomocí nástroje Archiv. Pokyny pro vytváření balíčků obsahu jsou uvedeny v další části Vytváření . Soubory PKG.

Vytváření. Soubory PKG

Soubory obsahu, které nahrajete do Společnosti Apple, musí splňovat následující omezení:

  • Velikost nesmí překročit 2 GB.
  • Nelze obsahovat spustitelný kód (nebo symlinky, které odkazují mimo obsah).
  • Musí být správně naformátovaný (včetně souboru .plist) a musí mít příponu .pkg. To se provede automaticky, pokud budete postupovat podle těchto pokynů pomocí Xcode.

Můžete přidat mnoho různých souborů a typů souborů, pokud splňují tato omezení. Obsah se zazipuje před doručením do vaší aplikace a rozbalí se sadou Store Kit před tím, než k němu kód přistupuje.

Po nahrání balíčku obsahu ho můžete nahradit novějším obsahem. Nový obsah musí být nahrán a odeslán k revizi nebo schválení prostřednictvím normálního procesu. Zvýšením ContentVersion pole v aktualizovaných balíčcích obsahu označte, že je novější.

Projekty obsahu nákupu v aplikaci Xcode

Vytváření balíčků obsahu pro produkty nákupu v aplikaci v současné době vyžaduje Xcode. Není vyžadován ŽÁDNÝ KÓD OBJECTIVE-C; Xcode má pro tyto balíčky nový typ projektu, který obsahuje jenom vaše soubory a plist.

Naše ukázková aplikace obsahuje kapitoly knihy k prodeji – každý balíček obsahu kapitol bude obsahovat:

  • textový soubor a
  • obrázek představující kapitolu.

Začněte tím, že v nabídce vyberete Soubor > nový projekt a zvolíte Obsah nákupu v aplikaci:

Choose In-App Purchase Content

Zadejte název produktu a identifikátor společnosti tak, aby identifikátor sady odpovídal ID produktu, které jste zadali v iTunes Připojení pro tento produkt.

Enter the Name and Identifier

Teď budete mít prázdný projekt obsahu v aplikaci. Můžete kliknout pravým tlačítkem myši a přidat soubory... nebo je přetáhnout do Navigátoru projektu. Ujistěte se, že je obsah správný (měl by se spustit na 1.0, ale pokud se později rozhodnete aktualizovat obsah, nezapomeňte ho zvýšit).

Tento snímek obrazovky ukazuje Xcode se soubory obsahu, které jsou součástí projektu, a položky plist viditelné v hlavním okně:

This screenshot shows Xcode with the content files included in the project and the plist entries visible in the main window

Jakmile přidáte všechny soubory obsahu, můžete tento projekt uložit a později ho znovu upravit nebo zahájit proces nahrávání.

Nahrávání. Soubory PKG

Nejjednodušší způsob, jak nahrát balíčky obsahu, je pomocí nástroje Xcode Archive Tool. V nabídce zvolte Archiv produktu>, abyste mohli začít:

Choose Archiven

Balíček obsahu se pak zobrazí v archivu, jak je znázorněno níže. Typ archivu a ikona ukazující tento řádek je archiv obsahu nákupu v aplikaci. Kliknutím na Ověřit... zkontrolujte, jestli balíček obsahu neobsahují chyby, aniž byste skutečně provedli nahrávání.

Validate the package

Přihlaste se pomocí svých přihlašovacích údajů Připojení iTunes:

Login with your iTunes Connect credentials

Zvolte správnou aplikaci a nákup v aplikaci, abyste tento obsah přidružili k:

Choose the correct application and in-app purchase to associate this content with

Měla by se zobrazit zpráva podobná tomuto snímku obrazovky:

An example no issues message

Teď si projděte podobný proces, ale kliknutím na Distribuovat... obsah skutečně nahrajete.

Distribute the app

Vyberte první možnost a nahrajte obsah:

Upload the content

Znovu se přihlaste:

Login in

Zvolte správnou aplikaci a záznam o nákupu v aplikaci, do které chcete nahrát obsah:

Choose the application and in-app purchase record

Počkejte, než se soubory nahrají:

The content upload dialog

Po dokončení nahrávání se zobrazí zpráva s upozorněním, že se obsah odeslal do App Storu.

An example successful upload message

Po dokončení se po návratu na stránku produktu v iTunes Připojení zobrazí podrobnosti balíčku a bude ve stavu Připraveno k odeslání. Když je produkt v tomto stavu, můžete začít testovat v sandboxovém prostředí. K testování v sandboxu nemusíte produkt odesílat.

iTunes Connect it will show the package details and be in Ready to Submit status

Může to nějakou dobu trvat (např. několik minut) mezi nahráním archivu a aktualizací stavu Připojení iTunes. Produkt můžete odeslat k revizi samostatně nebo ho odeslat ve spojení s binárním souborem aplikace. Až společnost Apple oficiálně schválí obsah, bude k dispozici v produkčním App Storu pro nákup ve vaší aplikaci.

Formát souboru PKG

Použití Xcode a archiv nástroje k vytvoření a nahrání hostovaného balíčku obsahu znamená, že nikdy neuvidíte obsah samotného balíčku. Soubory a adresáře v balíčcích vytvořených pro ukázkovou aplikaci vypadají jako následující snímek obrazovky s souborem plist v kořenovém adresáři a soubory produktu v podadresáři Obsah :

The plist file in the root and the product files in a Contents subdirectory

Poznamenejte si adresářovou strukturu balíčku (zejména umístění souborů v Contents podadresáři), protože tyto informace budete muset pochopit, abyste mohli extrahovat soubory z balíčku na zařízení.

Aktualizace obsahu balíčku

Postup aktualizace obsahu po schválení:

  • Upravte projekt obsahu nákupu v aplikaci v Xcode.
  • Číslo verze se zhoršuje.
  • Nahrajte do iTunes Připojení znovu. Další nákupčí automaticky získají nejnovější verzi, ale uživatelé, kteří už mají starou verzi, neobdrží žádné oznámení.
  • Vaše aplikace zodpovídá za upozorňování uživatelů a podporu k načtení novější verze obsahu. Aplikace musí také vytvořit funkci, která stáhne novou verzi pomocí funkce Restore sady Store Kit.
  • Pokud chcete zjistit, jestli existuje novější verze, můžete do aplikace sestavit funkci, která načte SKProducts (např. stejný proces, který se používá k načtení cen produktů) a porovnat vlastnost ContentVersion.

Přehled nákupu

Než si přečtete tuto část, projděte si existující dokumentaci k nákupu v aplikaci.

Posloupnost událostí, ke kterým dochází při nákupu produktu s hostovaným obsahem a stažení, je znázorněno v tomto diagramu:

The sequence of events that occurs when a product with hosted content is purchased and download

  1. Nové produkty je možné vytvářet v iTunes Připojení s povoleným hostovaným obsahem. Skutečný obsah se sestaví samostatně v Xcode (stejně jako přetažení souborů do složky) a pak archivuje a nahraje do iTunes (nevyžaduje se kódování). Každý produkt se pak odešle ke schválení, po kterém bude k dispozici k nákupu. V ukázkovém kódu jsou tato ID produktů pevně zakódovaná, ale hostitelský obsah s Apple je flexibilnější, pokud uložíte dostupný seznam produktů na vzdáleném serveru, aby bylo možné ho aktualizovat při odesílání nových produktů a obsahu do iTunes Připojení.
  2. Když uživatel zakoupí produkt, transakce se umístí do fronty plateb ke zpracování.
  3. Store Kit předá žádost o nákup na servery iTunes ke zpracování.
  4. Transakce se dokončí na serverech iTunes (např. zákazník se účtuje) a do aplikace se vrátí potvrzení s připojenými informacemi o produktu, včetně toho, jestli je ke stažení (a pokud ano, velikost souboru a další metadata).
  5. Váš kód by měl zkontrolovat, jestli je produkt ke stažení ke stažení, a pokud ano, vytvořte žádost o stažení obsahu, která je také umístěna ve frontě plateb. Sada Store Kit odešle tuto žádost na servery iTunes.
  6. Server vrátí soubor obsahu do sady Store Kit, která poskytuje zpětná volání pro vrácení průběhu stahování a zbývající odhady času do kódu.
  7. Po dokončení se zobrazí oznámení a předání umístění souboru ve složce Cache.
  8. Váš kód by měl soubory zkopírovat a ověřit, uložit libovolný stav, který si musíte zapamatovat, že produkt byl zakoupen. Tuto příležitost použijte, pokud chcete správně nastavit příznak zálohování u nových souborů (tip: pokud pocházejí ze serveru a uživatel je nikdy neupravuje, měli byste pravděpodobně přeskočit jejich zálohování, protože uživatel je může vždy načíst ze serverů Společnosti Apple v budoucnu).
  9. Volání FinishTransaction Tento krok je DŮLEŽITÝ, protože odebere transakci z platební fronty. Je také důležité, abyste nevolali FinishTransaction až PO zkopírování obsahu z adresáře Mezipaměti. Jakmile zavoláte FinishTransaction, soubory v mezipaměti budou pravděpodobně rychle vyprázdněné.

Implementace nákupu hostovaného obsahu

Následující informace by se měly přečíst společně s kompletní dokumentací k nákupům v aplikaci. Informace v tomto dokumentu se zaměřují na rozdíly mezi hostovaným obsahem a předchozí implementací.

Třídy

Následující třídy byly přidány nebo změněny tak, aby podporovaly hostovaný obsah v iOS 6:

  • SKDownload – nová třída, která představuje probíhající stahování. Rozhraní API umožňuje více než jeden produkt, ale zpočátku byl implementován pouze jeden.
  • SKProduct – Přidány nové vlastnosti: Downloadable, ContentVersion, ContentLengths pole.
  • SKPaymentTransaction – Přidána nová vlastnost: Downloads, která obsahuje kolekci SKDownload objektů, pokud má tento produkt hostovaný obsah k dispozici ke stažení.
  • SKPaymentQueue – nová metoda přidána: StartDownloads. Volání této metody s SKDownload objekty k načtení jejich hostovaného obsahu. Stahování může na pozadí nastat.
  • SKPaymentTransactionObserver – Nová metoda: UpdateDownloads. Sada Store volá tuto metodu s informacemi o průběhu aktuálních operací stahování.

Podrobnosti o nové SKDownload třídě:

  • Průběh – hodnota od 0 do 1, kterou můžete použít k zobrazení indikátoru dokončeného procenta pro uživatele. Nepoužívejte průběh == 1 ke zjištění, zda je stahování dokončeno, zkontrolujte stav == Dokončeno.
  • TimeRemaining – odhad zbývající doby stahování v sekundách. -1 znamená, že stále počítá odhad.
  • Stav – Aktivní, Čekání, Dokončeno, Selhání, Pozastaveno, Zrušeno.
  • ContentURL – umístění souboru, kam byl obsah vložen na disk, v Cache adresáři. Dokončeno pouze po dokončení stahování.
  • Chyba – Zkontrolujte tuto vlastnost, pokud je stav neúspěšný.

Interakce mezi třídami v ukázkovém kódu se zobrazují v tomto diagramu (kód specifický pro nákupy hostovaného obsahu se zobrazuje zeleně):

Hosted content purchases is shown in green in this diagram

Vzorový kód, ve kterém byly použity tyto třídy, se zobrazuje ve zbývající části této části:

CustomPaymentObserver (SKPaymentTransactionObserver)

Změňte existující UpdatedTransactions přepsání, abyste zkontrolovali obsah ke stažení, a v případě potřeby volejte StartDownloads :

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;
        }
    }
}

Nová přepsaná metoda UpdatedDownloads je uvedena níže. Store Kit volá tuto metodu po StartDownloads aktivaci v UpdatedTransactions. Tato metoda se volá vícekrát v neurčitých intervalech, aby vám poskytla průběh stahování a pak znovu po dokončení stahování. Všimněte si, že metoda přijímá pole SKDownload objektů, takže každé volání metody vám může poskytnout stav více stažení ve frontě. Jak je znázorněno v implementaci pod stavem stahování, jsou kontrolovány při každém a příslušném provedení akce.

// 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)

Tato třída obsahuje novou metodu SaveDownload , která je volána po úspěšném dokončení každého stahování.

Hostovaný obsah se úspěšně stáhl a rozbalil do Cache adresáře. Struktura . Soubor PKG vyžaduje uložení všech souborů do Contents podadresáře, takže následující kód extrahuje soubory z Contents podadresáře.

Kód iteruje všechny soubory v balíčku obsahu a zkopíruje je do Documents adresáře v podsložce s názvem .ProductIdentifier Nakonec zavolá CompleteTransactionvolání, která volání FinishTransaction odebrat transakci z platební fronty.

// 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'
}

Při FinishTransaction zavolání se staženým souborům už nezaručuje, že budou v adresáři Cache . Před voláním FinishTransactionby měly být zkopírovány všechny soubory .

Ostatní úvahy

Výše uvedený ukázkový kód ukazuje poměrně jednoduchou implementaci nákupu hostovaného obsahu. Je potřeba zvážit několik dalších bodů:

Detekce aktualizovaného obsahu

I když je možné aktualizovat hostované balíčky obsahu, sada Store Kit neposkytuje žádný mechanismus pro nabízení těchto aktualizací uživatelům, kteří si produkt už stáhli a zakoupili. Pokud chcete tuto funkci implementovat, může váš kód pravidelně kontrolovat novou SKProduct.ContentVersion vlastnost (pokud SKProduct je Downloadable) a zjistit, jestli je hodnota přírůstková. Případně můžete vytvořit systém nabízených oznámení.

Instalace aktualizovaných verzí obsahu

Výše uvedený ukázkový kód přeskočí kopírování souboru, pokud soubor již existuje. To není dobrý nápad, pokud chcete podporovat novější verze staženého obsahu.

Alternativou může být zkopírování obsahu do složky s názvem verze a sledování, která je aktuální verzí (např. do NSUserDefaults nebo kdekoli ukládáte dokončené záznamy o nákupu).

Obnovení transakcí

Při SKPaymentQueue.DefaultQueue.RestoreCompletedTransactions zavolání store kit vrátí všechny předchozí transakce pro uživatele. Pokud si koupili velký počet položek nebo pokud každý nákup obsahuje velké balíčky obsahu, může obnovení způsobit velké množství síťového provozu, protože všechno se zařadí do fronty ke stažení najednou.

Zvažte sledování toho, jestli byl produkt zakoupen odděleně od skutečného stažení přidruženého balíčku obsahu.

Pozastavení, restartování a zrušení stahování

I když ukázkový kód tuto funkci neukazuje, je možné pozastavit a restartovat hostovaný obsah ke stažení. Obsahuje SKPaymentQueue.DefaultQueue metody pro PauseDownloads, ResumeDownloads a CancelDownloads.

Pokud kód před stažením Finished volá FinishTransaction platební frontu, zruší se stahování automaticky.

Nastavení příznaku SKIP-Backup u staženého obsahu

Pokyny pro zálohování iCloud společnosti Apple naznačují, že obsah bez uživatele, který se snadno obnoví ze serveru, by se neměl zálohovat (protože by zbytečně používal úložiště iCloud). Další informace o nastavení atributu zálohování najdete v dokumentaci k systému souborů.

Shrnutí

Tento článek představil dvě nové funkce sady Store Kit v iOS6: nákup iTunes a další obsah z vaší aplikace a využití serveru Apple k hostování vlastních nákupů v aplikaci. Tento úvod by se měl přečíst ve spojení s existující dokumentací k nákupu v aplikaci, kde najdete kompletní pokrytí implementace funkcí sady Store Kit.