使用 App Store Connect API 生成和读取分析报告

前言

Apple 最近推出了50多个新的分析报告,其中包含数百个新的数据点和指标,以帮助开发者了解他们的应用程序的表现情况。

这些报告包括应用商店参与度、应用商店商业、应用使用情况、框架使用情况和性能等数据。

尽管这些新数据提供了许多见解,并且可能非常有价值,但它仅通过 App Store Connect API 提供,并且检索数据的方式并不直观。

在本文中,我将向你展示如何使用 Antoine Van Der Lee 的 App Store Connect Swift SDK 访问这些新的指标。

安装 API Swift SDK

安装 App Store Connect API Swift SDK

在最新版本的 App Store Connect API 中宣布新指标后,我决定发起一个拉取请求,重新生成 App Store Connect Swift SDK 中的 Swift 接口,以包含使用最新的 App Store Connect 3.4 开放 API 规范的新端点。

这些更改已合并并发布到 SDK 的 3.2.0 版本中,这也是我们在本文中使用的版本。

要安装 App Store Connect Swift SDK,你只需将其添加为包清单文件的依赖项即可,Package.swift 配置如下:

swift 复制代码
// swift-tools-version: 5.10

import PackageDescription

let package = Package(
    name: "ASCAnalytics",
    platforms: [.macOS(.v13)],
    dependencies: [
        .package(
            url: "https://github.com/AvdLee/appstoreconnect-swift-sdk.git", 
            exact: "3.2.0"
        )
    ],
    targets: [
        .executableTarget(
            name: "ASCAnalytics", 
            dependencies: [
                .product(
                    name: "AppStoreConnect-Swift-SDK", 
                    package: "appstoreconnect-swift-sdk"
                )
            ]
        ),
    ]
)

配置 API Swift SDK

配置 App Store Connect API Swift SDK

现在 SDK 已安装,我们只需要使用 App Store Connect API 密钥对其进行配置,ASCAnalytics.swift 文件配置如下:

swift 复制代码
import AppStoreConnect_Swift_SDK
import Foundation

let configuration = try! APIConfiguration(
    issuerID: "🙈",
    privateKeyID: "🙈",
    privateKey: "🙈"
)

let provider = APIProvider(configuration: configuration)

生成分析报告

要访问新指标,你需要首先为特定应用程序生成报告请求。这可以通过获取你要为其生成报告的应用程序的 ID,然后向 /v1/analyticsReportRequests 端点发出 POST 请求来完成。

ASCAnalytics.swift 代码如下:

swift 复制代码
// MARK: - Get the ID of the app
// https://api.appstoreconnect.apple.com/v1/apps?sort=bundleId&fields%5Bapps%5D=name
let request = APIEndpoint
    .v1
    .apps
    .get(parameters: .init(sort: [.bundleID], fieldsApps: [.name]))

let appsResponse = try await provider.request(request)
let qreateAppId = appsResponse.data.first { $0.attributes?.name == "QReate - QR code generator" }.map { $0.id }

guard let qreateAppId else { exit(1) }

// MARK: - Create a new Report Request
let relationships = AnalyticsReportRequestCreateRequest.Data.Relationships(
    app: .init(data: .init(type: .apps, id: qreateAppId))
)
let attributes = AnalyticsReportRequestCreateRequest.Data.Attributes(accessType: .ongoing)
let data = AnalyticsReportRequestCreateRequest.Data(
    type: .analyticsReportRequests,
    attributes: attributes,
    relationships: relationships
)
let createRequest = AnalyticsReportRequestCreateRequest(data: data)
// https://api.appstoreconnect.apple.com/v1/analyticsReportRequests
let requestReport = APIEndpoint.v1.analyticsReportRequests
    .post(createRequest)

_ = try await provider.request(requestReport)

尽管看起来似乎很复杂,但 POST 请求的有效负载非常简单。我们只需将要为其生成报告的应用程序的 ID 指定为关系(在这种情况下是我的应用程序 QReate),以及报告的访问类型。

访问类型参数可以是以下两个值之一:

  • .ongoing:最常见的报告请求类型,为所有频率的报告生成每日数据。
  • .oneTimeSnapshot:一次性报告请求,用于获取历史数据。

获取所有可用的报告

进行 POST 请求后,我们可以定期检查报告请求并检索其所有可用的报告。如果我们只对特定类型的数据感兴趣,可以通过类别(在这种情况下是应用使用情况)过滤到报告端点的请求。

ASCAnalytics.swift 代码如下:

swift 复制代码
// MARK: - Read all available report requests for an app
// https://api.appstoreconnect.apple.com/v1/apps/6446048195/analyticsReportRequests?filter%5BaccessType%5D=ONE_TIME_SNAPSHOT,ONGOING&fields%5BanalyticsReportRequests%5D=accessType,reports,stoppedDueToInactivity&fields%5BanalyticsReports%5D=category,instances,name&include=reports
let readReportsRequest = APIEndpoint
    .v1
    .apps
    .id(qreateAppId)
    .analyticsReportRequests
    .get(parameters: .init(filterAccessType: [.oneTimeSnapshot, .ongoing], fieldsAnalyticsReportRequests: [.accessType, .reports, .stoppedDueToInactivity], fieldsAnalyticsReports: [.category, .instances, .name], include: [.reports]))

let allReports = try await provider.request(readReportsRequest).data

