Изменения в StoreKit в iOS 6

IOS 6 представила два изменения в API комплекта магазинов: возможность отображать продукты iTunes (и App Store/iBookstore) из приложения и новый вариант покупки в приложении, где Apple будет размещать скачиваемые файлы. В этом документе объясняется, как реализовать эти функции с помощью Xamarin.iOS.

Основные изменения в наборе store в iOS6 являются двумя новыми функциями:

  • Отображение и приобретение содержимого в приложении — пользователи могут покупать и скачивать приложения, музыку, книги и другое содержимое iTunes без выхода из приложения. Вы также можете связаться с собственными приложениями, чтобы повысить покупку или просто поощрять отзывы и рейтинги.
  • Размещенное в приложении содержимое — Apple будет хранить и доставлять содержимое, связанное с продуктами покупки в приложении, которое удаляет необходимость отдельного сервера для размещения файлов, автоматически поддерживает фоновую загрузку и позволяет писать меньше кода.

Дополнительные сведения о API StoreKit см. в руководствах по покупке в приложении.

Требования

Для функций комплекта магазинов, описанных в этом документе, требуется iOS 6 и Xcode 4.5, а также Xamarin.iOS 6.0.

Отображение и приобретение содержимого в приложении

Новая функция приобретения в приложении в iOS позволяет пользователям просматривать сведения о продуктах и приобретать или скачивать продукт из приложения. Ранее приложения должны активировать iTunes, App Store или iBookstore, что приведет к тому, что пользователь покидает исходное приложение. Эта новая функция автоматически возвращает пользователя в приложение после их завершения.

Automatically returning to an app after purchase

Примеры того, как это можно использовать, включают:

  • Поощряя пользователей оценить свое приложение . Вы можете открыть страницу App Store, чтобы пользователь смог оценить и просмотреть приложение, не оставив его.
  • Перекрестное продвижение приложений — разрешить пользователю видеть другие приложения, которые вы публикуете, с возможностью немедленной покупки и скачивания.
  • Помогая пользователям находить и скачивать содержимое . Помогите пользователям покупать содержимое, которое ваше приложение находит, управляет или агрегирует (например, приложение, связанное с музыкой, может предоставить список воспроизведения песен и разрешить покупку каждой песни из приложения).

SKStoreProductViewController После отображения пользователь может взаимодействовать с информацией о продукте, как будто они находились в iTunes, App Store или iBookstore. Пользователь может:

  • Просмотр снимков экрана (для приложений)
  • Примеры песен или видео (для музыки, телевизионных шоу и фильмов),
  • Чтение (и запись) отзывов,
  • Приобретение и скачивание, которое происходит полностью в контроллере представления и комплекте магазина.

Некоторые параметры в рамках SKStoreProductViewController по-прежнему принудит пользователя оставить приложение и открыть соответствующее приложение магазина, например щелкнуть связанные продукты или ссылку поддержки приложения.

SKStoreProductViewController

API для отображения продукта в любом приложении прост: это требуется только для создания и отображения SKStoreProductViewControllerпродукта. Выполните следующие действия, чтобы создать и показать продукт:

  1. StoreProductParameters Создайте объект для передачи параметров контроллеру представления, включая productId конструктор.
  2. Создание экземпляра SKProductViewController. Назначьте его полю уровня класса.
  3. Назначьте обработчик событию контроллера Finished представления, которое должно закрыть контроллер представления. Это событие вызывается, когда пользователь нажимает отмену; или в противном случае завершает транзакцию внутри контроллера представления.
  4. Вызовите метод, проходящий LoadProduct в StoreProductParameters обработчике завершения. Обработчик завершения должен проверка, что запрос на продукт успешно выполнен и, если да, представить SKProductViewController модально. Соответствующая обработка ошибок должна быть добавлена в случае, если продукт не может быть извлечен.

Пример

Проект ProductView в примере кода StoreKit для этой статьи реализует Buy метод, который принимает идентификатор Apple ID любого продукта и отображает егоSKStoreProductViewController. В следующем коде отображаются сведения о продукте для любого заданного идентификатора Apple ID:

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

Приложение выглядит так, как на снимок экрана ниже при запуске — скачивание или приобретение происходит полностью в SKStoreProductViewControllerпределах:

The app looks like this when running

Поддержка старых операционных систем

Пример приложения содержит код, показывающий, как открыть App Store, iTunes или iBookstore в более ранних версиях iOS. OpenUrl Используйте метод для правильного открытия правильно созданного URL-адреса itunes.com.

