前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用 App Store Connect API 批量创建内购商品

使用 App Store Connect API 批量创建内购商品

原创
作者头像
37手游iOS技术运营团队
修改于 2023-04-21 11:17:02
修改于 2023-04-21 11:17:02
5.4K00
代码可运行
举报
运行总次数:0
代码可运行

一、前言

我们去年开源 AppleParty(苹果派) 用于批量应用内购商品的创建和更新的方案,具体的技术方案是使用 XML Feed 格式来处理。而今年苹果在 WWDC22 宣布,2022 年 11 月开始,不再允许使用 XML 方式上传元数据和内购商品。

苹果在 7 月公告 即将从 XML Feed 过渡到 App Store Connect API,并且一直邮件通知开发者,截止 11月 9 日之前:

代码语言:txt
AI代码解释
复制
We noticed you recently used the XML feed to manage and deliver content to App Store Connect. As we wrote to you previously, as of November 9, 2022, you’ll need to use the App Store Connect REST API to manage in-app purchases, subscriptions, metadata, and app pricing. The XML feed no longer supports this content, but continues to support existing Game Center management functionality. 

If you have any questions, contact us. 

Apple Developer Relations

如果现在还使用 XML feed 上传,会收到以下告警:

代码语言:txt
AI代码解释
复制
ERROR ITMS-6036: "XML schemas software5.12 and earlier have been deprecated and uploads of app metadata, in-app purchases, and subscriptions are no longer supported through the XML feed. You can use the App Store Connect API instead.

Game Center will continue to be supported with XML schema software6.0." at Software/SoftwareMetadata

所以,XML feed 禁止上传的内容:

  • app metadata(app元数据,如截图、预览、描述等)
  • in-app purchases, and subscriptions(内购商品,包括订阅类型)
  • app pricing(app定价)

Game Center 和上传 ipa 文件等方式,目前还能上传,目前来看,是因为 App Store Connect API 还不支持!所以,希望明天 WWDC23 苹果能支持上传 ipa 文件,这样就更加方便~

二、App Store Connect API

App Store Connect API 需要生成密钥才能调用使用,所以,我们先来介绍一下密钥的生成,然后在以应用内购商品的创建和更新为例,展示 API 使用示例。

2.1 App Store Connect API 密钥生成

生成密钥 ID(kid)和 Issuer ID(iss)

要生成密钥,您必须在 App Store Connect 中具有管理员角色或帐户持有人角色。登录 App Store Connect 并完成以下步骤:

  1. 选择 “用户和访问”,然后选择 “密钥” 子标签页。
  2. 在 “密钥类型” 下选择 “App Store Connect API”。
  3. 单击 “生成 API 密钥”(如果之前创建过,则点击 “添加(+)” 按钮新增。)。
  4. 输入密钥的名称。该名称仅供您参考,名字不作为密钥的一部分。
  5. 单击 “生成”。
AppStoreConnectAPI-01.png
AppStoreConnectAPI-01.png

“用户和访问” -> “密钥” -> “App Store Connect API” -> “生成 API 密钥”

AppStoreConnectAPI-02.png
AppStoreConnectAPI-02.png
AppStoreConnectAPI-03.png
AppStoreConnectAPI-03.png

注:访问权限:

根据密钥使用场景,访问的权限也不一样。要创建和管理 App 内购买项目,请确保您拥有以下用户角色之一:

  • 帐户持有人
  • 管理
  • App 管理(这个要求角色权限最低)

详细权限,可参考文档 职能权限

AppStoreConnectAPI-04.png
AppStoreConnectAPI-04.png

1、Issuer ID:拷贝复制内容

2、密钥 ID: 生成的密钥,有一列名为 “密钥 ID” 就是 kid 的值,鼠标移动到文字就会显示 拷贝密钥 ID,点击按钮就可以复制 kid 值。

3、API 密钥文件,下载 API 密钥 按钮(仅当您尚未下载私钥时,才会显示下载链接。),此私钥只能一次性下载!。

注意:将您的私钥存放在安全的地方。不要共享密钥,不要将密钥存储在代码仓库中,不要将密钥放在客户端代码中。如果您怀疑私钥被盗,请立即在 App Store Connect 中撤销密钥。有关详细信息,请参阅 撤销API密钥

最终,生成以下参数和文件:

名字

值示例

说明

字段值说明

密钥ID

GC8HS3SX37

kid,Key ID,密钥ID

您的私钥ID,值来自 API 密钥页面。

密钥内容文件

SubscriptionKey_GC8HS3SX37.p8

密钥文件(p8)

用来访问和使用 App Store Connect API 接口的服务。

Issuer ID

69a6de92-xxx-xxxx-xxxx-5bc37c11a4d1

iss,Issuer ID,发行人

您的发卡机构ID,值来自 App Store Connect 的 API 密钥页面。

2.2 App Store Connect API 使用示例

这里我们使用 python3 创建 API 请求示例,需要依赖 jwtrequests 库,所以需要在终端安装:

代码语言:txt
AI代码解释
复制
pip3 install jwt

pip3 install requests

怎么请求 App Store Connect API ?苹果给出了一个示例:

代码语言:shell
AI代码解释
复制
curl -v -H 'Authorization: Bearer [signed token]' 
"https://api.appstoreconnect.apple.com/v1/apps"

也就是用 JWT 生成的 token,放到 App Store Connect API 请求链接的 header 部分,key 为 Authorization,value为 Bearer [signed token]

接下来,我们通过 Python 的 requests 来请求 App Store Connect API。大家也可以用其它的工具来模拟,比如在线工具或者 Postman 等。

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
import jwt
import time
import requests

def createASCToken(p8KeyPath, kid, iss):
	try:
		header = {
			"alg": "ES256",
			"typ": "JWT",
			"kid": kid
		}
		payload = {
			"iss": iss,
			"aud": "appstoreconnect-v1",
			"iat": int(time.time()),
			"exp": int(round(time.time() + (20.0 * 60.0))) # 20 minutes timestamp
		}
		file = open(p8KeyPath)
		key_data = file.read()
		file.close()
		token = jwt.encode(headers=header, payload=payload, key=key_data, algorithm="ES256")
		return token
	except Exception as e:
		print(e)
		return ""

# 密钥路径
p8 = "/Users/iHTCboy/Downloads/AppStoreConnectAPI/AuthKey_GC8HS3SX37.p8"
kid = "GC8HS3SX37"
iss = "69a6de92-xxx-xxxx-xxxx-5bc37c11a4d1"

# 生成请求 token
token = createASCToken(p8, kid, iss)

接下来,以获取 app 列表为例,请求也非常简单:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
# 获取全部 app
url = "https://api.appstoreconnect.apple.com/v1/apps" 
header = {
	"Authorization": f"Bearer {token}"
}
rs1 = requests.get(url, headers=header)
data = json.loads(rs1.text)

print(data)

返回内容示例:

代码语言:json
AI代码解释
复制
{
  "data" : [ {
    "type" : "apps",
    "id" : "123456737",
    "attributes" : {
      "name" : "AppleParty - 37手游 iOS 技术团队",
      "bundleId" : "cn.com.37iOS.AppleParty",
      "sku" : "2021.04.25",
      "primaryLocale" : "zh-Hans",
      "isOrEverWasMadeForKids" : false,
      "subscriptionStatusUrl" : null,
      "subscriptionStatusUrlVersion" : null,
      "subscriptionStatusUrlForSandbox" : null,
      "subscriptionStatusUrlVersionForSandbox" : null,
      "availableInNewTerritories" : true,
      "contentRightsDeclaration" : null
    },
    "relationships" : {
        xxxx
     }
  }],
  "links" : {
    "self" : "https://api.appstoreconnect.apple.com/v1/apps"
  },
  "meta" : {
    "paging" : {
      "total" : 1,
      "limit" : 50
    }
  }
}
2.3 App Store Connect API 使用说明

App Store Connect API 可以根据官方文档就能大概了解,但是依然非常难,就是 POST 接口的 body 和上传文件的流程。

POST body

Create an In-App Purchase 为例,请求的 body:

代码语言:json
AI代码解释
复制
{
	'data': {
		'attributes': {
			'availableInAllTerritories': True,
			'familySharable': False,
			'inAppPurchaseType': 'NON_CONSUMABLE',
			'name': '我是测试商品01',
			'productId': 'com.apple.iap01',
			'reviewNote': '审核备注',
		},
		'relationships': {
			'app': {
				'data': {
					'id': "{app_id}",
					'type': 'apps'
				}
			}
		},
		'type': 'inAppPurchases'
	}
}

其中 inAppPurchaseType 可能为:

  • CONSUMABLE
  • NON_CONSUMABLE
  • NON_RENEWING_SUBSCRIPTION

而订阅类型的商品,是另一个 API Create an Auto-Renewable Subscription,对应的请求的 body:

代码语言:json
AI代码解释
复制
{
	"data": {
		"type": "subscriptions",
		"attributes": {
			"name": "一个月订阅会员",
			"productId": "com.apple.mon01",
			"subscriptionPeriod": "ONE_MONTH",
			"familySharable": False,
			"reviewNote": "审核备注",
			"groupLevel": 1,
			"availableInAllTerritories": True
		},
		"relationships": {
			"group": {
				"data": {
					"type": "subscriptionGroups",
					"id": "{app_iap_grop_id}"
				}
			}
		}
	}
}

其中 subscriptionPeriod 可以为:

  • ONE_WEEK
  • ONE_MONTH
  • TWO_MONTHS
  • THREE_MONTHS
  • SIX_MONTHS
  • ONE_YEAR

上传文件

上传文件的流程,刚开始看文档没有看明白,最后又仔细查文档才找到 Uploading Assets to App Store Connect,以上传应用内购买的送审图片为例,Create an In-App Purchase Review Screenshot,需要对应的请求的 body:

代码语言:json
AI代码解释
复制
{
	'data': {
		'attributes': {
			'fileName': 'test.png',
			'fileSize': '1000',
		},
		'relationships': {
			'inAppPurchaseV2': {
				'data': {
					'id': '{app_iap_id}',
					'type': 'inAppPurchases'
				}
			}
		},
		'type': 'inAppPurchaseAppStoreReviewScreenshots'
	}
}

请求成功后,Response Code 为 201 时:

代码语言:json
AI代码解释
复制
{
  "data" : {
    "type" : "inAppPurchaseAppStoreReviewScreenshots",
    "id" : "caeda501-xxxx-xxxx-8fb3-6a3c0f462720",
    "attributes" : {
      "fileSize" : 1000,
      "fileName" : "test.png",
      "sourceFileChecksum" : "",
      "imageAsset" : {
        "templateUrl" : "",
        "width" : 0,
        "height" : 0
      },
      "assetToken" : "",
      "assetType" : "SCREENSHOT",
      "uploadOperations" : [ {
        "method" : "PUT",
        "url" : "https://store-032.blobstore.apple.com/itmspod11-assets-massilia-032001/PurpleSource112%2Fv4%2F2c%2F3f%2Fe1%2F2c3fe12e-a9ea-xxx-xxx-12a8c02df932%2FieKZRQnL0o2fK4sbeFRXOQ8tVRjPIVyJaGCNLsLg2Dc_U003d-1669087039587?uploadId=2c75a0f0-6a14-11ed-93d1-d8c4978a0739&Signature=OWuT65nZNeMgWMNbaZtEGc9lcDU%3D&AWSAccessKeyId=MKIA474WIEZZVU5QMKHI&partNumber=1&Expires=1669691839",
        "length" : 1000,
        "offset" : 0,
        "requestHeaders" : [ {
          "name" : "Content-Type",
          "value" : "application/octet-stream"
        } ]
      } ],
      "assetDeliveryState" : {
        "errors" : null,
        "warnings" : null,
        "state" : "AWAITING_UPLOAD"
      }
    },
    "links" : {
      "self" : ""
    }
  },
  "links" : {
    "self" : "
  }
}

