Partager via


Modifications apportées à StoreKit dans iOS 6

iOS 6 a introduit deux modifications apportées à l’API du Kit Store : la possibilité d’afficher des produits iTunes (et App Store/iBookstore) à partir de votre application et une nouvelle option d’achat dans l’application où Apple hébergera vos fichiers téléchargeables. Ce document explique comment implémenter ces fonctionnalités avec Xamarin.iOS.

Les principales modifications apportées au Kit Store dans iOS6 sont les deux nouvelles fonctionnalités suivantes :

  • Affichage du contenu dans l’application et achat : les utilisateurs peuvent acheter et télécharger des applications, de la musique, des livres et d’autres contenus iTunes sans quitter votre application. Vous pouvez également créer un lien vers vos propres applications pour promouvoir l’achat ou encourager simplement les avis et les évaluations.
  • Contenu hébergé dans l’achat d’applications : Apple stocke et remet le contenu associé à vos produits d’achat dans l’application, ce qui supprime la nécessité d’un serveur distinct pour héberger vos fichiers, prend automatiquement en charge le téléchargement en arrière-plan et vous permet d’écrire moins de code.

Reportez-vous aux guides d’achat dans l’application pour obtenir une couverture détaillée des API StoreKit.

Spécifications

Les fonctionnalités du Kit Store décrites dans ce document nécessitent iOS 6 et Xcode 4.5, ainsi que Xamarin.iOS 6.0.

Affichage du contenu dans l’application & Achat

La nouvelle fonctionnalité d’achat dans l’application dans iOS permet aux utilisateurs d’afficher les informations sur le produit et d’acheter ou de télécharger le produit à partir de votre application. Auparavant, les applications devrez déclencher iTunes, l’App Store ou l’iBookstore, ce qui entraînerait la sortie de l’application d’origine par l’utilisateur. Cette nouvelle fonctionnalité retourne automatiquement l’utilisateur à votre application lorsqu’il est terminé.

Revenir automatiquement à une application après l’achat

Voici quelques exemples de la façon dont cela peut être utilisé :

  • Encourager les utilisateurs à évaluer votre application : vous pouvez ouvrir la page App Store afin que l’utilisateur puisse évaluer et examiner votre application sans la quitter.
  • Applications de promotion croisée : autoriser l’utilisateur à voir les autres applications que vous publiez, avec la possibilité d’acheter/télécharger immédiatement.
  • Aidez les utilisateurs à trouver et télécharger du contenu : aidez les utilisateurs à acheter du contenu que votre application trouve, gère ou agrège (par exemple, une application liée à la musique peut fournir une playlist de chansons et permettre à chaque chanson d’être achetée à partir de l’application).

Une fois que l’utilisateur SKStoreProductViewController a été affiché, il peut interagir avec les informations sur le produit comme s’il était dans iTunes, dans l’App Store ou dans iBookstore. L’utilisateur peut :

  • Afficher des captures d’écran (pour les applications),
  • Exemples de chansons ou de vidéos (pour la musique, les émissions de télévision et les films),
  • Lire (et écrire) révisions,
  • Achat & téléchargement, qui se produit entièrement dans le contrôleur de vue et le Kit Store.

Certaines options de l’application SKStoreProductViewController forceront toujours l’utilisateur à quitter votre application et à ouvrir l’application store appropriée, par exemple en cliquant sur Produits connexes ou sur le lien Support d’une application.

SKStoreProductViewController