Вы можете реализовать версию проверка, чтобы определить, какой код нужно выполнить, как показано ниже.

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

ошибки

Следующая ошибка возникает, если используемый идентификатор Apple ID недействителен, что может быть запутано, так как это означает проблему сети или проверки подлинности определенного рода.

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

Чтение Objective-C документации

Разработчики, которые читают о комплекте store на портале разработчиков Apple, увидят протокол — SKStoreProductViewControllerDelegate , рассмотренный в связи с этой новой функцией. Протокол делегата имеет только один метод — productViewControllerDidFinish, который был предоставлен в качестве Finished события в SKStoreProductViewController Xamarin.iOS.

Определение идентификаторов Apple

Идентификатор Apple ID, необходимый для SKStoreProductViewController номера (не следует путать с идентификаторами пакетов, такими как com.xamarin.mwc2012). Существует несколько различных способов узнать идентификатор Apple ID для продуктов, которые вы хотите отобразить, перечисленные ниже:

iTunes Подключение

Для опубликованных приложений легко найти идентификатор Apple ID в iTunes Подключение:

Finding the Apple ID in iTunes Connect

Поиск API

Apple предоставляет динамический API поиска для запроса всех продуктов в App Store, iTunes и iBookstore. Сведения о том, как получить доступ к API поиска, можно найти в партнерских ресурсах Apple, хотя API предоставляется всем (а не только зарегистрированным филиалам). Результирующий код JSON можно проанализировать, чтобы обнаружить trackId идентификатор Apple ID для использования SKStoreProductViewController.

Результаты также включают другие метаданные, включая URL-адреса отображения сведений и рисунков, которые можно использовать для отрисовки продукта в приложении.

Далее приводятся некоторые примеры.

Корпоративный веб-канал партнеров

Apple предоставляет утвержденным партнерам полный дамп данных всех своих продуктов в виде скачиваемых неструктурированных файлов, готовых к базе данных. Если вы имеете право на доступ к Каналу партнеров Enterprise, то идентификатор Apple ID для любого продукта можно найти в этом наборе данных.

Многие пользователи Корпоративного канала партнеров являются членами партнерской программы , которая позволяет зарабатывать комиссии на продажу продуктов. SKStoreProductViewController не поддерживает идентификаторы филиалов (во время написания).

Идентификатор Apple ID для продукта можно вывести по ссылке URL-адреса iTunes Preview. В любых ссылках на продукты iTunes (для приложений, музыки или книг) найдите часть URL-адреса, начиная с id и используйте следующий номер.

Например, прямая ссылка на iBooks

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

и идентификатор Apple ID 364709193. Аналогичным образом для приложения MWC2012 прямая ссылка

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

и Идентификатор Apple ID 496963922.

Размещенное в приложении содержимое

Если покупки в приложении состоят из скачиваемого содержимого (например, книг или других носителей, искусства и конфигурации на уровне игры или других больших файлов), то эти файлы используются для размещения на веб-сервере, а приложения должны были включить код для безопасного скачивания их после покупки. Начиная с iOS 6, Apple будет размещать файлы на своих серверах, удаляя необходимость отдельного сервера. Эта функция доступна только для неиспотребляемых продуктов (не используемых или подписок). Преимущества использования службы размещения Apple включают:

  • Экономия затрат на размещение и пропускную способность.
  • Вероятно, более масштабируемый, чем любой узел сервера, который вы используете в настоящее время.
  • Меньше кода для записи, так как вам не нужно создавать обработку на стороне сервера.
  • Фоновая загрузка реализована для вас.

Примечание. Тестирование размещенного в приложении содержимого покупки в симуляторе iOS не поддерживается, поэтому необходимо протестировать с помощью реального устройства.

Основные сведения о размещенной содержимой

До iOS 6 было два способа предоставления продукта (подробно описано в документации по покупке приложений Xamarin):

  • Встроенные продукты — функции, которые "разблокированы" путем приобретения, но встроенные в приложение (как код или внедренные ресурсы). Примеры встроенных продуктов включают разблокированные фотофильтры или встроенные в игру power-ups.
  • Продукты, предоставляемые сервером . После покупки приложение должно скачать содержимое с сервера, на который вы работаете. Это содержимое загружается во время покупки, хранится на устройстве, а затем отрисовывается как часть предоставления продукта. Примеры включают книги, журналы или игровые уровни, состоящие из фонового искусства и файлов конфигурации.

