We're sunsetting PodQuest on 2025-07-28. Thank you for your support!
Export Podcast Subscriptions
People
A
Adam
主持和编辑 STAT 的生物技术播客 “The Readout LOUD”,专注于生物技术新闻和行业分析。
J
Jeff
使用ChatGPT来改善关系和解决争论
Topics
Jeff: 我在提交一个包含订阅功能的应用时遇到了问题。苹果App审核指南对订阅类应用的使用条款说明不够清晰,指南只要求提供隐私政策,但我被要求提供使用条款。我最初只提供了隐私政策,应用被拒绝。之后,我在应用内和App描述中添加了使用条款链接,但应用再次被拒绝,原因是未包含链接,而实际上链接已添加。苹果对应用审核的反馈缺乏沟通,导致应用发布延迟,这让我非常沮丧。我尝试联系苹果客服,但他们表示无法帮助解决个别应用审核问题。 我理解苹果需要确保应用质量,但在审核过程中缺乏有效的沟通机制,这给开发者带来了巨大的困扰。如果苹果能更明确地说明要求,并提供及时的反馈,就能避免很多不必要的麻烦。 Adam: 我也遇到过类似的情况,苹果应用审核有时会给出与实际问题无关的反馈,沟通方式单向且缺乏帮助。苹果的“后续修复”政策不适用于首次提交的应用,这使得开发者难以解决问题。苹果应用审核存在应用陷入无限期审核的风险。 TestFlight是一个有用的工具,可以帮助开发者在发布应用之前进行测试。TestFlight允许开发者将应用发布给内部和外部测试用户,内部测试用户可以直接访问应用构建版本,无需审核;外部测试用户可以通过公开链接访问应用,但数量有限制,且应用内购功能在TestFlight中不可用。建议使用CI/CD工具自动管理构建号和签名。 在使用TestFlight时,开发者应该注意版本号和构建号的管理。macOS应用的构建号不能重复使用,而iOS、tvOS和visionOS可以重复使用构建号。TestFlight反馈包括用户设备信息、应用版本信息和用户评论,崩溃反馈包含崩溃日志和用户提供的其他信息。即使看似不重要的用户反馈也可能对开发者非常有帮助。

Deep Dive

Shownotes Transcript

本周,我们讨论 TestFlight,它是什么,如何使用它,以及为什么你应该使用它。(00:00) - 介绍 (11:26) - 支持本播客 (25:41) - SetApp (40:33) - 支持播客 (40:43) - 评分和评论 成为 Patreon 会员并帮助本播客生存https://www.patreon.com/compileswift 请留下评论并表达您的支持https://lovethepodcast.com/compileswift 感谢我们每月的支持者

Adam Wulf bitSpectre Arclite

★ 在 Patreon 上支持本播客 ★ </context> <raw_text>0 大家好,欢迎收听 Compulsive Podcast 的另一集。现在你可能正在使用那个闪亮的新操作系统,并且需要准备好你的应用程序。所以我们为你准备了一集。但首先,Jeff,你好吗,老兄?

很好。正在为应用审核而感到压力,但是,还有什么新鲜事呢?我们会谈到这个。是的。好的,那么让我们来谈谈这个。所以各位,如果你一直在关注,而且你应该一直在关注,对吧?Jeff 一直在开发一个带有时间挑战的应用程序,在很多方面都是如此。

而本周,苹果并没有帮助你达到那个截止日期,是吗?不,一点也没有。所以告诉我们这个故事。我们都经历过这种情况,所以告诉我们这个故事。我们会感同身受的。苹果有一些要求……

在我看来,它们并不清晰。这是一个我愿意接受合理讨论的方面,也许人们会说这是清晰的。但是如果你有一个带有订阅的应用程序,你必须在你的……

App Store Connect 上的应用程序描述中提供有关你的应用程序的隐私政策和使用条款的信息。现在,如果你查看应用审核指南,它们实际上只提到了隐私政策。它们没有提到使用条款。但是我愿意,你知道,我以前听过这个。不清楚。不管怎样,我发布的应用程序的第一个版本,我只在我的

呃,应用程序描述中包含了隐私政策,这是一个非常重要的点,因为我可能会因此被取消资格,我只做了一个隐私政策,而且我从未被认为是如此,所以我想补充一点,只有当你的应用程序有可消耗的订阅时,你才需要提供使用条款,再次像我说的那样