L’API permettant d’afficher un produit au sein d’une application est simple : elle nécessite uniquement que vous créez et affichez un SKStoreProductViewController. Procédez comme suit pour créer et afficher un produit :

  1. Créez un StoreProductParameters objet pour passer des paramètres au contrôleur de vue, y compris dans productId le constructeur.
  2. Instanciez le SKProductViewController. Affectez-le à un champ de niveau classe.
  3. Affectez un gestionnaire à l’événement du contrôleur de Finished vue, qui doit ignorer le contrôleur de vue. Cet événement est appelé lorsque l’utilisateur appuie sur annuler ; ou finalise une transaction à l’intérieur du contrôleur de vue.
  4. Appelez la LoadProduct méthode en passant le StoreProductParameters gestionnaire de saisie semi-automatique et de saisie semi-automatique. Le gestionnaire d’achèvement doit case activée que la demande de produit a été correctement établie et, le cas échéant, présenter le SKProductViewController mode. La gestion des erreurs appropriée doit être ajoutée si le produit ne peut pas être récupéré.

Exemple

Le projet ProductView dans l’exemple de code StoreKit pour cet article implémente une Buy méthode qui accepte l’ID Apple d’un produit et affiche le SKStoreProductViewController. Le code suivant affiche les informations sur le produit pour n’importe quel ID Apple donné :

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

L’application ressemble à la capture d’écran ci-dessous lors de l’exécution : le téléchargement ou l’achat se produit entièrement dans le SKStoreProductViewController:

L’application ressemble à ceci lors de l’exécution

Prise en charge des systèmes d’exploitation plus anciens

L’exemple d’application inclut du code qui montre comment ouvrir l’App Store, iTunes ou l’iBookstore dans les versions antérieures d’iOS. Utilisez la OpenUrl méthode pour ouvrir une URL itunes.com correctement conçue.

Vous pouvez implémenter une version case activée pour déterminer le code à exécuter, comme illustré ici :

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

Erreurs

L’erreur suivante se produit si l’ID Apple que vous utilisez n’est pas valide, ce qui peut être déroutant, car cela implique un problème de réseau ou d’authentification d’une certaine sorte.

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

Lecture Objective-C de la documentation

Les développeurs qui lisent le Kit Store sur le portail des développeurs d’Apple verront un protocole ( SKStoreProductViewControllerDelegate ) abordé par rapport à cette nouvelle fonctionnalité. Le protocole délégué n’a qu’une seule méthode : productViewControllerDidFinish, qui a été exposé en tant qu’événement Finished sur SKStoreProductViewController Xamarin.iOS.

Détermination des ID Apple

L’ID Apple requis par le SKStoreProductViewController numéro est un nombre (à ne pas confondre avec les ID groupés comme « com.xamarin.mwc2012 »). Il existe plusieurs façons de trouver l’ID Apple pour les produits que vous souhaitez afficher, répertoriés ci-dessous :

iTunes Connecter

Pour les applications que vous publiez, il est facile de trouver l’ID Apple dans iTunes Connecter :

Recherche de l’ID Apple dans iTunes Connecter

Rechercher une API

Apple fournit une API de recherche dynamique pour interroger tous les produits dans l’App Store, iTunes et iBookstore. Des informations sur l’accès à l’API de recherche sont disponibles dans les ressources d’affiliation d’Apple, bien que l’API soit exposée à n’importe qui (pas seulement les affiliés inscrits). Le JSON obtenu peut être analysé pour découvrir l’ID trackId Apple à utiliser avec SKStoreProductViewController.

Les résultats incluent également d’autres métadonnées, notamment les informations d’affichage et les URL d’illustration qui peuvent être utilisées pour afficher le produit dans votre application.

Voici quelques exemples :

Flux partenaire d’entreprise

Apple fournit aux partenaires approuvés un vidage de données complet de tous leurs produits, sous la forme de fichiers plats prêts à la base de données téléchargeables. Si vous êtes admissible à l’accès au flux Enterprise Partner, l’ID Apple de n’importe quel produit se trouve dans ce jeu de données.

De nombreux utilisateurs de Enterprise Partner Feed sont membres du programme d’affiliation qui permet aux commissions d’être obtenues sur les ventes de produits. SKStoreProductViewController ne prend pas en charge les ID affiliés (au moment de l’écriture).