В iOS 6 Apple предлагает вариант продуктов, предоставляемых сервером: они будут размещать файлы содержимого на своих серверах. Это упрощает сборку продуктов, предоставляемых сервером, так как вам не требуется работать на отдельном сервере, а комплект магазина предоставляет функции фонового скачивания, которые вы ранее должны были написать самостоятельно. Чтобы воспользоваться преимуществами размещения Apple, включите размещение контента для новых продуктов покупки в приложении и измените код комплекта магазинов, чтобы воспользоваться его преимуществами. Затем файлы содержимого продукта создаются с помощью Xcode и отправляются на серверы Apple для проверки и выпуска.

The build and deliver process

Использование App Store для предоставления покупки в приложении с размещенным содержимым требует следующей настройки и настройки:

  • iTunes Подключение . Вы должны предоставить свои банковские и налоговые сведения Apple, чтобы они могли передавать средства, собранные от вашего имени. Затем можно настроить продукты для продажи и настроить учетные записи пользователей песочницы для тестирования покупки. Необходимо также настроить размещенное содержимое для этих непотребляемых продуктов, которые вы хотите разместить в Apple.
  • Портал подготовки iOS— создание идентификатора пакета и включение доступа к App Store для приложения, так как для любого приложения, поддерживающего приобретение в приложении.
  • Комплект магазина— добавление кода в приложение для отображения продуктов, приобретения продуктов и восстановления транзакций. В комплекте магазина iOS 6 также будет управлять скачиванием содержимого продукта в фоновом режиме с обновлениями хода выполнения.
  • Пользовательский код — для отслеживания покупок, сделанных клиентами, и предоставления продуктов или услуг, которые они приобрели. Используйте новые классы комплекта для магазина iOS 6, как SKDownload получить содержимое, размещенное Apple.

В следующих разделах объясняется, как реализовать размещенное содержимое, от создания и отправки пакета для управления процессом покупки и скачивания с помощью примера кода для этой статьи.

Пример кода

Пример проекта HostedNonConsumables (в StoreKitiOS6.zip) использует размещенное содержимое. Приложение предлагает две "книги главы" для продажи, содержимое, для которого размещено на серверах Apple. Содержимое состоит из текстового файла и изображения, хотя гораздо более сложное содержимое можно использовать в реальном приложении.

Приложение выглядит следующим образом до, во время и после покупки:

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

Текстовый файл и изображение скачиваются и копируются в каталог документов приложения. Дополнительные сведения о различных каталогах, доступных для хранилища приложений, см. в документации по файловой системе.

iTunes Connect

При создании новых продуктов, которые будут использовать размещение содержимого Apple, обязательно выберите тип продукта без использования . Другие типы продуктов не поддерживают размещение контента. Кроме того, вы не должны включать размещение содержимого для существующих продуктов, которые вы продаете, только включите размещение контента для новых продуктов.

Select the Non-Consumable product type

Введите идентификатор продукта. Этот идентификатор потребуется позже при создании содержимого для этого продукта.

Enter a Product ID

Размещение содержимого задано в разделе "Сведения". Перед покупкой в приложении, не проверка содержимое узла с apple проверка box, если вы хотите отменить (даже если вы добавили некоторое тестовое содержимое). Однако размещение содержимого невозможно удалить после покупки в приложении.

Hosting content with Apple

После включения содержимого размещения продукт введет состояние ожидания отправки и отобразит следующее сообщение:

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

Пакет содержимого должен быть создан с помощью Xcode и отправлен с помощью средства архивации. Инструкции по созданию пакетов содержимого приведены в следующем разделе "Создание". PKG-файлы.

Создание. PKG-файлы

Файлы содержимого, которые вы отправляете в Apple, должны соответствовать следующим ограничениям:

  • Не может превышать 2 ГБ размера.
  • Не удается содержать исполняемый код (или симмлинки, указывающие за пределами содержимого).
  • Должен быть правильно отформатирован (включая PLIST-файл ) и иметь расширение .pkg файла. Это будет сделано автоматически, если следовать этим инструкциям с помощью Xcode.

Вы можете добавлять различные файлы и типы файлов, если они соответствуют этим ограничениям. Содержимое обновляется перед доставкой в приложение и распаковывается с помощью комплекта магазина, прежде чем ваш код обращается к нему.

