题目有点绕,大家将就看
前言
在 iOS 的内购中,有个大家都知道的操作,就是外币充值。即三方或者商人通过低汇率国家的货币进行充值,例如一个正常价格为 648 的商品,在汇率波动的情况下,某些地区实际购买需要的价格可能还不到原价的七折,那么此时受损的就是公司与正价购买商品的用户了。
所以在后续的流程中,为了减少此类事情的出现,增加了充值前做了商品地区判断的操作,当发现非中国地区的充值时,直接禁止充值并弹出提示(但实际上还是发现有用户可以通过部分的方法绕过)
地区判断方法:
在 iOS 13 以上的系统中,提供了方法
[[SKPaymentQueue defaultQueue].storefront countryCode]来获取当前商店所在地区;
而 iOS 13 以下的系统,则可以通过SKProductsRequest请求获取到的商品信息,并通过商品信息中的priceLocale来间接获取到当前帐号的所在地区。
在实际唤起充值之前,就通过获取到的地区来进行判断是否中国即可(应用仅在中国大陆上架)。
异常
问题是出现在一台新的测试机上:最近刚到了一台测试机,于是立即安装应用,准备完整的验证一遍应用的所有功能,但是在测试充值的时候,就出现异常了,此时直接弹出了禁止外币充值的提示,而原因就在于获取地区时,获取到地区为美国。
众所周知,iOS 在开发环境下使用的都是沙盒充值,并且沙盒充值时,获取到的地区都是跟随沙盒帐号所设置的地区的。而尴尬的事情来了。你会发现在沙盒帐号本该存在的位置看不到这行内容,也就无法设置、切换沙盒帐号。
解决方案
苹果有个很坑的机制,就是在唤起成功登录一次沙盒帐号之后才会出现沙盒帐号设置的地方(即上图)。
而巧的是没有登录沙盒帐号情况下,获取到的地区默认为美国,这样的话,就完美的被地区判断给限制无法唤起充值,而无法唤起首次充值,就无法登录中国地区的沙盒帐号,陷入了一个死循环。
幸运的是这种情况只会出现在沙盒充值中,正式场景可以随意切换appstore的帐号
要破解这个死循环,就得先关闭外币判断实现一次正常的沙盒充值,后续则可以继续开启外币判断进行愉快的测试了。