Freigeben über


Änderungen an StoreKit in iOS 6

iOS 6 hat zwei Änderungen an der Store Kit-API eingeführt: die Möglichkeit, iTunes-Produkte (und App Store/iBookstore) in Ihrer App und eine neue In-App-Kaufoption anzuzeigen, in der Apple Ihre herunterladbaren Dateien hosten wird. In diesem Dokument wird erläutert, wie Diese Features mit Xamarin.iOS implementiert werden.

Die wichtigsten Änderungen am Store Kit in iOS6 sind die beiden neuen Features:

  • In-App-Inhaltsanzeige und -einkauf – Benutzer können Apps, Musik, Bücher und andere iTunes-Inhalte kaufen und herunterladen, ohne Ihre App verlassen zu müssen. Sie können auch einen Link zu Ihren eigenen Apps erstellen, um den Kauf zu fördern oder einfach Rezensionen und Bewertungen zu ermutigen.
  • In-App-Kauf gehosteter Inhalte – Apple speichert und liefert die Inhalte, die Ihren In-App-Kaufprodukten zugeordnet sind, wodurch die Notwendigkeit eines separaten Servers zum Hosten Ihrer Dateien entfernt wird, das herunterladen im Hintergrund automatisch unterstützt wird und Sie weniger Code schreiben können.

Ausführliche Informationen zu den StoreKit-APIs finden Sie in den In-App-Einkaufshandbüchern .

Anforderungen

Die in diesem Dokument erläuterten Store Kit-Features erfordern iOS 6 und Xcode 4.5 zusammen mit Xamarin.iOS 6.0.

In-App-Inhaltsanzeige & Einkauf

Mit dem neuen In-App-Einkaufsfeature in iOS können Benutzer Produktinformationen anzeigen und das Produkt in Ihrer App herunterladen oder herunterladen. Zuvor mussten Anwendungen iTunes, den App Store oder den iBookstore auslösen, was dazu führen würde, dass der Benutzer die ursprüngliche Anwendung verlässt. Dieses neue Feature gibt den Benutzer automatisch an Ihre App zurück, wenn sie fertig sind.

Automatische Rückkehr zu einer App nach dem Kauf

Beispiele dafür, wie dies verwendet werden kann, sind:

  • Benutzer ermutigen, Ihre App zu bewerten – Sie können die App Store-Seite öffnen, damit der Benutzer Ihre App bewerten und überprüfen kann, ohne sie verlassen zu müssen.
  • Bewerben von Apps – Ermöglichen Sie dem Benutzer, andere apps anzuzeigen, die Sie veröffentlichen, mit der Möglichkeit, sofort zu kaufen/herunterzuladen.
  • Helfen Sie Benutzern beim Suchen und Herunterladen von Inhalten – Helfen Sie Benutzern, Inhalte zu kaufen, die Ihre App findet, verwaltet oder aggregiert (z. B. eine musikbezogene App könnte eine Wiedergabeliste mit Songs bereitstellen und jedem Song erlauben, in der App zu kaufen).

Sobald der SKStoreProductViewController Benutzer angezeigt wurde, kann er mit den Produktinformationen interagieren, als ob er sich in iTunes, im App Store oder im iBookstore befand. Der Benutzer kann:

  • Screenshots anzeigen (für Apps),
  • Beispiellieder oder Videos (für Musik, TV-Sendungen und Filme),
  • Lesen (und Schreiben) Rezensionen,
  • Kauf und Download, der vollständig innerhalb des Ansichtscontrollers und des Store Kit erfolgt.

Einige Optionen innerhalb der SKStoreProductViewController App zwingen den Benutzer weiterhin, Ihre App zu verlassen und die entsprechende Store-App zu öffnen, z. B. klicken Sie auf verwandte Produkte oder den Supportlink einer App.

SKStoreProductViewController

Die API zum Anzeigen eines Produkts in einer beliebigen App ist einfach: Sie müssen nur ein SKStoreProductViewControllerProdukt erstellen und anzeigen. Führen Sie die folgenden Schritte aus, um ein Produkt zu erstellen und anzuzeigen:

  1. Erstellen Sie ein StoreProductParameters Objekt, um Parameter an den Ansichtscontroller zu übergeben, einschließlich des productId im Konstruktor.
  2. Instanziieren von SKProductViewController. Weisen Sie es einem Feld auf Klassenebene zu.
  3. Weisen Sie dem Ereignis des Ansichtscontrollers Finished einen Handler zu, der den Ansichtscontroller schließen soll. Dieses Ereignis wird aufgerufen, wenn der Benutzer "Abbrechen" drückt; oder beendet eine Transaktion auf andere Weise innerhalb des Ansichtscontrollers.
  4. Rufen Sie die LoadProduct Methode auf, die den Abschlusshandler und den StoreProductParameters Abschlusshandler übergibt. Der Vervollständigungshandler sollte überprüfen, ob die Produktanforderung erfolgreich war, und falls ja, die SKProductViewController modal darzustellen. Die entsprechende Fehlerbehandlung sollte hinzugefügt werden, falls das Produkt nicht abgerufen werden kann.

