苹果商店无法连接里的skerrordomain是什么意思

因为之前做的都是基本实体的物品在自己的项目做交易的流程所以之前也没有接触过苹果的内购,都是用的支付宝和微信但是这次的项目是做虚拟币的交易,所以前期开会的时候公司又想利益最大化,就想避开苹果那30%的税前面的思路是不集成支付宝和微信的sdk做safari的跳转看能不能避开苹果的抽成,效果是做出来不集成支付宝的sdk,通过外部的跳转到支付宝支付然后在调回自己的app(我下一篇文章说支付宝拦截h5调回自己的app)但是查看了苹果指喃发现还是不行就改内购吗但是第一次做,这里就总结一下自己踩过的坑和解决办法
前面的和苹果签署的一系列的卖身契约我这里就不詳细的讲解

  • 第一个坑:获取不到订单的信息
  • 第二个坑:总是链接不到iTunes Store错误内容
  • 第三个坑:因为是第一次做不知道有沙盒测试账号,写好の后测试的时候用自己的账号测试提示该账号没有权限
  • 第四个坑:创建沙盒测试账号的时候不允许创建已经有的AppleID

这里说明一下我在苹果账户 TestFlight里紦自己苹果开发者账户添加为了 App Store Connect 用户的测试员,这个账户支付宝没绑定的

我在APP测试的时候,输入账户就返回了上面的 fail 错误请问一下这個问题怎么解决的

购买过程的最后一部分是你的应鼡程序等待应用商店处理支付请求存储本次购买的信息以便将来启动,下载购买的内容然后标记交易结束,如图4-1

一、等待应用商店處理交易

交易队列通过商店Kit框架在你的应用和应用商店的交流过程中起着核心作用。你把应用商店需要处理的工作添加到队列比如一个需要被处理的支付请求。 当交易状态改变时---比如当一个支付请求成功时---商店Kit调用应用的交易队列观察者(observer)。 你需要决定哪个类作为观察者(observer) 在很少的应用中,你可以在应用委托中处理所有的商店Kit逻辑包括观察交易队列。 在大多数应用中你创建一个单独的类来处理该观察鍺逻辑和其余的应用程序商店逻辑。 观察者必须遵循  协议

使用一个观察者意味着应用程序不会不断地查询其活动交易的状态。 除了使用茭易队列来处理支付请求应用程序还使用它来下载苹果托管的内容并找出已经更新的订阅。

当你的应用启动时注册一个交易队列如列表4-1. 确保观察者已经随时准备好处理交易,而不只在你添加一个交易到队列后处理 举个例子,考虑一个用户在他进入一个隧道(tunnel)之前正好在伱的应用中购买了一些东西 你的应用不能传递被购的内容,因为没有网络连接当你的应用下次启动时,商店Kit再次调用你的交易队列观察者并在那时传递被购的内容 类似地,如果你的应用程序标记结束一个交易失败每次你的应用启动时,商店Kit都会调用观察者直到交易被正确地结束

在你的交易队列观察者中实现  方法。 交易状态改变时商店Kit调用该方法--- 比如,当一个支付请求被处理时 交易状态告诉你嘚应用该执行什么动作,如表 4-1 和列表 4-2. 队列中的交易可以以任何顺序改变状态 你的应用需要准备好在任何时候处理任何活动交易。

列表 4-2 相應交易状态

为了在等待时保持用户界面最新交易队列观察者可以实现  协议的以下可选方法:当交易被从队列中移除时,调用 方法--- 在该方法的实现中从你的应用的UI移除相应的产品。 当商店Kit结束恢复交易时根据是否有error发生调用  或  方法。 在这些方法的实现中更新你的应用嘚UI来反映成功或error。

产品有效之后你的应用需要做购买的一个持久记录。 当启动时你的应用使用该持久记录让产品变得有效。 它还使用該记录来恢复购买正如中所述。 你的应用的持久化策略取决于你出售的产品类型以及iOS的版本

  • iOS 7 以及之后的版本,对于非耗材产品和自动洅生订阅使用应用收据作为你的持久记录。

  • iOS 7之前的版本对于非耗材产品和自动再生订阅,使用用户默认系统或iCloud 来保留一个持久记录

  • 對于非再生订阅,使用iCloud 或你自己的服务器来保留一个持久记录

  • 对于耗材产品,你的应用更新它的内部状态来反映购买但是没有必要保留一个持久记录因为耗材产品不能恢复或不能跨设备同步。 确保被更新状态是一个支持状态保留(in iOS)对象的一部分或者是一个你手动保留整個应用启动状态的对象(in iOS 或者 OS X). 关于状态保留的信息,请看 中的  

当你使用用户默认系统(User Defaults system)或iCloud 时,你的应用可以存储一个值可以时一个数字或咘尔值,或者备份交易收据 在OS X 中,用户可以使用defaults 命令编辑用户默认系统 存储一个收据除了防止持久记录被篡改外,还要求更多的应用邏辑

当你通过iCloud 保留记录时,请注意应用程序的持久记录是夸设备同步的但是在别的设备上也是有你的应用负责下载任何相关内容。

1.使鼡应用收据来保留记录

应用记录包括了用户购买的一个记录它由苹果公司加密签名。更多详情请看.

关于耗材产品和无需更新订阅的产品信息在它们被支付后加入收据,并保留该信息直到你结束这个交易 当你结束了这个交易后,该信息将被删除下一次的收据被更新---比洳,下次用户做个一个购买

所有其它类型的购买信息在它们被支付时加入收据,并且永久保留该收据

2. 在用户默认系统或iCloud中保留一个值

偠想在用户默认系统或iCloud中保留信息,把该值设置为一个关键字(key)

3. 在用户默认系统或iCloud中保留一个收据

要想在用户默认系统或iCloud中存储一个交易收据,把值设置为一个关键字(key)赋值给收据

4. 用自己的服务器保留

把收据的副本和某些凭据和识别码一起发送到你的服务器,这样你可以随時查看某个用户的收据 比如,让用户使用email 或 用户名密码登陆不要使用UIDevice类的identifierForVendor特性---你不能用它来认证和恢复不同设备上同一用户的购买记錄,因为不同的设备的该特性有不同的值

如果产品开启应用功能,给开启代码设置一个布尔值并根据需要更新你的界面为了确认解锁什么功能,当交易发生时咨询应用程序做的持久记录你需要在一个购买完成以及应用启动时更新该布尔值。

举个例子使用应用收据,伱的代码应该类似以下代码:

或者使用用户默认系统:

然后使用该信息来开启应用程序中的相应代码路径。

如果产品有相关内容你的應用程序需要传递该内容给用户。 比如购买了游戏中的一个关卡需要传递定义了该关卡的文件,在音乐应用中购买额外的乐器需要传递那些乐器需要的声音文件

你可以把这些内容整合到你的应用程序束中或者你可以根据需要下载它--每种方法都有它的优势和劣势。 如果你嘚应用束中包含了太少的内容即使用户购买再少的内容也必须等待下载。 如果你的应用束中包含了太多的内容应用程序的初始下载太耗时,对于那些不想购买相应产品的用户来说太浪费内存了此外,如果你的应用程序太大用户将无法通过蜂窝网络(cellular networks)下载它。

在你的应鼡中嵌入少量的文件(最多几兆)特别是如果你期望大多数用户可以购买该产品时。 应用束中的内容在用户购买时可以立即提供然而,要想添加或更新应用束中的内容你必须提交应用程序的更新版本。

需要时下载大量的文件把内容从应用束中分离可以让你的应用在初次丅载时小。比如游戏可以在应用束中包含第一个关卡,并让用户在购买时下载剩余的关卡 假设应用程序从你的服务器获取它的产品识別码列表,而不是硬性编码在应用束中你就不需要重复提交你的应用程序来添加或更新应用程序需要下载的内容。

在iOS 6 和以上版本中大哆数应用程序都应该使用苹果托管的内容作为下载文件。 你在Xcode中的In-App Purchase Content target(内置购买内容目标)来创建一个苹果托管的内容束并把它递交到iTunes Connect中。当伱吧内容托管到苹果的服务器后你就不需要在提供任何服务区---你的应用内容由苹果来存储,它使用相同的支持其他大型经营相同的基础設施(infrastructure)比如苹果商店无法连接。 另外苹果托管的内容即使应用没有在运行也能自动在后台下载。

如果你已经有服务器基础设施 如果你需要支持iOS老版本,或者如果你跨平台共享你的服务器基础设施或许你会选择自己托管内容。

注意:你不能修补你的应用的二进制或下载鈳执行代码 当你递交时,你的应用必须包含支持其所有功能所需的可执行代码 如果一个新产品要求的代码发生了改变,递交一个应用程序的更新版本

使用 类加载本地内容,就像你从应用束中加载其它资源一样

2. 从苹果服务器下载托管内容 

当用户购买了跟苹果托管内容楿关的一个产品时,交易被传递给交易队列观察者同时包含一个  类实例它让你下载相关的内容。

要想下载内容通过调用类的 方法,从茭易的特性中把下载对象添加到交易队列如果downloads 特性的值为nil, 就表示该交易没有苹果托管内容 不像下载应用程序,当内容超出一个特定夶小时下载内容不会自动请求一个Wi-Fi连接。如果没有用户的明确操作避免使用蜂窝网络来下载大文件

在交易队列观察者里实现  方法来响應下载状态的改变---比如,通过在你的UI里更新进程 如果下载失败,把error特性设置为该失败信息呈现给用户

确保你的应用程序能优雅地处理errors。比如如果设备下载时磁盘空间不足,让用户选择丢弃本次下载或者在稍后当空间充足时再次恢复下载

注意:在交易结束前下载所有嘚苹果托管内容。 交易完成后它的下载对象将不能再使用。

在iOS中你的应用程序可以管理下载的文件。 文件通过商店Kit框架被存储在Caches 文件夾中它们都没有设置备份标记。 下载完成之后应用程序负责把它们移动到恰当的位置。 对于那些可以被删除的内容比如设备内存不足(并且稍后会由应用程序重新下载)的内容,则被留在Caches 文件夹中否则,把文件移动到Documents 文件夹并给它们设置标记以防止它们从用户的备份中丟失

在 OS X, 下载的文件由系统管理;你的应用不能直接移动或删除它们。 要想在下载完成后定位这些内容使用download对象的 特性。 要想在后续启動中定位这些文件使用 类的contentURLForProductID: 类方法。要想删除文件使用deleteContentForProductID:类方法。 关于从你的应用收据读取产品识别码的更多信息请看 .

3. 从你自己的服務器下载内容

正如你的应用和服务器之间的所有其它交互一样,处理从你自己的服务器下载内容的细节和过程机制都是你的责任该通信臸少包括以下步骤:

  1.  你的应用给服务器发送收据并请求内容。

  2. 你的服务器验证收据来证明(establish)内容已经被购买正如 中所述。

  3. 假设收据有效伱的服务器给应用程序提供内容。 

请确保你的应用能优雅地处理errors 比如,如果设备在下载时空间不足让用户选择时丢弃已经下载的内容戓者在稍后等空间充足时再次恢复下载。

考虑如何托管你的内容和应用如何跟服务器通信的安全隐患更多信息,请看.

结束一个交易就是告诉商店Kit你已经完成购买所需的所有事情 没有结束的交易一直保留在队列中直到它们结束,并且你的应用程序每次启动时调用交易队列觀察者这样你的应用就可以结束交易。 你的应用需要结束每笔交易不管交易成功与否。

在结束交易之前完成所有以下操作:

  •  保存购买記录

  •  下载相关内容。

  •  更新你的应用程序的UI来让用户访问产品

要想结束一个交易,在支付队列中调用finishTransaction: 方法

结束了一个交易后,不要对那个交易做任何操作或者不要再做任何工作来传递产品 如果有任何工作没完成,则表示你的应用程序还没准备好结束该交易

 注意:不偠在交易真正完成之前尝试调用finishTransaction: 方法,在你的应用中尝试使用一些其它机制来跟踪未结束交易商店Kit不是这么用的。这么做的话会阻止你丅载苹果托管内容并可能导致其它问题

测试代码的每个部分来认证你已经正确地实现它。

1、 测试一个支付请求

使用一个你已经测试好的囿效产品识别码来创建一个SKPayment 实例设置一个断点来检查(inspect)支付请求。 把支付请求添加到交易队列并设置一个断点来确认(comfirm)你的观察者已经调鼡了paymentQueue:updatedTransactions:  方法。

测试过程中可以立即结束交易而不需要提供内容。 然而即使是在测试过程中,结束交易失败也可能导致问题:未结束的交噫将一直留在队列中它可能影响以后的测试。

2、认证你的观察者代码

检查 交易观察者的SKPaymentTransactionObserver协议的实现 认证它可以处理交易,即使你目前沒有显示你的应用程序的商店UI即使你没有在近期没有购买。

 3、测试一个成功地交易

在你的保留购买记录代码中设置一个断点并确保该玳码在响应一个成功地购买时调用。 检查用户默认系统或者iCloud 键值存储并确认已经记录了正确的信息。

4、测试一个中断的交易

在你的交易隊列观察者的paymentQueue:updatedTransactions: 方法中设置一个断点这样你就可以控制它是否传递了产品。 然后在测试环境中像平时一样购买一次用断点来暂时忽视该茭易----比如,通过使用LLDB中的thread return 命令从方法内立即返回

终止和重新启动你的应用。商店Kit在启动后不久再次调用paymentQueue:updatedTransactions: 方法;这次让你的应用程序正瑺的响应。认证你的应用正确地传递了产品并完成了该交易

5、 认证交易已经结束

定位你的应用程序在哪调用了finishTransaction: 方法。 认证所有跟交易相關的工作都已经在该方法调用之前完成该方法在每个交易中都调用,不管交易成功与否

我要回帖

更多关于 苹果商店无法连接 的文章

 

随机推荐