ios - 沙盒帐户经常需要登录
问题描述
为了测试我的应用内购买,我使用了沙盒帐户。然而,在测试之后,我收到了令人讨厌的警报,上面写着
Sign-In Required
Enter the password for .
[Environment Sandbox]
我已删除沙盒帐户,这意味着我不再无法登录该帐户。
我已采取的步骤(不起作用)
·删除并重新安装应用程序
·从我的个人 Apple ID 注销并登录
·使用我的备份恢复我的 iPhone
·循环通过 SKPaymentTransaction 并调用 finishTransaction
应用委托
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
・・・
IAPManagerClear.shared.startObserving()
・・・
}
IAPClearViewController
class IAPClearViewController: UIViewController {
var products = [SKProduct]()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override func viewDidAppear(_ animated: Bool) {
viewDidSetup()
}
func viewDidSetup() {
IAPManagerClear.shared.getProducts { (result) in
DispatchQueue.main.async {
switch result {
case .success(let products): self.buy(products: products)
case .failure(let error): print(error)
}
}
}
}
func buy(products:[SKProduct] ){
print(products[0])
IAPManagerClear.shared.buy(product: products[0]) { (result) in
}
}
}
IAPManager清除
class IAPManagerClear: NSObject {
enum IAPManagerError: Error {
case noProductIDsFound
case noProductsFound
case paymentWasCancelled
case productRequestFailed
}
static let shared = IAPManagerClear()
var onReceiveProductsHandler: ((Result<[SKProduct], IAPManagerError>) -> Void)?
var onBuyProductHandler: ((Result<Bool, Error>) -> Void)?
private override init() {
super.init()
}
func getProducts(withHandler productsReceiveHandler: @escaping (_ result: Result<[SKProduct], IAPManagerError>) -> Void) {
onReceiveProductsHandler = productsReceiveHandler
let request = SKProductsRequest(productIdentifiers: Set(arrayLiteral: "com.appname.premium.subscription.monthly"))
request.delegate = self
request.start()
}
func startObserving() {
SKPaymentQueue.default().add(self)
}
func stopObserving() {
SKPaymentQueue.default().remove(self)
}
func buy(product: SKProduct, withHandler handler: @escaping ((_ result: Result<Bool, Error>) -> Void)) {
let payment = SKPayment(product: product)
SKPaymentQueue.default().add(payment)
// Keep the completion handler.
onBuyProductHandler = handler
}
}
extension IAPManagerClear: SKPaymentTransactionObserver {
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
print("called")
print(transactions)
// let currentQueue : SKPaymentQueue = SKPaymentQueue.default()
// print(currentQueue)
// print(currentQueue.transactions)
for transaction in transactions {
print(transaction.error ?? "")
if transaction.transactionState == .failed{
queue.finishTransaction(transaction)
}
}
}
}
extension IAPManagerClear: SKProductsRequestDelegate {
func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
let products = response.products
// Check if there are any products available.
if products.count > 0 {
// Call the following handler passing the received products.
onReceiveProductsHandler?(.success(products))
} else {
// No products were found.
onReceiveProductsHandler?(.failure(.noProductsFound))
}
}
}
extension IAPManagerClear.IAPManagerError: LocalizedError {
var errorDescription: String? {
switch self {
case .noProductIDsFound: return "No In-App Purchase product identifiers were found."
case .noProductsFound: return "No In-App Purchases were found."
case .productRequestFailed: return "Unable to fetch available In-App Purchase products at the moment."
case .paymentWasCancelled: return "In-App Purchase process was cancelled."
}
}
}
出现警报时不调用 SKPaymentTransactionObserver。有没有人设法解决这个问题?
解决方案
推荐阅读
- java - 将 CSV 文件读入二维数组
- spring-mvc - LettuceConnectionFactory 中的错误
- php - 贝宝:MALFORMED_REQUEST
- python - 设置最后一个元素等于多维numpy数组中的第一个元素
- mysql - 将其他表中的多行合并为mysql中的1列
- android - Cordova - Android 上的自适应图标
- c# - 基于策略的身份验证 asp.net 核心的 500 内部服务器错误
- php - 如何在不消耗这么多资源的情况下使 sso 安全。?
- ruby - 初始化不带括号的对象数组时出现 Ruby 语法错误
- android - 按下按钮时复制元素