Beispiel

Das ProductView-Projekt im StoreKit-Beispielcode für diesen Artikel implementiert eine Buy Methode, die die Apple-ID eines Produkts akzeptiert und die .SKStoreProductViewController Der folgende Code zeigt die Produktinformationen für eine beliebige Apple-ID an:

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

Die App sieht wie der folgende Screenshot aus, wenn sie ausgeführt wird – Download oder Einkauf erfolgt vollständig innerhalb der SKStoreProductViewController:

Die App sieht bei der Ausführung wie folgt aus:

Unterstützen älterer Betriebssysteme

Die Beispielanwendung enthält Code, der zeigt, wie Sie den App Store, iTunes oder den iBookstore in früheren Versionen von iOS öffnen. Verwenden Sie die OpenUrl Methode, um eine ordnungsgemäß gestaltete itunes.com-URL zu öffnen.

Sie können eine Versionsüberprüfung implementieren, um zu bestimmen, welcher Code ausgeführt werden soll, wie hier gezeigt:

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

Fehler

Der folgende Fehler tritt auf, wenn die von Ihnen verwendete Apple-ID ungültig ist, was verwirrend sein kann, da es ein Netzwerk- oder Authentifizierungsproblem einer Art impliziert.

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

Lesedokumentation Objective-C

Entwickler, die über Das Store Kit im Apple-Entwicklerportal lesen, sehen ein Protokoll – SKStoreProductViewControllerDelegate – in Bezug auf dieses neue Feature. Das Delegatprotokoll verfügt nur über eine Methode – productViewControllerDidFinish – die als Finished Ereignis auf der SKStoreProductViewController In Xamarin.iOS verfügbar gemacht wurde.

Bestimmen von Apple-IDs

Die für die SKStoreProductViewController Angabe erforderliche Apple-ID ist eine Zahl (nicht zu verwechseln mit Bundle-IDs wie "com.xamarin.mwc2012"). Es gibt einige verschiedene Möglichkeiten, wie Sie die Apple-ID für Produkte finden können, die Sie anzeigen möchten, siehe unten:

iTunesConnect

Für Anwendungen, die Sie veröffentlichen, ist es einfach, die Apple-ID in iTunes Connect zu finden:

Suchen der Apple-ID in iTunes Connect

Such-API

Apple stellt eine dynamische Such-API bereit, um alle Produkte im App Store, iTunes und im iBookstore abzufragen. Informationen zum Zugriff auf die Such-API finden Sie in den Partnerressourcen von Apple, obwohl die API für jeden verfügbar gemacht wird (nicht nur registrierte Partner). Der resultierende JSON-Code kann analysiert werden, um zu ermitteln, dass es trackId sich um die Apple-ID handelt, die mit SKStoreProductViewControllerverwendet werden soll.

Die Ergebnisse enthalten auch andere Metadaten, einschließlich Anzeigeinformationen und Grafik-URLs, die zum Rendern des Produkts in Ihrer App verwendet werden können.

Im Folgenden finden Sie einige Beispiele:

Enterprise Partner-Feed

Apple bietet genehmigten Partnern ein vollständiges Datenabbild aller ihrer Produkte in Form von herunterladbaren Datenbank-fähigen Flatfiles. Wenn Sie für den Zugriff auf den Enterprise Partner Feed berechtigt sind, finden Sie die Apple-ID für jedes Produkt in diesem Dataset.

Viele Benutzer des Enterprise-Partnerfeeds sind Mitglieder des Partnerprogramms, mit dem Provisionen bei Produktverkäufen erzielt werden können. SKStoreProductViewController unterstützt keine Partner-IDs (zum Zeitpunkt des Schreibens).

Die Apple-ID für ein Produkt kann von ihrem iTunes Preview-URL-Link abgeleitet werden. Suchen Sie in allen iTunes-Produktlinks (für Apps, Musik oder Bücher) den Teil der URL, der mit id der folgenden Nummer beginnt, und verwenden Sie die folgende Nummer.

Beispielsweise ist der direkte Link zu iBooks

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

