App Store Connect
A Swift library for accessing Apple’s App Store Connect API.
import AppStoreConnect
let privateKey = try JWT.PrivateKey(contentsOf: URL(filePath: "..."))
let client = AppStoreConnectClient(
authenticator: JWT(
keyID: "...",
issuerID: "...",
expiryDuration: 20 * 60, // 20 minutes
privateKey: privateKey
)
)
let apps = try await client.send(Resources.v1.apps.get())
print(apps)
Installation
This library uses the Swift Package Manager. It supports Swift 5.7 and higher, and has minimum requirements of iOS 15, macOS 12, tvOS 15, and watchOS 8. It also strives to be fully supported for deployment on all other platforms outlined by Swift.org Platform Support page, such as the various Linux flavors and Windows.
To add AppStoreConnect to your project, add a package dependency in Xcode as you normally would, or add it to the dependencies
value of your Package.swift
manifest:
dependencies: [
.package(url: "https://github.com/aaronsky/asc-swift.git", .upToNextMajor(from: "0.1.0"))
]
Usage
Authentication
The App Store Connect API has no methods that allow for unauthorized requests. To make it easy to authenticate with App Store Connect, this library offers the aforementioned JWT
type to handle signing and rotating JSON Web Tokens automatically when they expire. For example:
import AppStoreConnect
let privateKey = try JWT.PrivateKey(contentsOf: URL(filePath: "..."))
let client = AppStoreConnectClient(
authenticator: JWT(
keyID: "...",
issuerID: "...",
expiryDuration: 20 * 60, // 20 minutes
privateKey: privateKey
)
)
You can learn more about creating the necessary credentials for the App Store Connect API at Apple’s documentation page via Creating API Keys for App Store Connect API. All App Store Connect APIs are scoped to the credentials of the pre-configured key, so you can’t use this API to make queries against the entire App Store.
Rate Limiting
Apple imposes a rate limit on all users of the API. If the API produces a rate limit error, AppStoreConnectClient
will throw Response.Error.rateLimitExceeded
for your convenience. This error contains the ErrorResponse
returned from the API, a Response.Rate
containing call limit and remaining call information, and the underlying response.
You can learn more about rate limiting at Apple’s documentation page via Identifying Rate Limits.
Pagination
All requests for resource collections (apps, builds, beta groups, etc.) support pagination. Responses for paginated resources will contain a links
property of type PagedDocumentLinks
, with “reference” URLs for first
, next
, and self
. You can also find more information about the per-page limit and total count of resources in the response’s meta
field of type PagingInformation
. You typically shouldn’t require any of this information for typical pagination.
The most common application for pagination is paging forward from the first “page”. For example:
for try await appsPage in await client.pages(Resources.v1.apps.get()) {
print(appsPage)
}
You can also page forward manually using the send(_:pageAfter:)
method on AppStoreConnectClient
.
Contributing
This project’s primary goal is to cover the entire API surface exposed by the official App Store Connect API. Otherwise, it’s being developed to aid in internal application development by the authors. Therefore, until the package’s version stabilizes with v1, there isn’t a strong roadmap beyond those stated goals. However, contributions are always welcome. If you want to get involved or you just want to offer feedback, please see CONTRIBUTING.md
for details.
License
This library is released under the BSD-2 license.
See LICENSE for the full text.
Credits
The technical direction of this library was driven by prior work on asc-go and appstoreconnect, as well as a fully-fledged example produced by @AvdLee et al. in appstoreconnect-swift-sdk. Client design was driven by prior work on buildkite-swift and wanikani-swift. App Store Connect and the App Store Connect API are property of Apple.