После отправки пакета содержимого его можно заменить более новым содержимым. Новое содержимое должно быть отправлено и отправлено для проверки или утверждения через обычный процесс. Увеличьте ContentVersion поле в обновленных пакетах содержимого, чтобы указать, что оно является более новым.

Проекты содержимого покупки в приложении Xcode

Для создания пакетов содержимого для продуктов покупки в приложении в настоящее время требуется Xcode. Не требуется КОД НА ЯЗЫКЕ OBJECTIVE-C; Xcode имеет новый тип проекта для этих пакетов, которые просто содержат файлы и plist.

В нашем примере приложения есть главы книг для продажи. Каждый пакет содержимого главы будет содержать:

  • текстовый файл и
  • изображение, представляющее главу.

Начните с выбора файла > нового проекта в меню и выбора содержимого покупки в приложении:

Choose In-App Purchase Content

Введите имя продукта и идентификатор компании, чтобы идентификатор пакета совпадал с идентификаторомпродукта, введенным в iTunes Подключение для этого продукта.

Enter the Name and Identifier

Теперь у вас будет пустой проект содержимого покупки в приложении. Вы можете щелкнуть правой кнопкой мыши и добавить файлы... или перетащите их в навигатор проекта. Убедитесь, что ContentVersion правильно (оно должно начинаться с версии 1.0, но если вы позже решили обновить содержимое, не забудьте увеличить его).

На этом снимке экрана показан Xcode с файлами содержимого, включенными в проект, и записи списка, отображаемые в главном окне:

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

После добавления всех файлов содержимого можно сохранить этот проект и изменить его позже или начать процесс отправки.

Загрузки. PKG-файлы

Самый простой способ отправки пакетов содержимого — с помощью средства архивации Xcode. Выберите "Архив продукта" > в меню, чтобы начать:

Choose Archiven

Затем пакет содержимого появится в архиве, как показано ниже. Тип и значок архива показывают, что эта строка является архивом содержимого покупки в приложении. Нажмите кнопку "Проверить...", чтобы проверка пакет содержимого для ошибок без фактического выполнения отправки.

Validate the package

Войдите с помощью учетных данных iTunes Подключение:

Login with your iTunes Connect credentials

Выберите правильное приложение и покупку в приложении, чтобы связать это содержимое с:

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

Вы увидите сообщение, как показано на следующем снимок экрана:

An example no issues message

Теперь пройдите аналогичный процесс, но щелкнув "Распространить", фактически отправит содержимое.

Distribute the app

Выберите первый вариант, чтобы отправить содержимое:

Upload the content

Войдите еще раз:

Login in

Выберите правильное приложение и запись покупки в приложении, чтобы отправить содержимое в:

Choose the application and in-app purchase record

Дождитесь отправки файлов:

The content upload dialog

По завершении отправки появится сообщение о том, что содержимое отправлено в App Store.

An example successful upload message

Когда вы вернетесь на страницу продукта в iTunes, Подключение отобразится информация о пакете и состояние "Готово к отправке". Когда продукт находится в этом состоянии, можно начать тестирование в среде песочницы. Вам не нужно "отправить" продукт для тестирования в песочнице.

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

Это может занять некоторое время (например, несколько минут) между отправкой архива и обновлением состояния iTunes Подключение. Вы можете отправить продукт для просмотра отдельно или отправить его вместе с двоичным файлом приложения. Только после того, как Apple официально одобрила содержимое, оно будет доступно в производственном Магазине приложений для покупки в вашем приложении.

Формат PKG-файла

Использование Xcode и средства архивации для создания и отправки размещенного пакета содержимого означает, что содержимое пакета никогда не отображается. Файлы и каталоги в пакетах, созданных для примера приложения, выглядят следующим образом: plist-файл в корневом каталоге и файлах продукта в подкаталоге "Содержимое ":

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

Обратите внимание на структуру каталогов пакета (особенно расположение файлов в Contents подкаталоге), так как эти сведения необходимо понимать для извлечения файлов из пакета на устройстве.

Обновление содержимого пакета

Процедура обновления содержимого после его утверждения:

  • Измените проект содержимого покупки в приложении в Xcode.
  • Номер версии удара вверх.
  • Снова отправьте в iTunes Подключение. Последующие покупатели автоматически получат последнюю версию НО пользователи, у которых уже есть старая версия, не получат никаких уведомлений.
  • Ваше приложение отвечает за уведомление пользователей и поощрение их получения более новой версии содержимого. Приложение также должно создать функцию, которая скачивает новую версию, используя функцию восстановления комплекта магазина.
  • Чтобы определить, существует ли более новая версия, можно создать функцию в приложении, чтобы получить SKProducts (например, тот же процесс, который используется для получения цен на продукты) и сравнить свойство ContentVersion.