L’ID Apple d’un produit peut être déduit à partir de son lien d’URL d’aperçu iTunes. Dans tous les liens de produit iTunes (pour les applications, la musique ou les livres), recherchez la partie de l’URL commençant par id et utilisez le nombre qui suit.

Par exemple, le lien direct vers iBooks est

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

et l’ID Apple est 364709193. De même pour l’application MWC2012, le lien direct est

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

et l’ID Apple est 496963922.

Contenu hébergé dans l’achat dans l’application

Si vos achats dans l’application se composent de contenu téléchargeable (par exemple, des livres ou d’autres supports, de l’art au niveau du jeu et de la configuration, ou d’autres fichiers volumineux), ces fichiers étaient utilisés pour être hébergés sur votre serveur web, et les applications devaient incorporer du code pour les télécharger en toute sécurité après l’achat. À compter d’iOS 6, Apple hébergera vos fichiers sur leurs serveurs, en supprimant la nécessité d’un serveur distinct. La fonctionnalité est disponible uniquement pour les produits non consommables (et non consommables ou abonnements). Les avantages de l’utilisation du service d’hébergement d’Apple sont les suivants :

  • Économisez les coûts d’hébergement et de bande passante.
  • Probablement plus évolutif que l’hôte de serveur que vous utilisez actuellement.
  • Moins de code à écrire, car vous n’avez pas besoin de générer de traitement côté serveur.
  • Le téléchargement en arrière-plan est implémenté pour vous.

Remarque : le test du contenu d’achat dans l’application hébergé dans iOS Simulator n’est pas pris en charge. Vous devez donc tester avec un appareil réel.

Principes de base du contenu hébergé

Avant iOS 6, il existe deux façons de fournir un produit (décrit plus en détail dans la documentation d’achat in-app de Xamarin) :

  • Produits intégrés : fonctionnalités « déverrouillées » en achetant, mais intégrées à l’application (en tant que code ou ressources incorporées). Parmi les exemples de produits intégrés, citons les filtres photo déverrouillés ou les power-ups in-game.
  • Produits livrés par le serveur : après l’achat, l’application doit télécharger du contenu à partir d’un serveur que vous utilisez. Ce contenu est téléchargé lors de l’achat, stocké sur l’appareil, puis rendu dans le cadre de la fourniture du produit. Il peut s’agir de livres, de magazines ou de niveaux de jeu constitués d’images d’arrière-plan et de fichiers de configuration.

Dans iOS 6 Apple offre une variante des produits fournis par le serveur : ils hébergeront vos fichiers de contenu sur leurs serveurs. Cela simplifie considérablement la génération de produits fournis par le serveur, car vous n’êtes pas obligé d’utiliser un serveur distinct, et Store Kit fournit des fonctionnalités de téléchargement en arrière-plan que vous deviez écrire vous-même. Pour tirer parti de l’hébergement d’Apple, activez l’hébergement de contenu pour les nouveaux produits d’achat dans l’application et modifiez le code de votre Kit Store pour en tirer parti. Les fichiers de contenu de produit sont ensuite générés à l’aide de Xcode et chargés sur les serveurs d’Apple pour révision et mise en production.

Processus de génération et de livraison

L’utilisation de l’App Store pour fournir un achat dans l’application avec du contenu hébergé nécessite l’installation et la configuration suivantes :

  • iTunes Connecter - Vous devez avoir fourni vos informations bancaires et fiscales à Apple afin qu’ils puissent verser des fonds collectés en votre nom. Vous pouvez ensuite configurer des produits pour vendre et configurer des comptes d’utilisateur bac à sable pour tester l’achat. Vous devez également configurer le contenu hébergé pour ces produits non consommables que vous souhaitez héberger avec Apple.
  • Portail d’approvisionnement iOS : création d’un identificateur de bundle et activation de l’accès App Store pour votre application, comme vous le feriez pour toute application prenant en charge l’achat dans l’application.
  • Kit Store : ajout de code à votre application pour afficher des produits, acheter des produits et restaurer des transactions. Dans le Kit iOS 6 Store, vous allez également gérer le téléchargement du contenu de votre produit, en arrière-plan, avec des mises à jour de progression.
  • Code personnalisé : pour suivre les achats effectués par les clients et fournir les produits ou services qu’ils ont achetés. Utilisez de nouvelles classes du Kit iOS 6 Store comme SKDownload pour récupérer le contenu hébergé par Apple.