返回的响应内容 uploadOperations 中的 url 就是上传图片文件的请求 url,对应的 requestHeaders 也是组装 request 必备的 headers 属性,图片文件的大小要与 length 长度一致。

2.4 App Store Connect Swift SDK

从上文就可以看出来,如果自己全部的 API 都实现一次,工作时是非常大,所以我们非常感谢 AvdLee/appstoreconnect-swift-sdk,使用 Xcode 的 Swift Package Manager 导入 https://github.com/AvdLee/appstoreconnect-swift-sdk.git 就可以使用!

以创建内购商品为例:

代码语言:swift
AI代码解释
复制
    func createInAppPurchases(appId: String, product: IAPProduct) async -> ASCInAppPurchaseV2? {
        let body = [
            "data": [
                "attributes": [
                    "availableInAllTerritories": product.availableInAllTerritories,
                    "familySharable": product.familySharable,
                    // CONSUMABLE、NON_CONSUMABLE、NON_RENEWING_SUBSCRIPTION
                    "inAppPurchaseType": product.inAppPurchaseType.rawValue,
                    "name": product.name,
                    "productId": product.productId,
                    "reviewNote": product.reviewNote,
                ],
                "relationships": [
                    "app": [
                        "data": [
                            "id": appId,
                            "type": "apps"
                        ]
                    ]
                ],
                "type": "inAppPurchases"
            ]
        ]
        
        do {
            guard let provider = provider else {
                return nil
            }
            let json = try JSONSerialization.data(withJSONObject: body, options: .prettyPrinted)
            let model = try JSONDecoder().decode(InAppPurchaseV2CreateRequest.self, from: json)
            let request = APIEndpoint.v2.inAppPurchases.post(model)
            let data = try await provider.request(request).data
            return data
        } catch APIProvider.Error.requestFailure(let statusCode, let errorResponse, _) {
            handleRequestFailure(statusCode, errorResponse)
        } catch {
            handleError("创建内购商品失败: \(error.localizedDescription)")
        }
        return nil
    }

这里就不再展开,详细可以参考我们开源项目代码:AppStoreConnectAPI.swift

3、Apple Party(苹果派)更新

下载 2.1.0 更新版本:Releases · 37iOS/AppleParty

更新重点内容

  • 截图不再是必需项
  • 支持多种本地化语言

表格格式更新,删除无法字段,支持多种本地化语言:

AppStoreConnectAPI-05.png
AppStoreConnectAPI-05.png

支持多种本地化语言,通过在表格最后的列增加,本地化语言标识,每种语言增加2列,分别对应本地化的名字和描述。

内购列表更新支持不同的价格国家地区的价格显示:

AppStoreConnectAPI-06.png
AppStoreConnectAPI-06.png

导入表格后,首次需要设置 API 密钥:

AppStoreConnectAPI-07.png
AppStoreConnectAPI-07.png

密钥获取,参考本文的第二章内容。

AppStoreConnectAPI-08.png
AppStoreConnectAPI-08.png

提交后,会自动执行上传,如果存在的商品会更新内容,成功时:

AppStoreConnectAPI-09.png
AppStoreConnectAPI-09.png

四、总结

App Store Connect API 功能非常多,包括元数据的管理,构建版本的管理、TextFlight 管理、证书管理等等,Apple Party(苹果派)从日常使用场景最多的内购商品批量创建入手,未来依然有非常多的生效力效率提升,欢迎大家一起迭代和 PR 提交!

欢迎你一起体验和参考 37iOS/AppleParty~

欢迎大家评论区一起讨论交流~