und die Apple-ID ist 364709193. Ähnlich wie bei der MWC2012-App ist der direkte Link

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

und die Apple-ID ist 496963922.

In-App-Kauf gehosteter Inhalte

Wenn Ihre In-App-Käufe aus herunterladbaren Inhalten (z. B. Büchern oder anderen Medien, Spiel-Level-Kunst und Konfiguration oder anderen großen Dateien) bestehen, mussten diese Dateien auf Ihrem Webserver gehostet werden, und Apps mussten Code integrieren, um sie nach dem Kauf sicher herunterzuladen. Ab iOS 6 hosten Apple Ihre Dateien auf ihren Servern und entfernt die Notwendigkeit eines separaten Servers. Das Feature ist nur für nicht konsumierbare Produkte (nicht für Verbrauchsartikel oder Abonnements) verfügbar. Zu den Vorteilen der Verwendung des Apple-Hostingdiensts gehören:

  • Sparen Sie Hosting- und Bandbreitenkosten.
  • Wahrscheinlich skalierbarer als der serverhost, den Sie derzeit verwenden.
  • Weniger Code zum Schreiben, da Sie keine serverseitige Verarbeitung erstellen müssen.
  • Das Herunterladen des Hintergrunds ist für Sie implementiert.

Hinweis: Das Testen gehosteter In-App-Kaufinhalte in iOS Simulator wird nicht unterstützt, daher müssen Sie mit einem echten Gerät testen.

Grundlagen für gehostete Inhalte

Vor iOS 6 gab es zwei Möglichkeiten, ein Produkt bereitzustellen (ausführlicher in der In-App-Kaufdokumentation von Xamarin beschrieben):

  • Integrierte Produkte – Features, die durch den Kauf "entsperrt" sind, aber in die Anwendung integriert sind (entweder als Code oder eingebettete Ressourcen). Beispiele für integrierte Produkte sind entsperrte Fotofilter oder In-Game-Power-Ups.
  • Vom Server bereitgestellte Produkte – Nach dem Kauf muss die Anwendung Inhalte von einem Server herunterladen, den Sie betreiben. Dieser Inhalt wird während des Kaufs heruntergeladen, auf dem Gerät gespeichert und dann als Teil der Bereitstellung des Produkts gerendert. Beispiele sind Bücher, Magazinprobleme oder Spielebenen, die aus Hintergrundkunst- und Konfigurationsdateien bestehen.

In iOS 6 bietet Apple eine Variante von vom Server bereitgestellten Produkten: Sie hosten Ihre Inhaltsdateien auf ihren Servern. Dadurch ist es viel einfacher, vom Server bereitgestellte Produkte zu erstellen, da Sie keinen separaten Server betreiben müssen, und das Store Kit bietet Hintergrunddownloadfunktionen, die Sie zuvor selbst schreiben mussten. Um das Hosting von Apple zu nutzen, aktivieren Sie das Hosting von Inhalten für neue In-App-Kaufprodukte, und ändern Sie Ihren Store Kit-Code, um ihn zu nutzen. Produktinhaltsdateien werden dann mit Xcode erstellt und zur Überprüfung und Veröffentlichung auf apple-Server hochgeladen.

Der Build- und Bereitstellungsprozess

Die Verwendung des App Store zum Bereitstellen des In-App-Einkaufs mit gehosteten Inhalten erfordert die folgende Einrichtung und Konfiguration:

  • iTunes Connect – Sie müssen Ihre Bank- und Steuerinformationen Apple zur Verfügung gestellt haben, damit sie in Ihrem Auftrag gesammelte Gelder übermitteln können. Anschließend können Sie Produkte für den Verkauf konfigurieren und Sandkastenbenutzerkonten zum Testen des Einkaufs einrichten. Sie müssen auch gehostete Inhalte für diese nicht konsumierbaren Produkte konfigurieren, die Sie mit Apple hosten möchten.
  • iOS-Bereitstellungsportal – Erstellen eines Bündelbezeichners und Aktivieren des App Store-Zugriffs für Ihre App wie für jede Anwendung, die den In-App-Einkauf unterstützt.
  • Store Kit – Hinzufügen von Code zu Ihrer App zum Anzeigen von Produkten, Kaufprodukten und Wiederherstellen von Transaktionen. Im iOS 6 Store Kit wird auch das Herunterladen Ihrer Produktinhalte im Hintergrund mit Statusupdates verwaltet.
  • Benutzerdefinierter Code – Um Einkäufe von Kunden nachzuverfolgen und die produkte oder Dienste bereitzustellen, die sie gekauft haben. Verwenden Sie neue iOS 6 Store Kit-Klassen, SKDownload um die von Apple gehosteten Inhalte abzurufen.