我多次阅读应用审核指南,试图寻找它。我,我不知道你还记不记得是什么?哦,我的天,这已经是几年前的事了。苹果将应用审核指南做成了漫画书的样子。你还记得吗?

哦,我不记得了。哦,我的天。我必须找到它,看看我能不能发布它。好的,酷。它不再可以通过苹果获得,但我肯定在某个时候下载过它,并且拥有它。但它真的很酷,几乎就像 Marvel Comics 风格的在线内容。

那一年的应用审核指南。说实话,它有一些很棒的艺术作品,真的。但是是的,不。所以我多次阅读了应用审核指南。我再次阅读它们,反复检查我是否完全按照他们的要求做了。据我所知,没有任何内容说明你必须在该应用审核指南中提供使用条款。我不知道。我离题了。好吧。然而,我没有在我的原始应用程序描述中包含这些使用条款。所以

所以苹果拒绝了我。在我看来,这是一个公平的拒绝。不管怎样。他们拒绝了我。他们说,你必须将你的使用条款添加到你的应用程序和……

你的应用程序描述中。所以我进入 Revenue Cat(黑客马拉松的赞助商,很棒的付费墙工具),我只需要在他们的付费墙页面上添加一个小链接。它就在那里。它在应用程序中。我甚至不需要对我的代码库做任何更改。它就在那里。它在应用程序中。然后我将链接添加到我的应用程序描述中。在最底部添加了,Bark 是根据标准最终用户许可协议提供的,更多信息请点击链接。这就是我添加的内容。

重新提交了应用程序,发送给苹果,再次被拒绝。你需要在你的应用程序描述中包含此链接。我做了。它就在这里。这就是我发送给他们的。我给他们发送了一个截图,我说,它在应用程序描述中。它就在这里。它用红色圆圈圈起来了。它就在这里。

我见过这个。所以我想在这里支持你,并说它甚至不是什么可以被误解的东西。它非常清晰地在那里。它非常清晰地以黑白方式显示在那里。是的,所以让它运行到周末,然后到今天,星期一,等待苹果的回应。

他们没有回应。他们什么也没说。所以我已经撤回了应用程序并重新提交了。从那时起已经大约 12 个小时了。我仍然没有收到他们的进一步沟通。所以我不确定我需要做什么。如果他们想让我改变什么,我很乐意改变。但相反,我只是在被冷落,这很糟糕。

所以首先想到的是,是的,好吧,这可能不是提交审核的最佳日子,因为很多人都会这样做。但话虽如此,我记得一个场景。

我会故意对细节含糊其辞,因为这是工作上的事情。但我记得一个场景,提交一个已经上线好几年的应用程序的应用程序更新。他们回复说,更新与他们提到的内容无关。他们回复说,基本上,我们在某个炼狱中遇到了问题。

所以我查看了它,你知道,我想,好吧,在我看来它看起来没问题。我回去查看了历史记录,

这段文字从这个应用程序的第一天起就是这样。所以多年了,对吧?所以,你知道,知道它是这样的,就像,好吧,你必须表现得很好。对。所以我回复说,嘿,嗯,这段文字从未改变过,并且已经运行了 X 个时间,X 个版本以及一些细节。然后,嗯,

第二天,是的,果然,它神奇地被批准了。是的,甚至没有像,我不是说,你知道,嘿,你应该说你错了或者什么,甚至没有承认,好吧,或者什么。它只是神奇地被批准了。这始终是我以及许多其他人关注的一个领域,这不仅仅是,好吧,你知道,你没有批准它,

你给了我某种粗略的解释,我必须自己查阅文档才能弄清楚。但这更像是一种单向沟通。我认为这不是最有帮助的沟通方式。对。这非常像是一场单向对话。而且,你知道,我对此有意见。是的。对。他们已经,像,使你的……

轶事现在变得有点官方了,他们说,如果你已经有一个在商店里的应用程序,并且你正在进行错误修复更新,而我们出于某种原因拒绝了你,那么你可以正式地说,嘿,你知道,我需要这个错误修复。我正在做这件事,你知道,我会在下一个版本中修复它。你可以做出这个正式的承诺。我遇到的问题是,这真的在毁掉我的生活,那就是,

当你第一次提交应用程序时,这并不适用。所以这是一个这样的情况,就像,好吧,我们不能说你以后会这样做,因为这是应用程序的第一个版本,仅此而已。所以我并没有真正能够摆脱这种,哦,是的,我以后会完全修复这个问题。他们只是说,不,我们希望它第一次就正确。但是,你知道,是的。不,就是这样……