参考引用

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
内容,内容资产,以及内容即服务
内容是指在媒体、平台或者其他载体上所呈现的信息、文章、图片、视频、音频等形式的表达。内容可以是有关某个特定主题或领域的知识、观点、故事、娱乐等,通过文字、图像、声音等方式传达给用户或观众。在互联网时代,内容的重要性越来越突出,各种网站、应用和社交媒体平台都以提供优质内容为目标,吸引用户关注和参与。
KATSU
2023/09/09
5100
内容,内容资产,以及内容即服务
突破传统营销:SEO、社交媒体和聊天机器人的联动策略
搜索引擎优化(SEO)、社交媒体和聊天机器人之间的界限越来越模糊,这为您创造了与受众建立联系和推动参与的新机会。如果您对聊天机器人技术有些疑虑,那就让我们来看看这些令人兴奋的新可能性能否让您安心!
SEO-juper
2023/11/20
3010
ChatGPT 大师
随着技术的不断发展,营销人员可用的工具和策略也必须适应变化和创新。在这个创新的海洋中,有一个
ApacheCN_飞龙
2024/05/24
1880
利用SEO优化策略:实现网站流量与排名双提升
在全球化的商业环境中,在进行海外市场的搜索引擎优化(SEO)时,常常面临语言、文化和搜索习惯的差异。代理IP 作为一种辅助工具,能够有效解决这些挑战,提升SEO效果。以下是深入探讨代理IP在SEO优化中应用的内容:
镰ge_麦穗
2025/03/28
2740
利用SEO优化策略:实现网站流量与排名双提升
SMART让您的内容和SEO更智能
你多学一样本事,就少说一句求人的话!只有自己足够强大,才不会被别人践踏。 SMART目标管理原则,如何用SMART原则来与SEO相关联?如何让SMART原则应用到网站内容中去?今天主要来聊聊SMART
黄伟SEO
2018/05/17
8690
广告狗们,真不是吓唬你!再甩你10个可能抢走狗粮的经典案例!
小编发现,自从昨天发布了广告狗们注意了!未来夺走你工作的可能不是客户爸爸---是他!引起了一片哗然!于是小编一发不可收拾,瞒着老板又收集了十个早期经典案例准备继续虐狗!
iCDO互联网数据官
2018/07/27
6570
广告狗们,真不是吓唬你!再甩你10个可能抢走狗粮的经典案例!
ChatGPT 百万富翁手册
人工智能(AI)的急剧出现引发了组织工作方式和个人与技术互动方式的一波变革。这些变化是由 AI 的崛起带来的。人工智能中最令人印象深刻的例子之一就是被称为 ChatGPT 的模型,它由 OpenAI 开发。这个模型能够进行自然语言处理。由于它能够阅读和生成与人类极为相似的语言,它有潜力使商业的许多方面,尤其是利润丰厚的“赚钱”领域,成为一个极其令人困惑和难以预测的复杂领域。
ApacheCN_飞龙
2024/05/24
960
2015年网络营销的七大趋势
福布斯中文网(微信公号: forbeschinaonline)授权转载 数字营销领域的转变和进步正在加速,对旁观者来说,要跟上恐怕有些困难。因此,就在这2014年临近年末之际,不妨让我们来回顾一下今年出现的营销趋势,并且展望一下2015年可能出现的趋势。 1. 面向移动终端的优化将会变得比以往任何时候都要重要 面向移动终端应用进行优化,在2014年已经成了企业一项至关重要的任务,但是在2015年,这种移动策略将更进一步,不再仅限于为企业设立响应式网站或开发移动应用,还将注重面向移动终端优化的内容和社交媒体
大数据文摘
2018/05/23
7840
7.ChatGPT与SEO - 优化内容策略【7/10】
在当今的数字化时代,搜索引擎优化(SEO)已成为数字营销中不可或缺的一部分。它不仅帮助企业提高在线可见性,还直接影响着网站的流量、品牌知名度和最终的销售转化。SEO通过优化网站内容和结构,使其在搜索引擎结果页(SERP)上获得更高的排名,从而吸引更多的潜在客户。
正在走向自律
2024/12/18
2070
7.ChatGPT与SEO - 优化内容策略【7/10】
10个助燃商业增长的市场营销战略
引言:什么是最优营销策略?最重要的是建立真挚的顾客关系,那么就可以通过以下10种策略在线营销任何业务。
iCDO互联网数据官
2018/10/25
5910
独立开发者工具 • 半月刊 • 第 008 期
Indie Tools - 专注于分享独立开发:出海、精选、最新、最实用的工具和资源
Immerse
2025/04/16
940
独立开发者工具 • 半月刊 • 第 008 期
看看国外SEO专家是怎么定义SEO的?
再近的距离,你不踏出第一步,永远到达不了目的地,再远的路程,只要一步一个脚印,总能看到最美的风景。
黄伟SEO
2019/03/06
1.3K0
整合营销的4项必备技能
“ 整合营销作为一门艺术和科学如今仍在不断发展,要求企业营销团队不断补充新鲜血液,培养新的技能。在今天乃至未来,应重点关注以下技能,提升营销能力,确保整合营销取得切实效果。”
产品言语
2022/06/02
7890
【对话ChatGPT】如何提高网站的访问量?
上周给博客开通的 Google adsense,收益比微信公众号好一些,收益跟访问量成正比,于是我问了 ChatGPT 这个问题。
狂奔滴小马
2023/03/16
1.1K0
ChatGPT 之现金流
在当今快节奏和不断发展的世界中,财务稳定和独立变得越来越重要。零工经济的兴起导致了兼职的激增,即人们在正常工作之外从事的兼职活动,以赚取额外收入。
ApacheCN_飞龙
2024/05/24
1120
ChatGPT 之现金流
ChatGPT 初学者指南
如果您一直关注新闻和趋势,您可能已经在某个地方读到或听到过,Sam Altman 的生成式人工智能平台 ChatGPT 已经将人工智能推向了一个新的高度 - 许多人已经开始尝试使用这个令人惊叹的工具来赚钱。
ApacheCN_飞龙
2024/05/24
1730
ChatGPT 初学者指南
seo搜索引擎排名优化
使用关键词研究工具确定相关性高且搜索量适中的关键词,并将这些关键词自然地融入标题、段落和标签中,但避免过度堆砌,保持内容流畅自然。
用户10637139
2024/04/27
2590
为什么小型网站,更适合做SEO?
其实SEO优化是涉及到了数百个完美的规划以及执行的操作,只要当你看见要完成的事情的列表时,大多数小型网站的管理者放弃了投资SEO的想法。正确的SEO将提高您的在线可见度,帮助您建立更好的在线形象,在您的网站上产生更多流量,并帮助您开始朝着更大的目标迈进。
蝙蝠侠IT
2021/06/29
6460
为什么小型网站,更适合做SEO?
一些关于网站推广问题合集。
提供高质量的内容:提供高质量、原创、有用的内容是最重要的。这可以吸引更多的用户访问,并增加用户留存时间,提高用户体验。同时,高质量的内容也会被其他网站引用和分享,这将有助于增加外部链接,提高网站的权重。
很酷的站长
2023/02/16
5150
Next.js 中的 SEO
Next.js 是一个用于构建服务器呈现的 React 应用程序的框架,使用像 Next.js 这样的框架的好处之一是它可以很容易地针对搜索引擎优化您的应用程序。
海拥
2023/02/27
4.6K0
相关推荐
内容,内容资产,以及内容即服务
更多 >
LV.6
这个人很懒,什么都没有留下~
目录
  • 一、前言
  • 二、App Store Connect API
    • 2.1 App Store Connect API 密钥生成
    • 2.2 App Store Connect API 使用示例
    • 2.3 App Store Connect API 使用说明
    • 2.4 App Store Connect Swift SDK
  • 3、Apple Party(苹果派)更新
  • 四、总结
  • 参考引用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档