Обзор покупок

Перед чтением этого раздела ознакомьтесь с существующей документацией по покупке в приложении.

Последовательность событий, возникающих при приобретении продукта с размещенным содержимым, иллюстрируется на этой схеме:

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

  1. Новые продукты можно создавать в iTunes Подключение с включенным размещенным содержимым. Фактическое содержимое создается отдельно в Xcode (как просто перетаскивание файлов в папку), а затем архивировано и отправлено в iTunes (код не требуется). Затем каждый продукт отправляется на утверждение, после чего он становится доступным для покупки. В примере кода эти идентификаторы продуктов жестко закодируются, но размещение содержимого с apple является более гибким, если вы храните доступный список продуктов на удаленном сервере, чтобы его можно было обновить при отправке новых продуктов и содержимого в iTunes Подключение.
  2. Когда пользователь приобретает продукт, транзакция помещается в очередь оплаты для обработки.
  3. Пакет магазина перенаправит запрос на покупку на серверы iTunes для обработки.
  4. Транзакция завершается на серверах iTunes (например, клиент взимается), а квитанция возвращается в приложение, с информацией о продукте, включаемой, включая возможность скачивания (и если да, размер файла и другие метаданные).
  5. Код должен проверка, если продукт доступен для скачивания, и если это так, сделайте запрос на скачивание содержимого, который также помещается в очередь оплаты. Комплект магазина отправляет этот запрос на серверы iTunes.
  6. Сервер возвращает файл содержимого в пакет Store, который предоставляет обратный вызов для возврата хода загрузки и оставшегося времени оценки кода.
  7. После завершения вы получите уведомление и передали расположение файла в папке кэша.
  8. Код должен скопировать файлы и проверить их, сохраните любое состояние, которое необходимо помнить о том, что продукт был приобретен. Воспользуйтесь этой возможностью правильно задать флаг резервного копирования для новых файлов (указание: если они приходят с сервера и никогда не редактируются пользователем, возможно, следует пропустить их резервное копирование, так как пользователь всегда может получить их с серверов Apple в будущем).
  9. Вызов FinishTransaction. Этот шаг важен, так как он удаляет транзакцию из очереди оплаты. Кроме того, важно не вызывать FinishTransaction до тех пор, пока вы не скопировали содержимое из каталога кэша. После вызова FinishTransaction кэшированные файлы, скорее всего, будут быстро очищаться.

Реализация покупки размещенного содержимого

Следующие сведения должны быть прочитаны вместе с полной документацией по покупкам в приложении. Сведения в этом документе посвящены различиям между размещенным содержимым и предыдущей реализацией.

Классы

Следующие классы были добавлены или изменены для поддержки размещенного содержимого в iOS 6:

  • SKDownload — новый класс, представляющий скачиваемое скачивание. API позволяет использовать более одного продукта, однако изначально реализовано только одно.
  • SKProduct — добавлены новые свойства: Downloadable, ContentVersionContentLengths массив.
  • SKPaymentTransaction — добавлено новое свойство: Downloadsкоторое содержит коллекцию SKDownload объектов, если этот продукт размещает содержимое, доступное для скачивания.
  • SKPaymentQueue — добавлен StartDownloadsновый метод. Вызовите этот метод с SKDownload объектами, чтобы получить размещенное содержимое. Скачивание может происходить в фоновом режиме.
  • SKPaymentTransactionObserver — новый метод UpdateDownloads: . Store Kit вызывает этот метод с информацией о ходе выполнения текущих операций загрузки.

Сведения о новом SKDownload классе:

  • Ход выполнения — значение от 0 до 1, которое можно использовать для отображения индикатора процента завершения пользователю. Не используйте Progress == 1, чтобы определить, завершена ли загрузка, проверка для state == Finished.
  • TimeRemaining — оценка оставшегося времени загрузки в секундах. -1 означает, что она по-прежнему вычисляет оценку.
  • Состояние — активное, ожидание, завершение, сбой, приостановлено, отменено.
  • ContentURL — расположение файла, в котором содержимое Cache было помещено на диск, в каталоге. Заполнено только после завершения скачивания.
  • Ошибка — проверьте это свойство, если состояние не выполнено.

