App Store Connect API SDK в Swift: создание инструментов разработчика

от автора

Новый App Store Connect API, который был анонсирован на WWDC 2018, наконец позволил писать приложения для App Store Connect. Вы можете использовать этот API для получения метаданных приложений, TestFlight-сборок, загрузки отчетов о продажах и многого другого. Apple добавляла новые конечные точки на протяжении всех этих лет, и недавний релиз версии 2.0 не стал исключением, добавив конечные точки для отзывов клиентов и многого другого.

App Store Connect API соответствует спецификациям OpenAPI и поставляется с обширной документацией, которую предоставляет сама Apple. Спецификации OpenAPI, которые внедрила Apple, дала мне возможность реализовать работу с API в рамках App Store Connect Swift SDK во время написании Swift-приложений. Давайте же разберемся, как мы можем создавать свои инструменты разработчика с помощью этого API в Swift.

С чего следует начать

Прежде чем углубляться в примеры кода и идеи, лежащие в основе API, вам не мешало бы посмотреть соответствующие сегменты WWDC.

Доклад Automating App Store Connect с WWDC 2018 — отличная отправная точка. Если еще добавить официальную документацию Apple, то этого будет достаточно, чтобы начать работу с API.

Новые конечные точки API обычно анонсируют во время обсуждения “Что нового в App Store Connect?” в рамках WWDC, поэтому, если вас интересуют другие доклады по этой теме, вы можете посмотреть выступления с WWDC 2022, WWDC 2020, WWDC 2019 и WWDC 2018. Особое внимание следует уделить докладу Automating App Store Connect, подробно разбирающему само API.

Аутентификация в App Store Connect API

Авторизация в API происходит через веб-токены JSON (JWT) и требует персонального API-ключа из учетной записи App Store Connect вашей организации для создания токенов на предъявителя (bearer tokens).

Запрос API-ключа App Store Connect

Прежде чем вы сможете начать использовать API, вам нужно сгенерировать ключ внутри App Store Connect. Вы можете создать ключ на вкладке “Users and Access”:

Генерация ключей для аутентификации в App Store Connect API

JWT-токен требует от вас ряда параметров:

  • Issuer ID
    Идентифицирует издателя, создавшего токен аутентификации, и является одинаковым для всех ключей в рамка одной организации.

  • Key ID
    Идентификатор ключа является необязательным для веб-токенов JSON. Он может понадобиться, когда у вас есть несколько ключей для подписи токенов, и вам нужно найти правильный, чтобы проверить подпись.

  • Private Key
    Приватный ключ связан с идентификатором ключа и используется для аутентификации вас в App Store Connect API.

Подробнее об аутентифицированных запросах можно прочитать в официальной документации, но лично я считаю, что вам не нужно писать эту логику самостоятельно. Вместо этого вы можете использовать мой App Store Connect Swift SDK.

Использование App Store Connect API в Swift

Вы можете работать с App Store Connect API в Swift с помощью опенсорсного пакета App Store Connect Swift SDK. Этот SDK реализует спецификации OpenAPI и уже содержит последние конечные точки, анонсированные в рамках WWDC 2022.

Вы можете интегрировать этот пакет с помощью пакетного менеджера Swift:

dependencies: [     .package(url: "https://github.com/AvdLee/appstoreconnect-swift-sdk.git", .upToNextMajor(from: "2.0.0")) ]

Или же вы можете использовать тот же URL при добавлении пакета в Xcode.

Конечных точек API, с которыми вы можете работать, достаточно много, но в этом примере мы будем формировать простой список приложений и их Bundle Identifier:

Пример SwiftUI-приложения, использующего App Store Connect API для формирования списка приложений.

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

Начнем мы с создания новой view model, которая возьмет на себя создание провайдера API и выполнение запросов API:

final class AppsListViewModel: ObservableObject {     @Published var apps: [AppStoreConnect_Swift_SDK.App] = []      /// Перейдите на https://appstoreconnect.apple.com/access/api и создайте собственный ключ. Это также страница для поиска идентификатора приватного ключа и идентификатора издателя (issuer ID)     /// Загрузите приватный ключ и откройте его в текстовом редакторе. Удалите знаки табуляции (enters) и скопируйте содержимое в параметр приватного ключа.     func loadApps() {         Task.detached {             let request = APIEndpoint                 .v1                 .apps                 .get(parameters: .init(                     sort: [.bundleID],                     fieldsApps: [.appInfos, .name, .bundleID],                     limit: 5                 ))              do {                 let apps = try await self.provider.request(request).data                 await self.updateApps(to: apps)             } catch {                 print("Something went wrong fetching the apps: \(error)")             }         }     }      @MainActor     private func updateApps(to apps: [AppStoreConnect_Swift_SDK.App]) {         self.apps = apps     } }

SDK использует async/await и @MainActor-атрибуты, доступные в Concurrency Framework. Чтобы этот код работал должным образом, вам нужно будет добавить ваши ключи в инициализатор APIConfiguration.

Прежде чем создавать view, давайте углубимся в определенный APIEndpoint для получения списка приложений:

let request = APIEndpoint     .v1     .apps     .get(parameters: .init(         sort: [.bundleID],         fieldsApps: [.appInfos, .name, .bundleID],         limit: 5     ))

Вы можете создать APIEndpoint, следуя официальной документации. Пространство имен v1 требуется для определения версии API, которую вы хотите использовать, поскольку некоторые конечные точки стали доступны, начиная с версии 2.0.

Каждая конечная точка определяет набор методов, которые вы можете выполнять на основе поддерживаемых REST-методов. Сущности и пути будут сгенерированны опенсорсным фреймворком CreateAPI.

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

Подключение данных к SwiftUI View

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

struct AppsListView: View {     @ObservedObject var viewModel = AppsListViewModel()      var body: some View {         NavigationView {             ZStack {                 List(viewModel.apps, id: \.id) { app in                     VStack(alignment: .leading) {                         Text(app.attributes?.name ?? "Unknown name")                             .font(.headline)                         Text(app.attributes?.bundleID ?? "Unknown bundle ID")                             .font(.subheadline)                     }                 }                 ProgressView()                     .opacity(viewModel.apps.isEmpty ? 1.0 : 0.0)             }.navigationTitle("List of Apps")         }.onAppear {             viewModel.loadApps()         }     } }

Что я могу сделать с помощью этого API?

App Store Connect API содержит множество конечных точек, с которыми вы можете работать, так что ваши возможности практически безграничны! Чтобы простимулировать вашу фантазию, ниже я приведу список инструментов разработчика, которые вы можете создать:

  • Приложение для просмотра отзывов клиентов и ответа на них.

  • Управление пользователями TestFlight.

  • Создание инструмента для быстрой загрузки отчетов о продажах.

  • Взаимодействие с рабочими процессами и сборками Xcode Cloud.

У вас могут быть свои идеи по разработке приложений с использованием этого API. Дайте мне знать, если вы разместили свое решение в открытом доступе — я буду рад разместить его здесь.

Могу ли я отправить приложение в App Store с помощью этого API?

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

Заключение

App Store Connect API — это большой набор конечных точек API, позволяющих получить доступ к данными App Store Connect. Вы можете создать инструменты разработчика для своих команд внутри компании или развернуть приложение в App Store, которым сможет пользоваться любой желающий. Используя App Store Connect Swift SDK, вы можете включиться в работу всего за несколько минут!

Если вы хотите углубить свои познания в Swift, посетите страницу, посвященную Swift. Не стесняйтесь обращаться ко мне или писать мне в Твиттере, если у вас есть какие-либо советы или отзывы.

Спасибо за внимание!


Всех желающих приглашаем на открытое занятие «Flux в SwiftUI, самая эффективная архитектура на 2022 год?», на котором обсудим:
1. Очевидные проблемы MVVM при создании iOS приложений на SwiftUI;
2. Возможные расширения MVVM с помощью SOA и Coordinator паттернов;
3. Почему большинство приложений на SwiftUI пишется на архитектурной концепции Flux.
Регистрируйтесь по ссылке.


ссылка на оригинал статьи https://habr.com/ru/company/otus/blog/683374/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *