【问题标题】:Making Apple-hosted in-app purchase content download by WiFi only仅通过 WiFi 下载 Apple 托管的应用内购买内容
【发布时间】:2014-08-07 12:45:50
【问题描述】:

我有一个大的 (>1GB) 应用内购买,我想使用 Apple 托管的下载来交付。 Apple 文档说 Apple 托管的 IAP 内容对可以通过蜂窝连接下载的大小没有限制。我希望能够确保仅在通过 WiFi 连接时才允许购买。

在下载过程中,用户可能会走出门并转换到蜂窝网络。那时我想暂停或取消下载,直到 WiFi 再次可用。

我提出了 TSI,Apple 的回复是“我们的工程师已经审查了您的请求,并得出结论认为没有支持的方式来实现所需的功能”

在开始下载之前使用Reachability检查连接类型并在下载过程中使用观察者委托来确保手机没有切换到蜂窝电话似乎是可行的。

这能可靠地工作吗?有没有更好的方法来做到这一点?

此外,在下载进行时保持控制权方面,Apple 文档中并不清楚在后台运行的 Apple 托管下载是在我的应用程序的进程中,还是在进程外发生。换句话说,如果我的应用程序被终止,下载是保证停止还是继续在我的应用程序控制之外?

更新:凭借一些经验,这个问题有点没有实际意义。持续下载数据需要手机有 WiFi 连接和外接电源。没有这些,屏幕关闭后下载会暂停一段时间——我猜是手机的电源管理。此外,IAP 下载不在进程中,即使您的应用程序崩溃,它也会继续(尽管明确终止应用程序会停止下载)。当您的应用重新启动时,会调用 StoreKit 委托来完成下载和购买。

【问题讨论】:

  • 请不要。向用户显示下载量巨大的警告并让他们决定。但不要简单地禁止通过蜂窝网络下载。
  • 嗯,这是看待它的一种方式。我看待它的方式是用户没有阅读警告的后果,或者更有可能忘记下载正在进行中并且离开 wifi 可能非常严重,如果我可以避免它,我不想去那里。许多地方的手机超额费用为 100-500 美元/GB,国际漫游费用可能超过 10,000 美元/GB。 Google 会让您感受到由此产生的强烈情绪
  • Apple 不允许通过蜂窝网络下载大型(超过 50MB)应用程序。我认为将相同的逻辑应用于非常大的应用内购买内容并没有什么不同。
  • 在其他任何事情之前,您应该在bugreport.apple.com打开一个功能请求
  • @LeoNatan 我快速浏览了一下,我认为你是对的,没有办法控制它,尤其是你的应用程序被终止或后台运行。按照您的建议,将使用 NSURLSession。

标签: ios in-app-purchase


【解决方案1】:

您可以编写一个“下载管理器”来监控网络状态,并在支付队列中调用pauseDownloads:resumeDownloads:。看看here如何观察网络变化。

关于进程内下载与专用进程,我认为它发生在进程内。看一下 API,我们被告知仅当事务状态为 SKPaymentTransactionStatePurchased 时才将 SKDownload 对象排队,但是没有 API 可以获取所有已购买状态的事务并且当前已排队下载(就像我们在新的NSURLSession API,其中一种模式在外部守护程序中处理下载)。这一点,以及一些在尝试下载时完全崩溃的应用程序的经验让我相信它正在处理中。在这些崩溃的应用程序中,我必须恢复购买才能重新开始下载,这与 StoreKit 中暴露的 API 兼容。


另一个建议是,如果您可以自己托管内容,则可以使用 Apple 新的 NSURLSession API,您可以在其中明确告诉它仅通过 WiFi 下载。

【讨论】:

  • Leo,最后采纳了你的建议,使用了后台传输服务。我发现 Apple 托管的大型下载有时会中途停止,但 NSURLsession 似乎坚如磐石。还有一个问题,[[SKPaymentQueue defaultQueue] restoreCompletedTransactions] 有时只重放部分交易或不重放交易,如果下载是 Apple 托管的,这是一个严重的问题。
猜你喜欢
  • 2013-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-03
  • 2013-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多