Ä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.
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 SKStoreProductViewController
Produkt erstellen und anzeigen. Führen Sie die folgenden Schritte aus, um ein Produkt zu erstellen und anzuzeigen:
- Erstellen Sie ein
StoreProductParameters
Objekt, um Parameter an den Ansichtscontroller zu übergeben, einschließlich desproductId
im Konstruktor. - Instanziieren von
SKProductViewController
. Weisen Sie es einem Feld auf Klassenebene zu. - 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. - Rufen Sie die
LoadProduct
Methode auf, die den Abschlusshandler und denStoreProductParameters
Abschlusshandler übergibt. Der Vervollständigungshandler sollte überprüfen, ob die Produktanforderung erfolgreich war, und falls ja, dieSKProductViewController
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
:
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:
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 SKStoreProductViewController
verwendet 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:
- iBooks-App – https://itunes.apple.com/search?term=ibooks& entity=software&country=us
- Punkt und das Kangaroo iBook – https://itunes.apple.com/search?term=dot+and+the+kangaroo& entity=ebook&country=us
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).
Direkte Produktlinks
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.
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 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.
Geben Sie eine Produkt-ID ein. Diese ID wird später benötigt, wenn Sie den Inhalt für dieses Produkt erstellen.
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.
Nachdem Sie das Hosten von Inhalten aktiviert haben, gibt das Produkt "Auf Upload-Status warten" ein und zeigt diese Meldung an:
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:
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.
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:
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:
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.
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:
Es sollte eine Meldung wie dieser Screenshot angezeigt werden:
Führen Sie nun einen ähnlichen Prozess durch, aber klicken Sie auf "Verteilen". Die Inhalte werden tatsächlich hochgeladen.
Wählen Sie die erste Option aus, um den Inhalt hochzuladen:
Melden Sie sich erneut an:
Wählen Sie den richtigen Anwendungs- und In-App-Kaufdatensatz aus, um den Inhalt hochzuladen in:
Warten Sie, während Ihre Dateien hochgeladen werden:
Wenn der Upload abgeschlossen ist, wird eine Meldung angezeigt, die Sie darauf hinweist, dass der Inhalt an den App Store übermittelt wurde.
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".
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 ":
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:
- 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.
- Wenn der Benutzer ein Produkt kauft, wird eine Transaktion zur Verarbeitung in der Zahlungswarteschlange platziert.
- Store Kit leitet die Kaufanforderung zur Verarbeitung an iTunes-Server weiter.
- 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).
- 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.
- 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.
- Nach Abschluss erhalten Sie eine Benachrichtigung und übergeben einen Dateispeicherort im Cacheordner.
- 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).
- 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 vonSKDownload
Objekten enthält, wenn dieses Produkt Inhalte zum Download zur Verfügung gestellt hat. -
SKPaymentQueue – Neue Methode hinzugefügt:
StartDownloads
. Rufen Sie diese Methode mitSKDownload
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):
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 UpdatedTransactions
ausgelö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 aufruftCompleteTransaction
FinishTransaction
, 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 FinishTransaction
kopiert 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 PauseDownloads
ResumeDownloads
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.