In den folgenden Abschnitten wird erläutert, wie gehostete Inhalte mithilfe des Beispielcodes für diesen Artikel implementiert werden, vom Erstellen und Hochladen des Pakets zum Verwalten des Kauf- und Downloadprozesses.

Beispielcode

Das Beispielprojekt HostedNonConsumables (in StoreKitiOS6.zip) verwendet gehostete Inhalte. Die App bietet zwei "Buchkapitel" zum Verkauf, die Inhalte, die auf Apple-Servern gehostet werden. Der Inhalt besteht aus einer Textdatei und einem Bild, obwohl viel komplexere Inhalte in einer echten Anwendung verwendet werden können.

Die App sieht wie folgt aus, während und nach einem Kauf:

Die App sieht vor, während und nach einem Kauf wie folgt aus:

Die Textdatei und das Bild werden heruntergeladen und in das Verzeichnis "Dokumente" der Anwendung kopiert. Weitere Informationen zu den verschiedenen Verzeichnissen, die für den Anwendungsspeicher verfügbar sind, finden Sie in der Dokumentation zum Dateisystem.

iTunes Connect

Wenn Sie neue Produkte erstellen, die das Hosting von Apple-Inhalten verwenden, müssen Sie unbedingt den Produkttyp "Nicht konsumierbar " auswählen. Andere Produkttypen unterstützen das Hosten von Inhalten nicht. Außerdem sollten Sie das Hosten von Inhalten für vorhandene Produkte, die Sie verkaufen, nicht aktivieren. Aktivieren Sie nur das Hosting von Inhalten für neue Produkte.

Wählen Sie den Produkttyp

Geben Sie eine Produkt-ID ein. Diese ID wird später benötigt, wenn Sie den Inhalt für dieses Produkt erstellen.

Geben Sie eine Produkt-ID ein.

Inhaltshosting wird im Abschnitt "Details" festgelegt. Deaktivieren Sie vor dem Live-Kauf des In-App-Kaufs das Kontrollkästchen "Hostinhalt mit Apple ", wenn Sie den Vorgang abbrechen möchten (auch wenn Sie einige Testinhalte hochgeladen haben). Inhaltshosting kann jedoch nicht entfernt werden, nachdem der In-App-Kauf live gegangen ist.

Hosten von Inhalten mit Apple

Nachdem Sie das Hosten von Inhalten aktiviert haben, gibt das Produkt "Auf Upload-Status warten" ein und zeigt diese Meldung an:

Das Produkt wechselt in den Status

Das Inhaltspaket sollte mit Xcode erstellt und mithilfe des Archivtools hochgeladen werden. Anweisungen zum Erstellen von Inhaltspaketen finden Sie im nächsten Abschnitt Erstellen. PKG-Dateien.

Erstellend. PKG-Dateien

Die Inhaltsdateien, die Sie auf Apple hochladen, müssen die folgenden Einschränkungen erfüllen:

  • Die Größe von 2 GB kann nicht überschritten werden.
  • Ausführbarer Code (oder Symlinks, die außerhalb des Inhalts verweisen) kann nicht enthalten sein.
  • Muss ordnungsgemäß formatiert sein (einschließlich einer PLIST-Datei ) und über eine .pkg Dateierweiterung verfügen. Dies erfolgt automatisch, wenn Sie diese Anweisungen mit Xcode befolgen.

Sie können viele verschiedene Dateien und Dateitypen hinzufügen, solange sie diese Einschränkungen erfüllen. Der Inhalt wird vor der Übermittlung an Ihre Anwendung gezippt und vom Store Kit entzippt, bevor ihr Code darauf zugreift.

Nach dem Hochladen eines Inhaltspakets kann es durch neuere Inhalte ersetzt werden. Neue Inhalte müssen hochgeladen und zur Überprüfung/Genehmigung über den normalen Prozess übermittelt werden. Erhöhen Sie das ContentVersion Feld in aktualisierten Inhaltspaketen, um anzugeben, dass es neuer ist.

Xcode-In-App-Einkaufsinhaltsprojekte

Das Erstellen von Inhaltspaketen für In-App-Kaufprodukte erfordert derzeit Xcode. Es ist keine OBJECTIVE-C Codierung erforderlich; Xcode verfügt über einen neuen Projekttyp für diese Pakete, die nur Ihre Dateien und eine plist enthalten.