Les sections suivantes expliquent comment implémenter du contenu hébergé, de la création et du chargement du package à la gestion du processus d’achat et de téléchargement, à l’aide de l’exemple de code de cet article.

Exemple de code

L’exemple de projet HostedNonConsumables (dans StoreKitiOS6.zip) utilise du contenu hébergé. L’application propose deux « chapitres de livres » à vendre, le contenu pour lequel il est hébergé sur les serveurs d’Apple. Le contenu se compose d’un fichier texte et d’une image, bien que du contenu beaucoup plus complexe puisse être utilisé dans une application réelle.

L’application ressemble à ceci avant, pendant et après un achat :

L’application ressemble à ceci avant, pendant et après un achat

Le fichier texte et l’image sont téléchargés et copiés dans le répertoire Documents de l’application. Pour plus d’informations sur les différents répertoires disponibles pour le stockage d’applications, consultez la documentation du système de fichiers.

iTunes Connect

Lorsque vous créez des produits qui utiliseront l’hébergement de contenu d’Apple, veillez à sélectionner le type de produit non consommable . Les autres types de produits ne prennent pas en charge l’hébergement de contenu. En outre, vous ne devez pas activer l’hébergement de contenu pour les produits existants que vous vendez ; activez uniquement l’hébergement de contenu pour les nouveaux produits.

Sélectionner le type de produit non consommable

Entrez un ID de produit. Cet ID sera requis ultérieurement lorsque vous créez le contenu de ce produit.

Entrer un ID de produit

L’hébergement de contenu est défini dans la section Détails. Avant l’achat dans l’application, annulez case activée le contenu hôte avec Apple case activée box si vous souhaitez annuler (même si vous avez chargé du contenu de test). Toutefois, l’hébergement de contenu ne peut pas être supprimé une fois que l’achat dans l’application a été mis en ligne.

Hébergement de contenu avec Apple

Une fois que vous avez activé le contenu d’hébergement, le produit entre en attente d’état de chargement et affiche ce message :

Le produit entre en attente d’état de chargement et affiche ce message

Le package de contenu doit être créé avec Xcode et chargé à l’aide de l’outil Archive. Les instructions relatives à la création de packages de contenu sont fournies dans la section suivante Création . Fichiers PKG.

Créer. Fichiers PKG

Les fichiers de contenu que vous chargez sur Apple doivent respecter les restrictions suivantes :

  • Impossible de dépasser 2 Go de taille.
  • Impossible de contenir du code exécutable (ou des liens symboliques qui pointent en dehors du contenu).
  • Doit être correctement mis en forme (y compris un fichier .plist ) et avoir une extension de fichier .pkg . Cette opération est effectuée automatiquement si vous suivez ces instructions à l’aide de Xcode.

Vous pouvez ajouter de nombreux fichiers et types de fichiers différents, tant qu’ils répondent à ces restrictions. Le contenu est compressé avant la remise à votre application et décompressé par Store Kit avant que votre code n’y accède.

Après avoir téléchargé un package de contenu, il peut être remplacé par du contenu plus récent. Le nouveau contenu doit être chargé et envoyé pour révision/approbation via le processus normal. Incrémentez le ContentVersion champ dans les packages de contenu mis à jour pour indiquer qu’il est plus récent.

Projets de contenu d’achat dans l’application Xcode

