Внедрение новых функций в StoreKit

Прежде чем читать эту историю, обратите внимание, что обновленную версию [как в коде] можно найти здесь.



Большая часть шума на WWDC2020 была отдана SwiftUI 2.0 и ARKit, поэтому вы должны простить себя за то, что пропустили сейсмическое изменение в структуре StoreKit - изменение, которое сделает вашу жизнь как разработчика приложений намного проще.

Если вы читали мою статью Настройте свое приложение SwiftUI для поддержки покупок внутри приложения, то вы уже знаете половину истории. Вторая половина осталась без изменений, но Apple добавила несколько новых правил к первой половине с iOS 14. Давайте пройдемся по всему, чтобы нарисовать полную картину, на случай, если вы здесь новичок.

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

Я начну с того, что нарисую то, что хочу построить. Я хочу проиллюстрировать три типа покупок в приложении, которые вы можете совершать:

  • Расходные материалы (хватит на все время работы приложения)
  • Не расходный (теоретически, вечно)
  • Подписки (продлеваются сами)

Я тоже хочу, чтобы все было как можно проще, поэтому я собираюсь основывать свое приложение на простой идее электронного билета. Вы можете купить расходный билет, абонемент (нерасходованный билет), срок действия которого не истекает, или подписку на билет.

Давайте код. Начать нужно с создания проекта. Используйте SwiftUI в качестве пользовательского интерфейса. После создания добавьте к нему два дополнительных файла. Простой Swift и файл шаблона, который соответствует имени StoreKit Configuration:

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

  • Расходный материал
  • Не расходный
  • Автоматическое продление подписки

Добавьте по одному каждого типа и заполните данные, показанные ниже:

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

Теперь отредактируйте дополнительный файл Swift, переименуйте его в IAPManager.swift и добавьте к нему набор, содержащий идентификаторы продуктов, которые вы только что определили в конфигурации:

private let allTicketIdentifiers: Set<String> = [
"ticket.consumable",
"ticket.non-consumable",
"ticket.subscription"
]

Определив наши покупки в приложении, давайте приступим к заполнению кода шаблона, который нам понадобится для связи с платформой Apple StoreKit:

Здесь определены три метода. Первый будет запрашивать продукты, доступные в вашей «локальной» конфигурации, тогда как второй и третий проверят, что вы запрашиваете продукт, когда просите его купить. Теперь вы получите сообщение об ошибке, когда скопируете и вставите это в свой проект, потому что вы не можете установить делегата типа запроса, пока не соблюдаете протокол SKProductRequestDelegate. Вы можете сделать это с помощью этого расширения класса:

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

Теперь, определив каркас приложения IAP, мы можем реализовать простой интерфейс SwiftUI, чтобы использовать его. Мы делаем это, создавая представление, которое мы можем вызывать в стандартном ContentView() нашего интерфейса SwiftUI:

Будет представлено слово «Билеты». Если нажать, появится список с тремя типами билетов, которые вы можете купить. Обратите внимание, что для вызова также потребуется переменная State. Вот код для полноты:

Теперь, если вы просто скомпилируете и запустите это, ничего не произойдет, потому что вам нужно сообщить Xcode, что вы хотите использовать новый локальный файл конфигурации для StoreKit. Вы делаете это, редактируя схему запуска в Xcode. В Xcode 12 вы найдете возможность выбрать StoreKit Configuration файл, на который хотите сослаться. Вы можете создать несколько файлов конфигурации в своем проекте (тоже полезный вариант).

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

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

Теперь при подключении к iTunes вы были бы заблокированы на этой покупке. В новом локальном управлении этим XCode вы можете редактировать транзакции, щелкнув значок, чтобы получить доступ к диспетчеру транзакций Manage StoreKit (значок, который немного похож на лампочку в круге):

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

Попробуйте отредактировать билеты, удалив покупку, и вернитесь в симулятор, чтобы повторить попытку. Никакой записи не будет, и вы сможете повторно купить билет, срок действия которого (теоретически) никогда не истек. Я могу делать и другие вещи здесь, в журнале транзакций, например отмечать транзакцию как возврат.

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

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

Сохраняйте спокойствие, продолжайте кодировать.