// MARK: - Get all reports for a report request
guard let reportRequestId = allReports.first?.id else { exit(1) }
// https://api.appstoreconnect.apple.com/v1/analyticsReportRequests/105262f5-0cc0-4c4f-8eed-ff56509ee135/reports?filter%5Bcategory%5D=APP_USAGE
let reportInformation = APIEndpoint
    .v1
    .analyticsReportRequests
    .id(reportRequestId)
    .reports
    .get(parameters: .init(filterCategory: [.appUsage]))

let appUsageReports = try await provider.request(reportInformation)

这将返回该应用程序的所有可用的 APP USAGE 报告列表,然后我们可以按名称检索报告,以查看我们感兴趣的数据。例如,让我们获取 App Crashes 报告的 ID,以便稍后使用它来检索其数据。

ASCAnalytics.swift 代码如下:

swift 复制代码
guard let crashesReportId = appUsageReports.data
    .filter({ $0.attributes?.name == "App Crashes" })
    .first?.id else {
    exit(1)
}

获取报告的分段

不幸的是,App Store Connect API 不会直接返回报告的数据。相反,它将数据分割成实例,这些实例是根据可用的粒度(每日、每周或每月)生成的。

而每个实例又包含多个分段,每个分段都包含一系列用于下载报告数据的 URL。

现在,让我们获取报告实例的所有分段。

ASCAnalytics.swift 代码如下:

swift 复制代码
// MARK: - Get the information for a report
// https://api.appstoreconnect.apple.com/v1/analyticsReports/r2-105262f5-0cc0-4c4f-8eed-ff56509ee135/instances
let instances = APIEndpoint
    .v1
    .analyticsReports
    .id(crashesReportId)
    .instances
    .get()
let instancesResponse = try await provider.request(instances)
guard let instanceId = instancesResponse.data.first?.id else { exit(1) }

// MARK: - Get segments
// https://api.appstoreconnect.apple.com/v1/analyticsReportInstances/3472b36d-b349-41e5-8ff2-25967428947b/segments?fields%5BanalyticsReportSegments%5D=url,checksum,sizeInBytes
let segments = APIEndpoint
    .v1
    .analyticsReportInstances
    .id(instanceId)
    .segments
    .get(fieldsAnalyticsReportSegments: [.url, .checksum, .sizeInBytes])
let segmentsResponse = try await provider.request(segments)

下载分段的数据

最后,让我们使用分段实体的 url 属性下载报告数据,并将其写入我们稍后可以读取的文件中。

ASCAnalytics.swift 代码如下:

swift 复制代码
// MARK: - Download segment file
guard let segmentURL = segmentsResponse.data.first?.attributes?.url else { exit(1) }

let (location, downloadFileResponse) = try await URLSession.shared.download(from: segmentURL)
guard let httpResponse = downloadFileResponse as? HTTPURLResponse,
      httpResponse.statusCode == 200 else {
    exit(1)
}

try FileManager.default
    .moveItem(
        at: location,
        to: URL.desktopDirectory.appending(component: "crashes.zip")
    )

完成上述所有步骤后,我们的桌面上应该会有一个名为 crashes.zip 的文件,解压后其中将包含应用崩溃报告的数据文件:

crashes 文件内容如下:

crashes 复制代码
Date	App Name	App Apple Identifier	App Version	Device	Platform Version	Crashes	Unique Devices
2024-01-15	QReate - QR-code generator	6446048195	1.0.4	Desktop	macOS 13.6	1	1
2024-01-15	QReate - QR-code generator	6446048195	1.0.4	Desktop	macOS 14.2	4	4

总结

本文介绍了苹果最新推出的多个新的分析报告,其中包含数百个新的数据点和指标,帮助开发者了解其应用程序的表现情况。这些报告涵盖了诸如应用商店参与度、商业情况、应用使用情况、框架使用情况和性能等方面的数据。然而,这些数据仅通过 App Store Connect API提供,并且检索数据的方式并不直观。展示了如何使用 Antoine Van Der Lee 的 App Store Connect Swift SDK 访问这些新指标,包括安装 API Swift SDK、配置 API Swift SDK、生成分析报告、获取所有可用报告以及下载报告数据。

相关推荐
qq_158895411111 小时前
AI 音乐生成完成后,音频 URL 为什么会过期?一套可恢复的交付方案
python·api·ai音乐
JonaHu2 小时前
5分钟搭建帮你赚钱的 AI API 网站:从品牌门户到客户 Key 交付
人工智能·api·开发者·ai创业·acedatacloud
Thanks_ks13 小时前
HTTP 请求方法与 RESTful 接口设计:GET 和 POST 到底怎么用
http·api·restful·状态码·get·post·接口设计
茶底世界之下15 小时前
窗边白雏菊与旧书:用 Awaking 留住一束暖光
ios·app·产品
茶底世界之下2 天前
阴天海边的蓝船:用 Awaking 把灰蓝调成清亮主角
ios·app·产品
小年糕是糕手2 天前
【AI】用 AI 做自己的个人网站(上):选模板、写提示词,做出第一版
人工智能·app·网页开发·codex·index·styles·0基础教程
Digitally2 天前
如何将 iPhone 备份到 iCloud?
ios
DevOpenClub2 天前
网站标题与图标 API:URL 输入、空字段与返回边界
api·favicon·网站工具
传奇开心果编程3 天前
【Flutter踩坑排雷】第19课:路由硬编码坑|字符串路由书写错误,页面跳转失败排查
android·flutter·ios·移动开发·跨平台·ui框架·声明式ui
茶底世界之下3 天前
雨后街口的斑马线:用 Awaking 把颜色让给光与步伐
ios·app·产品