La création de packages de contenu pour les produits d’achat dans l’application nécessite actuellement Xcode. Aucun codage OBJECTIVE-C n’est requis ; Xcode a un nouveau type de projet pour ces packages qui contiennent simplement vos fichiers et une liste plist.

Notre exemple d’application contient des chapitres de livres à vendre : chaque package de contenu de chapitre contiendra :

  • un fichier texte et
  • image pour représenter le chapitre.

Commencez par sélectionner Fichier > nouveau projet dans le menu et en choisissant Contenu d’achat dans l’application :

Choisir le contenu d’achat dans l’application

Entrez le nom du produit et l’identificateur d’entreprise afin que l’identificateurde bundle corresponde à l’ID de produit que vous avez entré dans iTunes Connecter pour ce produit.

Entrez le nom et l’identificateur

Vous disposez maintenant d’un projet de contenu d’achat dans l’application vide. Vous pouvez cliquer avec le bouton droit et ajouter des fichiers... ou les faire glisser dans le navigateur de projet. Vérifiez que ContentVersion est correct (il doit commencer à la version 1.0, mais si vous choisissez ultérieurement de mettre à jour votre contenu, n’oubliez pas de l’incrémenter).

Cette capture d’écran montre Xcode avec les fichiers de contenu inclus dans le projet et les entrées plist visibles dans la fenêtre principale :

Cette capture d’écran montre Xcode avec les fichiers de contenu inclus dans le projet et les entrées plist visibles dans la fenêtre principale

Une fois que vous avez ajouté tous vos fichiers de contenu, vous pouvez enregistrer ce projet et le modifier ultérieurement, ou commencer le processus de chargement.

Téléchargement. Fichiers PKG

Le moyen le plus simple de charger des packages de contenu est l’outil Archive Xcode. Choisissez Archive de produit > dans le menu pour commencer :

Choisir Archiven

Le package de contenu apparaît ensuite dans l’archive, comme indiqué ci-dessous. Le type d’archive et l’icône indiquent que cette ligne est une archive de contenu d’achat dans l’application. Cliquez sur Valider... pour case activée notre package de contenu pour les erreurs sans réellement effectuer le chargement.

Valider le package

Connectez-vous avec vos informations d’identification iTunes Connecter :

Connectez-vous avec vos informations d’identification iTunes Connecter

Choisissez l’application et l’achat dans l’application appropriés pour associer ce contenu à :

Choisissez l’application et l’achat dans l’application appropriés pour associer ce contenu à

Vous devez voir un message semblable à cette capture d’écran :

Un exemple de message sans problème

Maintenant, passez par un processus similaire, mais cliquez sur Distribuer... chargera réellement le contenu.

Distribuer l’application

Sélectionnez la première option pour charger le contenu :

Charger le contenu

Reconnectez-vous :

Connexion

Choisissez l’application et l’enregistrement d’achat dans l’application appropriés pour charger le contenu dans :

Choisir l’application et l’enregistrement d’achat dans l’application

Attendez que vos fichiers soient chargés :

Boîte de dialogue de chargement de contenu

Une fois le chargement terminé, un message s’affiche pour vous informer que le contenu a été envoyé à l’App Store.

Exemple de message de chargement réussi

Une fois cela terminé, lorsque vous revenez à la page de produit sur iTunes Connecter il affiche les détails du package et se trouve dans l’état Prêt à envoyer. Lorsque le produit est dans cet état, vous pouvez commencer à tester dans l’environnement de bac à sable. Vous n’avez pas besoin de « soumettre » le produit à des fins de test dans le bac à sable.

iTunes Connecter il affiche les détails du package et se trouve dans l’état Prêt à envoyer

Il peut prendre un certain temps (par exemple, quelques minutes) entre le chargement de l’archive et l’état d’iTunes Connecter mis à jour. Vous pouvez soumettre le produit séparément ou le soumettre conjointement avec un fichier binaire d’application. Une fois que Apple a officiellement approuvé le contenu, il sera disponible dans l’App Store de production pour l’achat dans votre application.