好吧。我们应该对此怎么办?然后他们会指引你,你知道,一些冗长的文档。如果他们告诉我,嘿,我们需要你做 X。我会完全去做。相反。他们只是无视我。是的。如果你说,嘿,我们需要你在此处添加这个确切的措辞,以及这个确切的链接格式,

好的,我会做的。我很乐意做这件事来让你高兴,允许我发布这个应用程序。他们所做的是,他们说,你没有添加这个链接。我说,是的,我添加了。它就在这里。然后我已经快三天没有听到任何消息了。

这从来都不是一个好兆头,对吧?因为我们都知道,朋友们。如果它没有发生在我们身上,我们认识的人中,你会陷入无限循环中,我认为我刚刚掉进了一个又深又黑的洞,他们永远不会再找到我了,对吧?是的。

而且,你知道,那里的问题是,就像你说的那样,你知道,即使你撤回它并从头开始。我做了。是的,当然没有保证。并不是说有人保证你的应用程序会进入商店。但与此同时,也没有其他办法。因此,基本上,你会失眠之夜,想知道,它会发生吗?

对,你知道,即使这不是一个你需要在特定时间范围内完成的情况,而且我知道你留出了足够的时间,我认为你甚至在 Threads 上发布了一条关于它的消息,对吧?是的,在我们知道之前,我做类似的事情,就像,即使是遇到问题并正常处理它也足够的时间,所以我的意思是,这几乎是一个多余的问题,我想,但是

你只是坐着等待,并希望一切顺利,对吧?我的意思是,我甚至打过电话给苹果,说,嘿,你知道,就像,我不记得是谁向我推荐这个的。他们说,你知道,苹果有这条电话线,而且……

我们这个年龄段的很多人,我想,不愿意拿起电话实际打电话给某人,实际上它人手不足,你可以很快联系到一个真人。所以我做了,他们说,哦,好吧,我们无法帮助处理个别审核。这句话是什么意思,对吧?这有点像,好吧,那你为什么在这里?我以前也有人向我推荐过。

用于其他问题,但是是的,这绝对看起来更像是,你知道,App Store Connect 不工作的那种情况,而不是我需要帮助。你知道,我会这么说,这样你就不用了,你不会惹上麻烦。苹果,苹果,因为我们知道苹果显然关注我们,对吧?苹果,在接下来的几分钟内请不要收听这个播客。好的,拜托。除非你是那些拥有足够……我正在寻找的短语是什么?

名人地位,是的,你知道,或者你知道一家拥有这种地位的公司或其他什么,然后一旦你开始在社交媒体上抱怨它,接下来你就会知道它被解决了,对吧?这并不是我们中的 99%,对吧?

是的。好的。我认为你现在可以开始收听了。是的。是的。好的。还有什么你想补充的吗?或者我们应该就此结束?请收听下一集,看看发生了什么。是的。

如果你喜欢你在这个播客中听到的内容,并且你想帮助这个播客继续前进,并邀请优秀的嘉宾和进行精彩的对话,我邀请你成为 Patreon 支持者。你可以访问 patreon.com/compileswift,在那里你可以获得无广告版本的播客以及其他内容。

让我们谈谈你的恐怖故事之前发生的事情。也就是说,我认为大多数人作为苹果开发者都知道这一点。但也有相当一部分人甚至没有想过它。那就是 TestFlight。

所以我们将详细介绍我们如何使用 TestFlight,它是什么,为什么你应该使用它,也许为什么你不应该使用它,以及你如何克服所有这些,然后在进行应用审核时被拒绝。所以我会在这里,我会为那些不知道 TestFlight 是什么的人做一个简短的概述。

例如,如果你熟悉 Android 平台,你就会知道 Google Play 商店。有一个 Google Play 商店控制台,它是 Google 的 TestFlight 等效物。这是一个可以进入的地方,它允许你做的是将你的二进制文件从 Xcode 推送到 TestFlight。你可能在进行归档过程时看到过这个。

这是一个测试,这是一个预暂存区或暂存区,我想,用于测试。它可以由你、内部组或外部组进行测试。但我认为它是一种模拟,我想我称之为模拟,在进入生产环境之前进行生产环境的模拟。你会说这是一个公平的描述吗?这就是我向人们描述它的方式。