Unsere Beispielanwendung enthält Buchkapitel zum Verkauf – jedes Kapitel-Inhaltspaket enthält:

  • eine Textdatei und
  • ein Bild, das das Kapitel darstellt.

Wählen Sie >", und wählen Sie "In-App-Kaufinhalt" aus:

Auswählen von In-App-Kaufinhalten

Geben Sie den Produktnamen und den Firmenbezeichner ein, sodass der Bündelbezeichner mit der Produkt-ID übereinstimmt, die Sie in iTunes Connect für dieses Produkt eingegeben haben.

Geben Sie den Namen und den Bezeichner ein.

Jetzt haben Sie ein leeres In-App-Kaufinhaltsprojekt . Sie können mit der rechten Maustaste klicken und Dateien hinzufügen... oder sie in den Project Navigator ziehen. Stellen Sie sicher, dass die ContentVersion korrekt ist (sie sollte bei 1.0 beginnen, aber wenn Sie später ihre Inhalte aktualisieren, denken Sie daran, sie zu erhöhen).

Dieser Screenshot zeigt Xcode mit den im Projekt enthaltenen Inhaltsdateien und den im Hauptfenster sichtbaren plist-Einträgen:

Dieser Screenshot zeigt Xcode mit den im Projekt enthaltenen Inhaltsdateien und den im Hauptfenster sichtbaren plist-Einträgen.

Nachdem Sie alle Ihre Inhaltsdateien hinzugefügt haben, können Sie dieses Projekt speichern und später erneut bearbeiten oder den Uploadvorgang starten.

Hochladen. PKG-Dateien

Die einfachste Möglichkeit zum Hochladen von Inhaltspaketen ist das Xcode-Archivtool. Wählen Sie "Produktarchiv > " aus dem Menü aus, um zu beginnen:

Archivierung auswählen

Das Inhaltspaket wird dann wie unten dargestellt im Archiv angezeigt. Der Archivtyp und das Symbol zeigen diese Zeile als Inhaltsarchiv für In-App-Einkäufe an. Klicken Sie auf " Überprüfen..." , um unser Inhaltspaket auf Fehler zu überprüfen, ohne den Upload tatsächlich auszuführen.

Überprüfen des Pakets

Melden Sie sich mit Ihren iTunes Connect-Anmeldeinformationen an:

Melden Sie sich mit Ihren iTunes Connect-Anmeldeinformationen an

Wählen Sie die richtige Anwendung und den In-App-Kauf aus, um diesen Inhalt zuzuordnen:

Wählen Sie die richtige Anwendung und den In-App-Kauf aus, um diesen Inhalt zuzuordnen.

Es sollte eine Meldung wie dieser Screenshot angezeigt werden:

Beispiel: Meldung

Führen Sie nun einen ähnlichen Prozess durch, aber klicken Sie auf "Verteilen". Die Inhalte werden tatsächlich hochgeladen.

Die App verteilen

Wählen Sie die erste Option aus, um den Inhalt hochzuladen:

Hochladen des Inhalts

Melden Sie sich erneut an:

Anmelden

Wählen Sie den richtigen Anwendungs- und In-App-Kaufdatensatz aus, um den Inhalt hochzuladen in:

Auswählen des Anwendungs- und In-App-Kaufdatensatzes

Warten Sie, während Ihre Dateien hochgeladen werden:

Das Dialogfeld zum Hochladen von Inhalten

Wenn der Upload abgeschlossen ist, wird eine Meldung angezeigt, die Sie darauf hinweist, dass der Inhalt an den App Store übermittelt wurde.

Beispiel für einen erfolgreichen Upload einer Nachricht

Sobald dies geschehen ist, werden bei der Rückkehr zur Produktseite auf iTunes Connect die Paketdetails angezeigt und sich im Status "Bereit zum Absenden " befinden. Wenn sich das Produkt in diesem Status befindet, können Sie mit dem Testen in der Sandkastenumgebung beginnen. Sie müssen das Produkt nicht zum Testen im Sandkasten "übermitteln".

iTunes Connect zeigt die Paketdetails an und befindet sich im Status

Es kann einige Zeit dauern (z. B. ein paar Minuten), zwischen dem Hochladen des Archivs und dem iTunes Connect-Status, der aktualisiert wird. Sie können das Produkt separat zur Überprüfung übermitteln oder es in Verbindung mit einer Anwendungs-Binärdatei übermitteln. Erst nachdem Apple den Inhalt offiziell genehmigt hat, wird er im Produktions-App Store zum Kauf in Ihrer App verfügbar sein.

PKG-Dateiformat

Die Verwendung von Xcode und das Archivtool zum Erstellen und Hochladen eines gehosteten Inhaltspakets bedeutet, dass der Inhalt des Pakets selbst nie angezeigt wird. Die Dateien und Verzeichnisse in den paketen, die für die Beispiel-App erstellt wurden, sehen wie der folgende Screenshot aus, mit der Plist-Datei im Stammverzeichnis und den Produktdateien in einem Unterverzeichnis "Inhalt ":

Die plist-Datei im Stammverzeichnis und die Produktdateien in einem Unterverzeichnis

Beachten Sie die Verzeichnisstruktur des Pakets (insbesondere den Speicherort der Dateien im Contents Unterverzeichnis), da Sie diese Informationen verstehen müssen, um die Dateien aus dem Paket auf dem Gerät zu extrahieren.

Aktualisieren des Paketinhalts

Das Verfahren zum Aktualisieren von Inhalten nach der Genehmigung:

  • Bearbeiten Sie das In-App-Einkaufsinhaltsprojekt in Xcode.
  • Aufstoßen Sie die Versionsnummer nach oben.
  • Laden Sie erneut in iTunes Connect hoch. Nachfolgende Käufer erhalten automatisch die neueste Version, ABER Benutzer, die bereits über die alte Version verfügen, erhalten keine Benachrichtigung.
  • Ihre App ist dafür verantwortlich, Benutzer zu benachrichtigen und sie zu ermutigen, eine neuere Version des Inhalts abzurufen. Die App muss auch eine Funktion erstellen, die die neue Version herunterlädt, indem sie das Feature "Wiederherstellen" des Store Kit verwendet.
  • Um festzustellen, ob eine neuere Version vorhanden ist, können Sie ein Feature in Ihrer App erstellen, um SKProducts abzurufen (z. B. denselben Prozess, der zum Abrufen von Produktpreisen verwendet wird), und die ContentVersion-Eigenschaft vergleichen.

Einkaufsübersicht

Lesen Sie vor dem Lesen dieses Abschnitts die vorhandene Dokumentation zum In-App-Kauf.

Die Abfolge von Ereignissen, die auftreten, wenn ein Produkt mit gehosteten Inhalten gekauft und heruntergeladen wird, wird in diesem Diagramm veranschaulicht:

Die Abfolge von Ereignissen, die auftreten, wenn ein Produkt mit gehosteten Inhalten gekauft und heruntergeladen wird

  1. Neue Produkte können in iTunes Connect mit aktivierten gehosteten Inhalten erstellt werden. Der eigentliche Inhalt wird separat in Xcode erstellt (so einfach wie das Ziehen von Dateien in einen Ordner) und dann archiviert und in iTunes hochgeladen (es ist keine Codierung erforderlich). Jedes Produkt wird dann zur Genehmigung eingereicht, nach der es zum Kauf zur Verfügung steht. Im Beispielcode sind diese Produkt-IDs hartcodiert, das Hosten von Inhalten mit Apple ist jedoch flexibler, wenn Sie die verfügbare Produktliste auf einem Remoteserver speichern, damit sie aktualisiert werden kann, wenn Sie neue Produkte und Inhalte an iTunes Connect übermitteln.
  2. Wenn der Benutzer ein Produkt kauft, wird eine Transaktion zur Verarbeitung in der Zahlungswarteschlange platziert.
  3. Store Kit leitet die Kaufanforderung zur Verarbeitung an iTunes-Server weiter.
  4. Die Transaktion wird auf den iTunes-Servern abgeschlossen (z. B. der Kunde wird belastet), und eine Bestätigung wird an die App zurückgegeben, wobei Produktinformationen angefügt sind, einschließlich des Herunterladbaren (und falls ja, der Dateigröße und anderer Metadaten).
  5. Ihr Code sollte überprüfen, ob das Produkt heruntergeladen werden kann, und falls ja, eine Inhaltsdownloadanforderung vornehmen, die auch in der Zahlungswarteschlange platziert wird. Store Kit sendet diese Anforderung an die iTunes-Server.
  6. Server gibt Inhaltsdatei an das Store Kit zurück, das einen Rückruf zum Zurückgeben des Downloadfortschritts und der verbleibenden Zeit für Ihren Code bereitstellt.
  7. Nach Abschluss erhalten Sie eine Benachrichtigung und übergeben einen Dateispeicherort im Cacheordner.
  8. Ihr Code sollte die Dateien kopieren und überprüfen, alle Zustände speichern, die Sie daran denken müssen, dass das Produkt gekauft wurde. Nutzen Sie diese Gelegenheit, um das Sicherungsflagge auf den neuen Dateien richtig festzulegen (Hinweis: Wenn sie von einem Server stammen und nie vom Benutzer bearbeitet werden, sollten Sie sie wahrscheinlich überspringen, da der Benutzer sie in Zukunft immer von Apple-Servern abrufen kann).
  9. Call FinishTransaction. Dieser Schritt ist WICHTIG, da die Transaktion aus der Zahlungswarteschlange entfernt wird. Es ist auch wichtig, dass Sie "FinishTransaction" erst aufrufen, nachdem Sie den Inhalt aus dem Cacheverzeichnis kopiert haben. Sobald Sie FinishTransaction aufrufen, werden die zwischengespeicherten Dateien wahrscheinlich schnell gelöscht.