Format de fichier PKG

L’utilisation de Xcode et de l’outil Archive pour créer et charger un package de contenu hébergé signifie que vous ne voyez jamais le contenu du package lui-même. Les fichiers et répertoires des packages créés pour l’exemple d’application ressemblent à la capture d’écran ci-dessous, avec le fichier plist dans la racine et les fichiers produits dans un sous-répertoire Contenu :

Fichier plist dans la racine et les fichiers produits dans un sous-répertoire Contenu

Notez la structure de répertoire du package (en particulier l’emplacement des fichiers dans le Contents sous-répertoire), car vous devez comprendre ces informations pour extraire les fichiers du package sur l’appareil.

Mise à jour du contenu du package

Procédure de mise à jour du contenu après son approbation :

  • Modifiez le projet de contenu d’achat dans l’application dans Xcode.
  • Augmentez le numéro de version.
  • Chargez à nouveau sur iTunes Connecter. Les acheteurs suivants recevront automatiquement la dernière version mais les utilisateurs qui ont déjà l’ancienne version ne recevront aucune notification.
  • Votre application est chargée de notifier les utilisateurs et de les encourager à récupérer une version plus récente du contenu. L’application doit également générer une fonction qui télécharge la nouvelle version à l’aide de la fonctionnalité De restauration du Kit Store.
  • Pour déterminer si une version plus récente existe, vous pouvez créer une fonctionnalité dans votre application pour extraire skProducts (par exemple, le même processus utilisé pour récupérer les prix du produit) et comparer la propriété ContentVersion.

Vue d’ensemble des achats

Avant de lire cette section, consultez la documentation existante sur l’achat dans l’application.

La séquence d’événements qui se produit lorsqu’un produit avec du contenu hébergé est acheté et que le téléchargement est illustré dans ce diagramme :

Séquence d’événements qui se produisent lorsqu’un produit avec du contenu hébergé est acheté et téléchargé

  1. Les nouveaux produits peuvent être créés dans iTunes Connecter avec le contenu hébergé activé. Le contenu réel est construit séparément dans Xcode (tout simplement en faisant glisser des fichiers dans un dossier), puis archivé et chargé dans iTunes (aucun codage n’est requis). Chaque produit est ensuite soumis pour approbation, après quoi il devient disponible pour l’achat. Dans l’exemple de code, ces ID de produit sont codés en dur, mais l’hébergement de contenu avec Apple est plus flexible si vous stockez la liste de produits disponible sur un serveur distant afin qu’il puisse être mis à jour lorsque vous envoyez de nouveaux produits et du contenu à iTunes Connecter.
  2. Lorsque l’utilisateur achète un produit, une transaction est placée dans la file d’attente de paiement pour traitement.
  3. Store Kit transfère la demande d’achat aux serveurs iTunes à des fins de traitement.
  4. La transaction est effectuée sur les serveurs iTunes (par exemple, le client est facturé) et un reçu est retourné à l’application, avec des informations sur le produit jointes, notamment si elle est téléchargeable (et, le cas échéant, la taille du fichier et d’autres métadonnées).
  5. Votre code doit case activée si le produit est téléchargeable et, si tel est le cas, effectuez une demande de téléchargement de contenu qui est également placée sur la file d’attente de paiement. Le Kit Store envoie cette demande aux serveurs iTunes.
  6. Le serveur retourne le fichier de contenu dans le Store Kit, qui fournit un rappel pour retourner la progression du téléchargement et les estimations restantes restantes dans votre code.
  7. Une fois terminé, vous recevez une notification et vous avez passé un emplacement de fichier dans le dossier Cache.
  8. Votre code doit copier les fichiers et les vérifier, enregistrer tout état dont vous avez besoin pour vous rappeler que le produit a été acheté. Profitez de cette occasion pour définir correctement l’indicateur de sauvegarde sur les nouveaux fichiers (conseil : s’ils proviennent d’un serveur et ne sont jamais modifiés par l’utilisateur, vous devez probablement ignorer leur sauvegarde, car l’utilisateur peut toujours les récupérer à partir des serveurs d’Apple à l’avenir).
  9. Appelez FinishTransaction. Cette étape est IMPORTANTE car elle supprime la transaction de la file d’attente de paiement. Il est également important que vous n’appeliez PAS FinishTransaction tant que AFTER vous n’avez pas copié le contenu du répertoire cache. Une fois que vous appelez FinishTransaction, les fichiers mis en cache sont susceptibles d’être rapidement vidés.