是的,它基本上是一种将你的应用程序发布给一部分用户的方式,正如你所描述的那样,两种不同的用户组。你可以拥有内部用户,他们是专门可以访问你的 App Store Connect 页面的用户,我们稍后会讨论为什么这可能是或可能不是最好的主意,以及外部用户,他们是没有访问你的 App Store Connect 页面的用户。

你可以通过几种不同的方式将人们添加到这些不同的组中。但是是的,这是一种在实际将其发布到 App Store 之前向人们提供你的应用程序访问权限的方式。是的。正如 Jeff 所说,这里非常清楚地有两个组。

好吧,实际上,我想技术上来说有三个。其中一个是只有你。我们将在这里对它们进行划分。但这一切都始于你进行归档和 Xcode。你推送它并说,嘿,我想将这个发送到 TestFlight。所以它会进入 TestFlight 门户。它

有时需要几分钟,也可能更长一些,具体取决于当天的运行情况。然后最终它会出现在这个列表中,你可以在门户中配置你的应用程序和不同的版本,无论是什么,0.1、0.2,不同的版本号,这非常重要。我们会谈到这个,因为它很容易让你措手不及。

那么你想介绍内部组吗?我会介绍我如何使用外部组以及它如何对其他人有益。是的。所以内部用户是如我之前所说,可以访问你的 App Store Connect 帐户的用户。所以你通过转到 App Store Connect,转到用户和访问权限,然后在那里为他们提供一个帐户来添加他们。

然后将他们添加到你的 TestFlight 组中。你可以在 TestFlight 中拥有多个不同的组,包括内部组和外部组。但这仅仅是将获得给定版本访问权限的用户集合。拥有内部用户的好处是他们——

可以立即访问版本。你不需要经过任何审核。你基本上可以这样说,我发布了这个版本,这个用户可以访问它,他们会立即获得访问权限。缺点,或者至少是

在使用内部组时需要注意的是,你必须在 App Store Connect 中为他们分配角色。即使是 App Store Connect 中最有限的角色也拥有相当大的权力。我认为你可以在 App Store Connect 中赋予某人的最有限的角色是客户支持。作为客户支持,他们仍然拥有

代表你购买和提交技术支持事件(TSI)的能力,这些事件你每年可以获得两个,以请求代码级别的支持。他们可以使用你的帐户代表你这样做,并向你收费。他们还可以回复和编辑 App Store 中客户评论的回复。所以如果有人评论了你的应用程序,

他们能够进入并说,不,闭嘴,并将此作为你公司对他们评论的官方回应。因此,请确保你将这些内部客户支持级别赋予你确实信任的人,并确保你不会因为想要让某人能够测试你的应用程序而赋予他们过多的权力。

一旦你,你知道,它在那里设置好了,我们应该指出的一件事是,假设它仍然相同,你会收到一封电子邮件。我作为测试人员,对吧?我会收到一封电子邮件,说,嘿,你知道,首先,你会被邀请测试该应用程序。大多数开发者可能都见过这种情况,或者肯定知道其他应用程序,你知道,

他们可以加入成为该应用程序的测试人员。所以它说,嘿,你已被邀请参加测试计划,等等。所以你接受了。从那时起,你会有,我说得对吗?你必须拥有

TestFlight 在你的设备上,对吧?因为这是唯一的方法。是的。所以它会在你的 iPhone 上的 TestFlight 中列出。发布了新版本。我们稍后会在介绍完不同的组之后讨论这一点。他们会收到通知。实际上,根据设置的不同,它还会更新已安装的应用程序。例如……

你的应用程序,对吧?我一直都在测试版上,它被设置为,嘿,当你推出一个新版本时,它会自动更新,对吧?是的。所以还有什么你想介绍的关于内部组的内容,然后我会谈谈外部组。没有。好的。所以在外部组中,这也许是一个,你会说这很公平,很多人都会看到,因为它打开了……

引号中的可能性,任何人都可以加入。是的。所以你要做的就是进入门户,对吧?你会在测试人员下看到 Jeff 刚才提到的内部测试,还会有外部测试,你可以创建组。你可以随意命名它们,对吧?所以它可能是,你知道,

质量保证、开发者、高管,不要给高管一个组。让我们把这个从列表中划掉。产品经理,不要给他们访问权限。但是那种事情,对吧?所以你创建一个组,然后在这个组里面,

你可以做的一件事是你可以分配测试人员。所以,你知道,你会进去,你会说,好吧,你知道,我可以添加某人吗?当然,你会输入一些细节,例如,电子邮件地址。名字、姓氏、电子邮件地址。是的。只有电子邮件地址是必需的。

是的。虽然在整理这些列表时拥有姓名总是一件好事,因为有时这些列表会变得非常混乱。所以,是的。然后同样的事情,对吧?这个人会收到一封电子邮件,邀请他参加该计划,等等,正如我们刚才描述的那样。但这是在不让人们加入内部组的情况下做到这一点的一种方法,对吧?因为你……

至少在我看来,你应该尽可能地保持内部组的封闭性,并且你不想让太多人加入。你想要的基本上是我所说的必需品。例如,你的开发者、你的质量保证人员,他们可能在那里,对吧?但是这里的区别在于,对于外部组,你也有这个选项来创建一个公共链接。

现在,你可以反过来操作,因为你可以进入并禁用它。我正在查看我其中一个关于无尽障碍的链接。你可以进入并禁用它。但是如果你打开它,它会创建一个链接,对吧?它会类似于,你知道,testflight.apple.com/join/一些花哨的字符串。然后你可以复制该链接,这将使它基本上对使用该链接的任何人可用,他们可以获取该应用程序。但是

公平地说,在某种程度上,这可能不像你想象的那么有用,对吧?因为你不想拥有很多只想获取并使用该应用程序的测试人员,因为该应用程序在那里,它是新的,很酷,他们想玩它,而且他们从未给你任何反馈。这不是预期的结果。这取决于你的……

应用程序的目标。但是是的。是的,因为我说那样是因为有一段时间人们认为这是一种规避方法,我不必把它放到商店里,我可以管理它,这就像,这不是这种方法的本意。

而且在这里查看——对不起,继续说。我只是想说——并且为了防止它被这样使用,有一些限制。你可以最多拥有——我相信是 10,000 个外部测试人员。所以如果你认为你的应用程序永远不会超过 10,000 个用户,嘿,是的,当然,把它放在 TestFlight 上。就这么做吧。就这样做。但是另一个缺点是——

我不相信如果你在 TestFlight 上有你的应用程序,那么可以通过应用内购买实际收取任何费用,因为任何通过 TestFlight 分发的应用程序,所有应用内购买都是完全免费的。是的,据我了解,是的,这就像朋友们,这就像拥有你自己的,这就像一个质量保证堆栈,对吧?你知道,这有点不像现实世界,对吧?所以,我希望人们的质量保证堆栈与现实世界隔离开来。这么说吧。

那是一个完全不同的麻烦。例如,是的,有这个限制。我注意到在这里的组管理中,当我在这里查看公共链接时,它旁边确实显示了测试帐户,例如 4 个中的 10 个。你可以编辑该限制。如果我记得没错的话,我可能将我的设置为 10。你可以限制能够使用公共链接的用户数量。是的。

你可以设置最大数量。你经常在大型高知名度的 TestFlight 中看到这一点。例如,我想到的一个是 Ivory,Tapbots 的 Mastodon 应用程序。我认为他们所做的是发布他们的 TestFlight 链接,他们一次做 50 个人。然后他们会增加这个数字,他们会说,嘿,有 50 个空位。先到先得。

是的,他们会一次性推出更多。所以如果你想要大量的用户,但你不想一开始就被大量的用户淹没,那么另一种方法就是说,嘿,你知道,我将设置一个较低的限制。我将随着时间的推移增加这个限制,只要我准备好确保我有能力支持这么多用户。是的,实际上,我认为我就是这样进入 Ivory 应用程序的,我……

注册成为测试版用户,加入了,然后我现在还在使用它,因为现在它已经发布了,并且付费使用它,因为我喜欢它。但是是的,另一个很好的理由这样做是一个现实世界的例子,朋友们。你不想处于一种情况,你有很多用户在那里

然后你发布了一个版本,其中有一个严重的错误。例如,他们无法登录或其他什么。因为猜猜怎么了?你会收到很多消息。我的意思是,至少你是在发布到 TestFlight,而不是发布到你的现实世界。这是非常正确的。我希望你停在那里。是的。所以这就是为什么在我看来,有时就像你建议的那样,这是一个很好的建议。那些,你知道,慢慢地扩大列表非常……

在我看来,是人们版本的 alpha、beta,等等,对吧?你希望随着时间的推移,这些报告越来越少,对吧?然后你扩大组。这就是它的工作方式。你的版本将出现在 TestFlight 列表中。你可以分配,你知道,特别是对于外部组等等,你可以将它们分配给这些版本。所以……

你可能有一个你想要特定人群测试的特定版本。所以你可以将其分配给该组。对。然后在那里,你也会得到一些,你知道,显然在页面上,你可以得到一些统计数据,例如会话、有多少人下载了它,它崩溃了多少次,但是,

但是真的,使用分析,对吧?以及 Xcode 中的工具来做那种事情。但这是一种了解的好方法,好吧,至少有人下载了它,我们开始了。所以这就是你设置

你最初使用 TestFlight 的基本设置,你现在已经准备好开始行动了。休息时间。大家好。我是 Compile Swift Podcast 的 Peter Whittem。我想告诉你关于 Setapp 的信息。Setapp 是一项服务,每月只需支付 10 美元的订阅费,你就可以访问 200 多个 Mac 应用程序,现在它也作为该交易的一部分在 iOS 上可用。

我使用这项服务,因为它有很多我经常使用的真正优秀的一流应用程序。对我来说,作为一个开发者,能够访问用于 API、项目规划、撰写电子邮件、撰写文档的工具是无价的。你可以获得所有这些东西,包括数据库应用程序,所有这些东西都在 Setapps 服务上,每月只需 10 美元。你可以根据需要使用任意数量的应用程序。

如果你有兴趣查看它,请访问 peterwhitam.com,P-E-T-E-R-W-I-T-H-A-M.com/setapp,S-E-T-A-P-P。你可以在那里看到详细信息。它有一个链接,你可以点击它来开始使用这项服务,并看看它对你来说效果如何。我强烈推荐给每个 Mac 用户。休息时间结束。

但是,这里有一个但是,总是有一个但是,对吧?继续,Jeff,告诉我们这个但是。所以我们还没有真正介绍的外部测试和内部测试之间的主要区别是测试版应用程序审核。

本周,我们讨论 TestFlight,它是什么,如何使用它,以及为什么你应该使用它。(00:00) - 介绍 (11:26) - 支持此播客 (25:41) - SetApp (40:33) - 支持播客 (40:43) - 评分和评论 成为 Patreon 会员并帮助此播客生存https://www.patreon.com/compileswift 请留下评论并表达您的支持https://lovethepodcast.com/compileswift 感谢我们每月的支持者

Adam Wulf bitSpectre Arclite

★ 在 Patreon 上支持此播客 ★ </context> <raw_text>0 所以,当你要进行内部测试时,你可以将这些版本发布给任何用户。对于外部测试,你必须先通过 Apple 的审核。他们必须对你的应用进行应用审核,这与 App Store 的实际应用审核非常相似,但稍微不那么彻底。显然,他们不会检查应用元数据。他们不会检查任何类似的东西。他们只是确保……

你有一个实际的应用吗?你不能只发布,你知道,一个示例项目到应用商店,你的 hello world。他们确实确保你有一个实际的应用在那里发布。钻石和红宝石的图片。没错。而且他们显然正在检查以确保你没有发布任何恶意内容、任何非法内容等等。

但是,是的,你必须让这个应用通过 Beta 应用审核。现在,关于其工作方式的有趣之处在于,你只需要在更改版本号时才需要这样做。为了澄清,我的意思是营销版本号。所以你会看到像 1.0 或 2.0 这样的版本号。然后,你可以在相同名称下发布具有不同内部版本号的更多版本。

版本号,Apple 通常不会再次检查。他们保留这样做的权利,但通常情况下,只要你发布的是相同的应用,相同的版本号,不同的内部版本号,你就不必再次进行 Beta 应用审核。但是,下次你修改版本号时,你将不得不再次经历这个过程。好点子。并且,让我们在这里谈谈这些内部版本号,因为,

这里有一些有趣的事情,大家应该注意,因为你想增加你的内部版本号。这样做的原因是你不能提交相同版本号和内部版本号的应用。它会返回并说,嘿,这个已经存在了,然后递增它。

你可以只更改其中一个,对吧?所以你可以,你知道,很常见的是更改内部版本号,例如。我现在谈论的是 iOS,因为那是我的大部分,你知道,我在 TestFlight 和 App Store 上的经验。