Implementieren des Kaufs gehosteter Inhalte

Die folgenden Informationen sollten zusammen mit der vollständigen Dokumentation zu In-App-Käufen gelesen werden. Die Informationen in diesem Dokument konzentrieren sich auf die Unterschiede zwischen gehosteten Inhalten und der vorherigen Implementierung.

Klassen

Die folgenden Klassen wurden hinzugefügt oder geändert, um gehostete Inhalte in iOS 6 zu unterstützen:

  • SKDownload – Neue Klasse, die einen laufenden Download darstellt. Die API ermöglicht mehr als ein Produkt, aber zunächst wurde nur eine implementiert.
  • SKProduct – Neue Eigenschaften hinzugefügt: Downloadable, ContentVersion, ContentLengths Array.
  • SKPaymentTransaction – Neue Eigenschaft hinzugefügt: Downloads, die eine Sammlung von SKDownload Objekten enthält, wenn dieses Produkt Inhalte zum Download zur Verfügung gestellt hat.
  • SKPaymentQueue – Neue Methode hinzugefügt: StartDownloads. Rufen Sie diese Methode mit SKDownload Objekten auf, um ihre gehosteten Inhalte abzurufen. Der Download kann im Hintergrund erfolgen.
  • SKPaymentTransactionObserver – Neue Methode: UpdateDownloads. Store Kit ruft diese Methode mit Statusinformationen zu aktuellen Downloadvorgängen auf.

Details zur neuen SKDownload Klasse:

  • Fortschritt – Ein Wert zwischen 0 und 1, den Sie verwenden können, um dem Benutzer einen Prozentwert anzuzeigen. Do NOT use Progress == 1 to detect whether the download is complete, check for State == Finished.
  • TimeRemaining – Schätzung der verbleibenden Downloadzeit in Sekunden. -1 bedeutet, dass die Schätzung noch berechnet wird.
  • Status – Aktiv, Warten, Fertig, fehlgeschlagen, angehalten, abgebrochen.
  • ContentURL – Dateispeicherort, an dem der Inhalt auf dem Datenträger gespeichert wurde, im Cache Verzeichnis. Nur aufgefüllt, nachdem der Download abgeschlossen ist.
  • Fehler – Überprüfen Sie diese Eigenschaft, wenn der Status fehlgeschlagen ist.

Die Interaktionen zwischen den Klassen im Beispielcode werden in diesem Diagramm dargestellt (der Code, der für gehostete Inhaltskäufe spezifisch ist, wird grün dargestellt):

Gehostete Inhaltskäufe werden in diesem Diagramm grün angezeigt.

Der Beispielcode, in dem diese Klassen verwendet wurden, wird im restlichen Teil dieses Abschnitts angezeigt:

CustomPaymentObserver (SKPaymentTransactionObserver)

Ändern Sie die vorhandene UpdatedTransactions Außerkraftsetzung, um nach herunterladbaren Inhalten zu suchen, und rufen Sie bei Bedarf auf 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;
        }
    }
}

Die neue überschriebene Methode UpdatedDownloads wird unten angezeigt. Store Kit ruft diese Methode auf, nachdem StartDownloads sie UpdatedTransactionsausgelöst wurde. Diese Methode wird mehrmals in unbestimmten Intervallen aufgerufen, um Ihnen den Downloadfortschritt und dann erneut nach Abschluss des Downloads zu ermöglichen. Beachten Sie, dass die Methode ein Array von SKDownload Objekten akzeptiert, sodass jeder Methodenaufruf Ihnen den Status mehrerer Downloads in der Warteschlange bereitstellen kann. Wie in der Implementierung unterhalb der Downloadstatus gezeigt, werden jedes Mal überprüft und entsprechende Maßnahmen ergriffen.

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