Implémentation de l’achat de contenu hébergé

Les informations suivantes doivent être lues conjointement avec la documentation complète sur les achats dans l’application. Les informations contenues dans ce document se concentrent sur les différences entre le contenu hébergé et l’implémentation précédente.

Classes

Les classes suivantes ont été ajoutées ou modifiées pour prendre en charge le contenu hébergé dans iOS 6 :

  • SKDownload – Nouvelle classe qui représente un téléchargement en cours. L’API autorise plusieurs par produit, mais une seule a été implémentée initialement.
  • SKProduct – Nouvelles propriétés ajoutées : Downloadable, ContentVersiontableau ContentLengths .
  • SKPaymentTransaction – Nouvelle propriété ajoutée : Downloads, qui contient une collection d’objets SKDownload si ce produit a hébergé du contenu disponible en téléchargement.
  • SKPaymentQueue – Nouvelle méthode ajoutée : StartDownloads. Appelez cette méthode avec des SKDownload objets pour extraire leur contenu hébergé. Le téléchargement peut se produire en arrière-plan.
  • SKPaymentTransactionObserver – Nouvelle méthode : UpdateDownloads. Store Kit appelle cette méthode avec des informations de progression sur les opérations de téléchargement actuelles.

Détails de la nouvelle SKDownload classe :

  • Progression : valeur comprise entre 0 et 1 que vous pouvez utiliser pour afficher un indicateur de pourcentage complet à l’utilisateur. N’utilisez pas progress == 1 pour détecter si le téléchargement est terminé, case activée pour l’état == Terminé.
  • TimeRemaining : estimation de la durée de téléchargement restante, en secondes. -1 signifie qu’il calcule toujours l’estimation.
  • État : actif, en attente, terminé, en échec, suspendu, annulé.
  • ContentURL : emplacement de fichier où le contenu a été placé sur le disque, dans le Cache répertoire. Uniquement renseigné une fois le téléchargement terminé.
  • Erreur : vérifiez cette propriété si l’état a échoué.

Les interactions entre les classes de l’exemple de code sont affichées dans ce diagramme (le code spécifique aux achats de contenu hébergés est affiché en vert) :

Les achats de contenu hébergé sont affichés en vert dans ce diagramme

L’exemple de code dans lequel ces classes ont été utilisées est illustré dans le reste de cette section :

CustomPaymentObserver (SKPaymentTransactionObserver)

Modifiez le remplacement existant UpdatedTransactions en case activée pour le contenu téléchargeable et appelez StartDownloads si nécessaire :

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

La nouvelle méthode UpdatedDownloads substituée est illustrée ci-dessous. Store Kit appelle cette méthode après StartDownloads avoir été déclenchée dans UpdatedTransactions. Cette méthode est appelée plusieurs fois à intervalles indéterminés pour vous fournir la progression du téléchargement, puis à nouveau une fois le téléchargement terminé. Notez que la méthode accepte un tableau d’objets SKDownload . Chaque appel de méthode peut donc vous fournir l’état de plusieurs téléchargements dans la file d’attente. Comme indiqué dans l’implémentation ci-dessous, les états de téléchargement sont case activée tous les temps et les mesures appropriées prises.

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