Взаимодействие между классами в примере кода показано на этой схеме (код, характерный для покупок размещенного содержимого, отображается зеленым цветом):

Hosted content purchases is shown in green in this diagram

Пример кода, в котором используются эти классы, показан в оставшейся части этого раздела:

CustomPaymentObserver (SKPaymentTransactionObserver)

Измените существующую UpdatedTransactions переопределение на проверка для скачиваемого содержимого и вызовите 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;
        }
    }
}

Ниже показан новый переопределенный метод UpdatedDownloads . Store Kit вызывает этот метод после StartDownloads активации UpdatedTransactions. Этот метод вызывается несколько раз в неопределенных интервалах, чтобы обеспечить ход загрузки, а затем снова после завершения скачивания. Обратите внимание, что метод принимает массив объектов, поэтому каждый вызов метода может предоставить вам состояние нескольких SKDownload скачиваемых файлов в очереди. Как показано в реализации ниже состояния загрузки, проверка каждый раз и соответствующие действия.

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

Этот класс содержит новый метод SaveDownload , который вызывается после успешного завершения каждой загрузки.

Размещенное содержимое успешно загружено и распаковано в Cache каталог. Структура . PKG-файл требует сохранения всех файлов в подкаталоге, поэтому приведенный Contents ниже код извлекает файлы из подкаталога Contents .

Код выполняет итерацию всех файлов в пакете содержимого и копирует их в Documents каталог в подпапке с именем .ProductIdentifier Наконец, он вызывает CompleteTransactionвызовы, вызывающие FinishTransaction удаление транзакции из очереди платежей.

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

При FinishTransaction вызове скачанные файлы больше не будут находиться в каталоге Cache . Перед вызовом FinishTransactionнеобходимо скопировать все файлы.

Другие вопросы

Приведенный выше пример кода демонстрирует довольно простую реализацию приобретения размещенного содержимого. Существуют некоторые дополнительные моменты, которые необходимо учитывать:

Обнаружение обновленного содержимого

Хотя вы можете обновить размещенные пакеты содержимого, пакет Store не предоставляет никакого механизма отправки этих обновлений пользователям, которые уже скачали и приобрели продукт. Чтобы реализовать эту функциональность, код может проверка нового SKProduct.ContentVersion свойства (если SKProduct это Downloadable) регулярно и определить, увеличивается ли значение. Кроме того, можно создать систему push-уведомлений.

Установка обновленных версий содержимого

Приведенный выше пример кода пропускает копирование файла, если файл уже существует. Это не рекомендуется, если вы хотите поддерживать более новые версии загружаемого содержимого.

Альтернативой может быть копирование содержимого в папку с именем версии и отслеживание текущей версии (например, в NSUserDefaults хранилище завершенных записей покупки).

Восстановление транзакций

При SKPaymentQueue.DefaultQueue.RestoreCompletedTransactions вызове комплект магазина возвращает все предыдущие транзакции для пользователя. Если они приобрели большое количество элементов, или если каждая покупка имеет большие пакеты содержимого, восстановление может привести к большому сетевому трафику, так как все становится в очереди для скачивания одновременно.

Рассмотрите возможность отслеживания того, был ли продукт приобретен отдельно от фактического скачивания связанного пакета содержимого.

Приостановка, перезапуск и отмена загрузки

Хотя пример кода не демонстрирует эту функцию, можно приостановить и перезапустить скачивание размещенного содержимого. Имеет SKPaymentQueue.DefaultQueue методы для PauseDownloads, ResumeDownloads и CancelDownloads.

Если код вызывается FinishTransaction в очереди платежей до скачивания Finished , то скачивание будет отменено автоматически.

Установка флага SKIP-Backup на скачанном содержимом

Рекомендации по резервному копированию iCloud Apple предполагают, что содержимое, отличное от пользователей, которое легко восстанавливается с сервера, не должно создавать резервную копию (так как оно не требуется использовать хранилище iCloud). Дополнительные сведения о настройке атрибута резервной копии см. в документации по файловой системе.

Итоги

В этой статье представлены две новые возможности Комплекта магазинов в iOS6: приобретение iTunes и другое содержимое из приложения и использование сервера Apple для размещения собственных покупок в приложении. Это введение должно быть прочитано вместе с существующей документацией по покупке в приложении для полного охвата реализации функций комплекта магазина.