使用StoreKit API获取App Store区域信息异常问题求助
问题
我尝试使用StoreKit API获取当前App Store的区域信息,该代码在iOS 13及以上系统可运行,部分情况下能正常工作,但并非始终准确。
代码如下:
if #available(iOS 13, *){ let queue = SKPaymentQueue.default() if let storefront = queue.storefront { let countryCode = storefront.countryCode let identifier = storefront.identifier print("Country Code: \(countryCode)") print("Identifier: \(identifier)") } else { print("Failed to get storefront information") } }
当我使用中国区App Store账号时,返回的国家代码为"CHN"、标识符为"143465",结果正确。但切换至美国区App Store账号(非iCloud账号)后,仍返回"CHN"和"143465",结果错误,请问该如何解决此问题?
解决方法
1. 监听Storefront变更通知
SKPaymentQueue的storefront不会自动实时更新,切换App Store账号后需监听SKPaymentQueue.storefrontDidChangeNotification通知,在回调中重新获取最新信息:
if #available(iOS 13.0, *) { // 注册通知监听 NotificationCenter.default.addObserver(forName: SKPaymentQueue.storefrontDidChangeNotification, object: nil, queue: .main) { [weak self] _ in self?.fetchCurrentStorefront() } } // 封装获取storefront的方法 private func fetchCurrentStorefront() { guard #available(iOS 13.0, *) else { return } let queue = SKPaymentQueue.default() if let storefront = queue.storefront { let countryCode = storefront.countryCode let identifier = storefront.identifier print("Updated Country Code: \(countryCode)") print("Updated Identifier: \(identifier)") } else { print("Failed to get storefront information") } }
2. 验证缓存问题(临时方案)
Storefront信息可能存在本地缓存,切换App Store账号后直接重启App,再调用获取代码,可验证是否为缓存导致的异常。正式场景优先使用通知监听方案。
3. 排查网络与账号操作问题
- 确保网络环境与目标App Store区域匹配,避免VPN未正确切换等地域限制问题导致信息未更新。
- 注销当前App Store账号后重新登录目标账号,等待3-5秒再获取Storefront,避免操作过频繁导致缓存未刷新。
4. 用SKCloudServiceController作为备选验证(iOS 11+)
如果StoreKit的storefront获取异常,可尝试用SKCloudServiceController获取地区信息作为补充,注意该方法需要用户授权媒体与Apple Music访问权限:
if #available(iOS 11.0, *) { SKCloudServiceController().requestStorefrontCountryCode { countryCode, error in if let countryCode = countryCode { print("Cloud Service Country Code: \(countryCode)") } else if let error = error { print("Error getting country code: \(error.localizedDescription)") } } }
内容的提问来源于stack exchange,提问作者MongieLee
相关产品推荐
相关产品推荐