Cette classe contient une nouvelle méthode SaveDownload appelée après la fin de chaque téléchargement.

Le contenu hébergé a été téléchargé avec succès et décompressé dans le Cache répertoire. Structure du . Le fichier PKG nécessite que tous les fichiers soient enregistrés dans un Contents sous-répertoire. Le code ci-dessous extrait donc les fichiers à partir du Contents sous-répertoire.

Le code itère dans tous les fichiers du package de contenu et les copie dans le Documents répertoire, dans un sous-dossier nommé pour le ProductIdentifier. Enfin, il appelle CompleteTransaction, qui appelle FinishTransaction pour supprimer la transaction de la file d’attente de paiement.

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

Lorsqu’il FinishTransaction est appelé, les fichiers téléchargés ne sont plus garantis dans le Cache répertoire. Tous les fichiers doivent être copiés avant d’appeler FinishTransaction.

Autres considérations

L’exemple de code ci-dessus illustre une implémentation assez simple de l’achat de contenu hébergé. Il existe des points supplémentaires que vous devez prendre en compte :

Détection du contenu mis à jour

Bien qu’il soit possible de mettre à jour vos packages de contenu hébergés, le Kit Store ne fournit aucun mécanisme pour envoyer ces mises à jour aux utilisateurs qui ont déjà téléchargé et acheté le produit. Pour implémenter cette fonctionnalité, votre code peut case activée la nouvelle SKProduct.ContentVersion propriété (le cas SKProductDownloadableéchéant) régulièrement et détecter si la valeur est incrémentée. Vous pouvez également créer un système de notification Push.

Installation des versions de contenu mises à jour

L’exemple de code ci-dessus ignore la copie de fichiers si le fichier existe déjà. Ce n’est pas une bonne idée si vous souhaitez prendre en charge les versions plus récentes du contenu en cours de téléchargement.

Une alternative peut être de copier le contenu dans un dossier nommé pour la version, et de suivre la version actuelle (par exemple, dans ou où NSUserDefaults vous stockez les enregistrements d’achat terminés).

Restauration des transactions

Lorsqu’il SKPaymentQueue.DefaultQueue.RestoreCompletedTransactions est appelé, store Kit retourne toutes les transactions précédentes pour l’utilisateur. S’ils ont acheté un grand nombre d’éléments ou si chaque achat a de gros packages de contenu, la restauration peut entraîner un grand nombre de trafic réseau, car tout est mis en file d’attente pour le téléchargement à la fois.

Envisagez de suivre si un produit a été acheté séparément du téléchargement réel du package de contenu associé.

Suspension, redémarrage et annulation des téléchargements

Bien que l’exemple de code ne démontre pas cette fonctionnalité, il est possible de suspendre et redémarrer les téléchargements de contenu hébergés. Il SKPaymentQueue.DefaultQueue a des méthodes pour PauseDownloads, ResumeDownloads et CancelDownloads.

Si le code appelle FinishTransaction sur la file d’attente de paiement avant le téléchargement Finished , ce téléchargement est annulé automatiquement.

Définition de l’indicateur SKIP-Backup sur le contenu téléchargé

Les instructions de sauvegarde iCloud d’Apple suggèrent que le contenu non utilisateur facilement restauré à partir d’un serveur ne doit pas être sauvegardé (car il utiliserait inutilement le stockage iCloud). Pour plus d’informations sur la définition de l’attribut de sauvegarde, consultez la documentation du système de fichiers.

Résumé

Cet article a introduit deux nouvelles fonctionnalités du Kit Store dans iOS6 : l’achat d’iTunes et d’autres contenus à partir de votre application et l’utilisation du serveur d’Apple pour héberger vos propres achats dans l’application. Cette introduction doit être lue conjointement avec la documentation existante sur l’achat dans l’application pour une couverture complète de l’implémentation de la fonctionnalité du Kit Store.