【问题标题】:Swift - WebView is nil after in app purchase has completedSwift - 应用内购买完成后 WebView 为零
【发布时间】:2020-12-29 22:56:53
【问题描述】:

我有一个混合 iOS 应用程序,我在其中通过 javascript 功能来回传递数据。在用户完成应用内购买之前,一切正常。在他们完成购买后,我尝试调用 webView.evaluateJavaScriptwebView 为 nil,从而引发错误并且不允许我完成该过程。

以下是我如何设置文件。

主视图控制器:

import UIKit
import WebKit
import Foundation
import StoreKit
import SafariServices

class MainViewController: UIViewController, WKUIDelegate, WKScriptMessageHandler {
  var webView: WKWebView!
  ...

  override func loadView() {
    super.loadView()
    ...

    webView = WKWebView(frame: .zero, configuration: config)
    webView.uiDelegate = self
  }

  ... 

  func finalizeIAPOrder() {
    print("webview: \(webView)"). // shows as nil
    webView.evaluateJavaScript("purchase_iap_completed()", completionHandler: nil)
  }

}

用户将通过webView 访问一个网站,然后来到一个可以购买产品的页面。该过程正常运行并最终转到我的PurchaseModel.swiftfinalizeProductOrder 操作(如下所示)。

PurchaseModel.swift

import Foundation
import StoreKit

class PurchaseModel {

  ...

  fileprivate func finalizeProductOrder(_ product: SKProduct) {
    MainViewController().finalizeIAPOrder()

    // I have also tried the line below with the same nil error:
    // MainViewController().webView.evaluateJavaScript("purchase_iap_completed()", completionHandler: nil)
  }
}

对此的任何帮助将不胜感激。在我接到返回主网站的电话后,我的应用程序已完全正常运行。

谢谢 埃里克。

【问题讨论】:

  • MainViewController() 正在初始化一个新实例。您必须将对 MainViewController 的显示实例的引用传递给 PurchaseModel。
  • 呃!甚至没有注意到这一点,@WilkoX 绝对正确

标签: ios swift in-app-purchase wkwebview evaluatejavascript


【解决方案1】:

感谢@WilkoX 的帮助。我最终做了以下事情:

主视图控制器

import UIKit
import WebKit
import Foundation
import StoreKit
import SafariServices

class MainViewController: UIViewController, WKUIDelegate, WKScriptMessageHandler {
  var webView: WKWebView!
  var purchaseModel: PurchaseModel?
  ...

  override func loadView() {
    super.loadView()

    purchaseModel = PurchaseModel(controller: self)
    ...

    webView = WKWebView(frame: .zero, configuration: config)
    webView.uiDelegate = self
  }

  ... 

  func finalizeIAPOrder() {
    webView.evaluateJavaScript("purchase_iap_completed()", completionHandler: nil)
  }

}

购买模式

import Foundation
import StoreKit

class PurchaseModel {

  var controller: MainViewController

  init(controller: MainViewController) {
    self.controller = controller
  }
  ...

  fileprivate func finalizeProductOrder(_ product: SKProduct) {
    controller.finalizeIAPOrder()
  }
}

还从this post获得帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多