所以你可以手动增加你的内部版本号,或者如果你有 CI/CD,实际上,老实说,最好的答案是拥有 CI/CD 并让它为你做这件事,这样你就不必记住和跟踪这些事情了。但是 Jeff,你想在这里补充一些我不知道的事情吗?

是的,这是真的。你对 iOS、tvOS、visionOS 的说法是正确的,这三个平台可以在 App Store Connect 上添加,在那里它是正确的。在 macOS 上,你根本不能重复使用内部版本号。

所以在 iOS、tvOS、VisionOS 上,你可能会问,watchOS 在哪里?好吧,你不能在没有 iOS 应用的情况下提交 watchOS 应用,所以它在 iOS 下。它有点被涵盖了。是的,它被涵盖了。在 iOS、tvOS 和 VisionOS 上,你可以提交营销版本 1.0 内部版本号 10。然后你可以转过身来提交营销版本 1.1 内部版本号 10。它完全没问题。

在 macOS 上,第二个会失败,因为你已经使用了内部版本号 10。所以,在 macOS 上,你必须这样做:营销版本 1.0,内部版本号 10,营销版本 1.1,内部版本号 11。你不能在 macOS 上重复使用相同的内部版本号。这很有趣。我没有。所以我从未提交过应用。

到 TestFlight 或任何类似的东西到 Mac 上。所以我没有遇到过这个问题,这很好知道。这几乎就是你如何使用 TestFlight 以及你使用它的原因。现在,当然,你也会根据你将如何使用它来调整和使用你自己的工作流程。如果你在一个团队中,显然,讨论一下是很好的。但我真的认为,

至少从我的角度来看,我不想在这里代表 Jeff 说话。我认为最好的答案是设置你的 CICD,对吧?Fastlane 或任何你选择的工具。一旦你经历了设置它的痛苦,就让它为你处理所有这些事情,包括签名等等。我们甚至没有谈论这个,但我认为,你知道,公平地说,如果你正在收听这个播客并且你是一位开发者,你就会知道签署应用的痛苦,对吧?就这么简单。是的。

我们这里已经拥有了一切,对吧?我们已经设置好了。TestFlight 正在向大家发布。大家正在使用它。顺便说一句,如果你曾经在 TestFlight 上使用过一个应用,当你安装它时,你会看到一个屏幕,上面写着,嘿,你知道,开发者希望你看看这个、这个和这个。然后它说,嘿,你可以截个屏并发送反馈。那么这个反馈是什么呢?以及

你可以放入哪些信息,以及它是如何工作的,Jeff?是的,开发者从那里获得的是显然发送的屏幕截图,以及关于用户当时体验的大量有用信息。所以它会有诸如他们使用什么设备?他们使用什么版本号?他们的电池电量是多少?他们有多少可用磁盘空间?只是一些有用的分析信息。

用户显然可以包含他们的屏幕截图,也可以包含一些评论。然后你将所有这些作为捆绑包获得,其中包括……

谁实际上向你提交了这些信息。因此,你可以使用这些信息并进行检查,看看你是否可以找出,你知道,是什么错误在那里发生的。是的,这是一个 zip 捆绑包。它包含一些 JSON。你也可以在 Xcode 中打开它。我不完全确定这对屏幕截图反馈有什么作用。

对于崩溃反馈,它有点不同,但我还没有深入研究崩溃反馈。是的,我喜欢崩溃反馈,因为它会直接带你到那里。是的。好吧,我不喜欢它,因为我不想收到任何反馈。你不想收到崩溃反馈。好的,朋友们。所以我要在这里给你举个例子,对吧?我在 Jeff 的条形码应用的 TestFlight 测试版上。这里发生的事情是,对吧,我的设备上安装了这个应用,我可以截屏也可以不截屏。

我总是建议大家尽可能多地向开发者提供信息。屏幕截图是无价的。让我这么说吧。但无论如何,我进入 TestFlight。当我查看 TestFlight 中的应用列表时,你会看到有一个发送……

Beta,Beta,Beta,英文,我知道,反馈按钮。当我点击它时,会弹出一个菜单,上面写着包含屏幕截图,不包含屏幕截图,对吧?所以,由于这是一个例子,我将点击不包含屏幕截图。然后它说,分享你的电子邮件地址。这是可选的。我会建议如果你已经花费了时间和精力……

测试开发者的这个应用,并且你发现了一些问题,作为开发者,我会说,请填写你的电子邮件,这样至少,我不仅可以回复你的评论,还可以感谢你发送给我这条消息。我输入了电子邮件地址,然后基本上它说,下面的文本框,告诉我们你的体验。在那里,你会尽可能详细地输入。帮助开发者。