Diese Klasse enthält eine neue Methode SaveDownload , die aufgerufen wird, nachdem jeder Download erfolgreich abgeschlossen wurde.

Der gehostete Inhalt wurde erfolgreich heruntergeladen und in das Cache Verzeichnis entzippt. Die Struktur der . Für die PKG-Datei müssen alle Dateien in einem Contents Unterverzeichnis gespeichert werden, sodass der folgende Code Dateien aus dem Contents Unterverzeichnis extrahiert.

Der Code durchläuft alle Dateien im Inhaltspaket und kopiert sie in das Documents Verzeichnis, in einem Unterordner mit dem Namen für die ProductIdentifier. Schließlich wird die Transaktion aufgerufen, die aufruftCompleteTransactionFinishTransaction, um die Transaktion aus der Zahlungswarteschlange zu entfernen.

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

Wenn FinishTransaction sie aufgerufen wird, werden die heruntergeladenen Dateien nicht mehr im Cache Verzeichnis gespeichert. Alle Dateien sollten vor dem Aufrufen FinishTransactionkopiert werden.

Weitere Überlegungen

Der obige Beispielcode veranschaulicht eine ziemlich einfache Implementierung des Kaufs gehosteter Inhalte. Es gibt einige zusätzliche Punkte, die Sie berücksichtigen müssen:

Erkennen aktualisierter Inhalte

Obwohl es möglich ist, Ihre gehosteten Inhaltspakete zu aktualisieren, bietet Das Store Kit keinen Mechanismus, um diese Updates an Benutzer zu übertragen, die das Produkt bereits heruntergeladen und erworben haben. Um diese Funktionalität zu implementieren, überprüft Ihr Code möglicherweise regelmäßig die neue SKProduct.ContentVersion Eigenschaft (sofern dies SKProduct der Fall ist Downloadable), und erkennen Sie, ob der Wert erhöht wird. Alternativ können Sie ein Pushbenachrichtigungssystem erstellen.

Installieren aktualisierter Inhaltsversionen

Der obige Beispielcode überspringt das Kopieren der Datei, wenn die Datei bereits vorhanden ist. Dies ist KEINE gute Idee, wenn Sie neuere Versionen des heruntergeladenen Inhalts unterstützen möchten.

Eine Alternative besteht darin, den Inhalt in einen Ordner mit dem Namen der Version zu kopieren und nachzuverfolgen, welche Version die aktuelle Version ist (z. B. in NSUserDefaults oder überall dort, wo Sie abgeschlossene Kaufdatensätze speichern).

Wiederherstellen von Transaktionen

Beim SKPaymentQueue.DefaultQueue.RestoreCompletedTransactions Aufrufen gibt das Store Kit alle vorherigen Transaktionen für den Benutzer zurück. Wenn sie eine große Anzahl von Elementen erworben haben oder jeder Kauf über große Inhaltspakete verfügt, kann die Wiederherstellung zu einem großen Netzwerkdatenverkehr führen, da alles gleichzeitig für den Download in die Warteschlange gestellt wird.

Erwägen Sie, nachzuverfolgen, ob ein Produkt separat vom tatsächlichen Download des zugehörigen Inhaltspakets erworben wurde.

Anhalten, Neustarten und Abbrechen von Downloads

Obwohl der Beispielcode dieses Feature nicht veranschaulicht, ist es möglich, gehostete Inhaltsdownloads anzuhalten und neu zu starten. Die SKPaymentQueue.DefaultQueue Methoden für PauseDownloadsResumeDownloads und CancelDownloads.

Wenn der Code vor dem Download FinishTransaction die Zahlungswarteschlange aufruftFinished, wird dieser Download automatisch abgebrochen.

Festlegen des SKIP-Backup-Flags für den heruntergeladenen Inhalt

Die iCloud-Sicherungsrichtlinien von Apple schlagen vor, dass Nicht-Benutzer-Inhalte, die problemlos von einem Server wiederhergestellt werden können, nicht gesichert werden sollten (da es unnötigerweise iCloud-Speicher verwendet). Weitere Informationen zum Festlegen des Sicherungsattributes finden Sie in der Dokumentation zum Dateisystem .

Zusammenfassung

Dieser Artikel hat zwei neue Features des Store Kit in iOS6 eingeführt: den Kauf von iTunes und anderen Inhalten aus Ihrer App und die Verwendung des Apple-Servers zum Hosten eigener In-App-Käufe. Diese Einführung sollte in Verbindung mit der vorhandenen In-App-Kaufdokumentation zur vollständigen Abdeckung der Implementierung der Store Kit-Funktionalität gelesen werden.