Superwall
Advanced

getPaywall()

A function that retrieves a PaywallViewController for custom presentation.

You're responsible for the deallocation of the returned PaywallViewController. Do not present the same PaywallViewController in multiple places simultaneously.

The remotely configured presentation style is ignored when using this method. You must handle presentation styling programmatically.

Purpose

Retrieves a PaywallViewController that you can present however you want, bypassing Superwall's automatic presentation logic.

Signature

// Async/await version
@MainActor
public func getPaywall(
  forPlacement placement: String,
  params: [String: Any]? = nil,
  paywallOverrides: PaywallOverrides? = nil,
  delegate: PaywallViewControllerDelegate
) async throws -> PaywallViewController

// Completion handler version
public func getPaywall(
  forPlacement placement: String,
  params: [String: Any]? = nil,
  paywallOverrides: PaywallOverrides? = nil,
  delegate: PaywallViewControllerDelegate,
  completion: @escaping (PaywallViewController?, PaywallSkippedReason?, Error?) -> Void
)

Parameters

NameTypeDescription
placementStringThe name of the placement as defined on the Superwall dashboard.
params[String: Any]?Optional parameters to pass with your placement for audience filters. Keys beginning with $ are reserved and will be dropped. Defaults to nil.
paywallOverridesPaywallOverrides?Optional overrides for products and presentation style. Defaults to nil.
delegatePaywallViewControllerDelegateA delegate to handle user interactions with the retrieved PaywallViewController.
completion@escaping (PaywallViewController?, PaywallSkippedReason?, Error?) -> VoidCompletion block for the callback version.

Returns / State

Returns a PaywallViewController that you can present. If presentation should be skipped, throws a PaywallSkippedReason error.

Usage

Using async/await:

Task {
  do {
    let paywallViewController = try await Superwall.shared.getPaywall(
      forPlacement: "premium_feature",
      params: ["source": "settings"],
      delegate: self
    )
    
    present(paywallViewController, animated: true)
  } catch let reason as PaywallSkippedReason {
    print("Paywall skipped: \(reason)")
  } catch {
    print("Error getting paywall: \(error)")
  }
}

Using completion handler:

Superwall.shared.getPaywall(
  forPlacement: "premium_feature",
  delegate: self
) { paywall, skippedReason, error in
  if let paywall = paywall {
    present(paywall, animated: true)
  } else if let reason = skippedReason {
    print("Paywall skipped: \(reason)")
  } else if let error = error {
    print("Error: \(error)")
  }
}

How is this guide?

On this page