안녕하세요 알 것을 제외하고(스위프트)
: 나는 사용자의 인터넷 연결 여부를하지만,이 경우 클래스가 인터넷을 확인하지만 난 해달라고 여부를 확인하기 위해 Rechibility 클래스를 사용 사과에서 정보를 받으십시오.
1 : 그냥 내가 지불 시스템을 생성하고 잘 작동
이 경우 그러나이다가 충돌하는 경우가 있습니다 사용자가 인터넷에 연결하지 않고 응용 프로그램을 입력 (와이파이 또는 4G) 2 : 사용자가 오프라인으로 앱을 구매하여 구매보기 컨트롤러로 들어갑니다. 3 : iPhone 홈 버튼을 누른 다음 Wi-Fi 또는 4G를 연결하십시오. 4 : 앱으로 돌아가서 버튼을 다시 누르면 충돌이 나타납니다
이 상황에서만 발생합니다. 다른 테스트 사례에서는 오류가 발생하지 않았습니다.
왜이 오류가 발생했는지 알 수 없습니다.
다음은 오류에 관한 코드와 이미지입니다.
내 현재 코드 : 위의 오류
import UIKit
import StoreKit
protocol IAPManagerDelegate
{
func managerDidRestorePurchases()
}
class IAPManager: NSObject, SKProductsRequestDelegate, SKPaymentTransactionObserver, SKRequestDelegate
{
static let sharedInstance = IAPManager()
var request:SKProductsRequest!
var products:NSArray!
//Load product identifiers for store usage
func setupInAppPurchases()
{
self.validateProductIdentifiers(self.getProductIdentifiersFromMainBundle())
SKPaymentQueue.default().add(self)
}
//Get product identifiers
func getProductIdentifiersFromMainBundle() -> NSArray
{
var identifiers = NSArray()
if let url = Bundle.main.url(forResource: "iap_product_ids", withExtension: "plist")
{
identifiers = NSArray(contentsOf: url)!
}
return identifiers
}
//Retrieve product information
func validateProductIdentifiers(_ identifiers:NSArray)
{
if Reachability.isConnectedToNetwork() == true
{
print("Enter")
let productIdentifiers = NSSet(array: identifiers as [AnyObject])
let productRequest = SKProductsRequest(productIdentifiers: productIdentifiers as! Set<String>)
self.request = productRequest
productRequest.delegate = self
productRequest.start()
}
}
func createPaymentRequestForProduct(_ product:SKProduct)
{
if Reachability.isConnectedToNetwork() == true
{
let payment = SKMutablePayment(product: product)
payment.quantity = 1
SKPaymentQueue.default().add(payment)
}
}
//MARK: SKProductsRequestDelegate
func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse)
{
//
self.products = response.products as NSArray!
for product in products
{
let temp = product as! SKProduct
if temp.productIdentifier == "monthly.subscription"
{
print("price: \(temp.price)")
formatProductMonth(free: temp)
}
if temp.productIdentifier == "weekly.subscription"
{
print("price: \(temp.price)")
formatProductFree(free: temp)
}
if temp.productIdentifier == "yearly.subscription"
{
print("price: \(temp.price)")
formatProductYear(free: temp)
}
}
// print("Product[0]: \(string)")
// print("Product[1]: \(prod1.productIdentifier)")
// print("Product[2]: \(prod2.productIdentifier)")
}
//MARK: SKPaymentTransactionObserver Delegate Protocol
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction])
{
//
for transaction in transactions as [SKPaymentTransaction]
{
switch transaction.transactionState
{
case .purchasing:
print("Purchasing")
UIApplication.shared.isNetworkActivityIndicatorVisible = true
break
case .deferred:
print("Deferrred")
let alertController: UIAlertController = UIAlertController(title: "Deferred", message: "Purchase deferred", preferredStyle: .alert)
let dismiss = UIAlertAction(title: "OK", style: UIAlertActionStyle.cancel, handler: nil)
alertController.addAction(dismiss)
alertController.show()
UIApplication.shared.isNetworkActivityIndicatorVisible = false
break
case .failed:
print("Failed")
//print(transaction.error?.localizedDescription)
UIApplication.shared.isNetworkActivityIndicatorVisible = false
SKPaymentQueue.default().finishTransaction(transaction)
let alertController: UIAlertController = UIAlertController(title: "Failed", message: "Purchase failed", preferredStyle: .alert)
let dismiss = UIAlertAction(title: "OK", style: UIAlertActionStyle.cancel, handler: nil)
alertController.addAction(dismiss)
alertController.show()
//UIApplication.shared.keyWindow?.rootViewController?.present(alertController, animated: true, completion: nil)
break
case.purchased:
StopActivator()
print("Purchased")
self.verifyReceipt(transaction)
let thankyou = UserDefaults.standard.bool(forKey: "Purchased")
if thankyou == true
{
let alertController: UIAlertController = UIAlertController(title: "Thank You", message: "Purchase completed", preferredStyle: .alert)
let dismiss = UIAlertAction(title: "OK", style: UIAlertActionStyle.cancel, handler: { (action: UIAlertAction!) in
UIApplication.shared.keyWindow?.rootViewController?.dismiss(animated: true, completion: nil)
})
alertController.addAction(dismiss)
alertController.show()
}
break
case .restored:
print("Restored")
let alertController: UIAlertController = UIAlertController(title: "Restore Success", message: "Your purchases have been restored", preferredStyle: .alert)
let dismiss = UIAlertAction(title: "OK", style: UIAlertActionStyle.cancel, handler: nil)
alertController.addAction(dismiss)
alertController.show()
break
}
}
}
사진 : 당신이 뭔가에 액세스 할 때
넵 대니 나는이 사실을 알고 있지만 사용자가 오프라인으로 정보를받을 수 없어 인터넷에 연결되어 있는지 확인하는 데 Rechiabilty 클래스를 사용하므로 제품에 대한 정보를 확인할 때 돌아 가지 않습니다. –