然后你点击提交,它就会发送到门户网站。因此,一旦它到达门户网站,Jeff,是的,让我们谈谈这个包。是的。所以一旦它到达屏幕截图反馈的门户网站,你就会得到屏幕截图本身。如果包含了屏幕截图,你就会得到用户附加并填写到此表单中的所有信息以及他们的电子邮件地址。你还获得 Apple 默认自动包含的大量内置信息。所以你会得到应用版本,版本号和内部版本号。你会得到一些关于他们设备的信息,他们在什么设备上运行,什么版本的 iOS,一些更模糊的信息,如电池电量和他们有多少可用磁盘空间以及他们连接的互联网版本,他们是在 wifi 上还是在蜂窝网络上,诸如此类。所有这些信息都被打包并作为单个反馈发送给你,

理论上,你可以下载这些。现在对我来说似乎不起作用,但你应该也能以另一种形式获得所有这些信息。如果我记得没错的话,我相信它类似于 JSON 格式加上你的屏幕截图加上其他一些信息。这是另一种访问这些信息的方法,无需访问 App Store Connect 门户网站即可查看这些信息。但是,对于崩溃,你会得到非常相似的东西。你实际上无法在门户网站本身看到太多内容。

但是你会得到用户的电子邮件,他们包含的信息,所有相同的应用和设备信息。然后,如果你下载它,你还会得到实际的崩溃日志。所以这与你任何时候看到的崩溃日志类型相同。它包含你的堆栈跟踪。它默认情况下不会符号化,但你可以在 Xcode 中打开它。Xcode 会为你符号化它。获取你需要的所有信息来查看这个崩溃发生在哪里。

而这正是无价的部分,对吧?我的意思是,这就是为什么,你知道,你想尽可能多地向开发者提供信息,因为他们在日志和其他内容中获得的细节可以引导他们找到应用中的问题。他们坐在那里盯着它看。但是作为开发者……

我知道在这个阶段应用应该发生什么,我需要得到一个非常清晰的画面,作为用户你发生了什么。我唯一能做到这一点的方法就是你尽可能多地给我提供信息。我总是对大家说,嘿,信息再多也不为过。即使对你来说似乎无关紧要的东西,也可能突然变得非常重要。你可能是

10 个人中的一员,或者 100 个人中的一员说同样的事情。这也是我们作为开发者试图找出这里最需要修复的错误的方法。对你来说这可能看起来不是什么大问题,但如果你是 100 个报告这个问题的人之一,对我们来说就是一个大问题。

是的,是的。你可能拥有那一点额外的信息来破解这个案子。是的,是的。因为这里的想法是所有这些都应该在我们进入生产之前让世界变得更好。这是最后一步,对吧?你可以经历这个过程,正如我们之前所说,关于周期、内部版本号。

和版本号。我们可以多次经历这个过程,直到我们到达这样的点:好的,发布时间,祈祷吧。让我们改变一下,那看起来像什么?这是接下来直接的部分。

你已经在 App Store Connect 中设置了你的应用,对吧?所以当你准备分发时,我们不会在这里讨论分发,但我们会简单地给你一个关于你如何从一个过渡到另一个的想法。所以发生的事情是你完成设置你的分发版本,你可以选择一个二进制文件,对吧,基于列出的数量。

通过 TestFlight。所以你可能有 1.0 内部版本 127,对吧?1 到 127。这就是你将选择你的特定版本的地方。它不一定要是你推送的最后一个版本。这是一个重要的点,因为我经历过这种情况,对吧?就像,哦,实际上,我们不想使用最新的版本。之前的那个版本更好。我们想发布那个版本。所以你可以选择它。

这几乎就是整个过程。Jeff,还有什么我们想在这里讨论的吗?我觉得我们已经,希望,已经为想知道什么是 TestFlight 以及如何利用它来发挥优势的人们提供了一个相当不错的演练和解释。是的。

是的,不,我认为我们已经涵盖了你可能想知道的关于 TestPlate 的所有事情。太棒了。这非常及时,因为我预测至少有 10 个应用需要在本周使用 iOS 18 等等以及所有不同的平台进行更新,对吧?所以希望,你知道,朋友们,去安装你更新的操作系统,并在发生这种情况时收听播客。你有时间。相信我。你有时间。是的。是的。