The feature described in this section is supported on the following versions and above:
iOS: 3.5.0
Android: 3.5.0
ReactNative: 2.5.0
Cordova: 2.5.0
Flutter: 1.5.0
Purchasely, by default, with a loading indicator while fetching the paywall from the network and preparing it for display.
Using Purchasely.fetchPresentation() method, you can pre-fetch the paywall from the network before displaying it. This provides the following benefits:
Display the paywall only after it has been loaded from the network
Handle network errors gracefully
Show a custom loading screen
Pre-load the paywall while users navigate through your app, such as during onboarding screens
Choose for a specific placement
Display
Implementation
Call Purchasely.fetchPresentationfor a placement or with a presentation id
An error may be returned if the presentation could not be fetched from the network.
If successful, you will have a PLYPresentation instance containing the following properties
class PLYPresentation(
id: String?
placementId: String?
audienceId: String?
abTestId: String?
abTestVariantId: String?
language: String?
type: PLYPresentationType
plans: [String] // get PLYPlan instance with Purchasely.plan("planId")
// Android SDK only (Kotlin or Java)
view: PLYTemplateView?
// iOS SDK only (Swift or Objective-C)
controller: UIViewController?
}
A presentation can be one of the following types:
Normal: The default behavior, a Purchasely paywall created from our console.
Fallback: A Purchasely paywall, but not the one you requested, as it could not be found.
// fetch presentation with id
Purchasely.fetchPresentation(with: "presentationId", fetchCompletion: { presentation, error in
})
// fetch presentation for placement
Purchasely.fetchPresentation(for: "onboarding", fetchCompletion: { presentation, error in
guard let presentation = presentation, error == nil else {
print("Error while fetching presentation: \(error?.localizedDescription ?? "unknown")")
return
}
if presentation.type == .normal || presentation.type == .fallback {
let paywallController = presentation.controller
// display paywall controller.
} else if presentation.type == .deactivated {
// nothing to display
} else if presentation.type == .client {
let presentationId = presentation.id
let planIds = presentation.plans
// display your own paywall
}
})
[Purchasely fetchPresentationFor:@"onboarding" fetchCompletion:^(PLYPresentation * _Nullable presentation, NSError * _Nullable error) {
if (error != nil) {
NSLog(@"Error while fetching presentation: %@", error.localizedDescription);
return;
}
if (presentation.type == PLYPresentationTypeNormal || presentation.type == PLYPresentationTypeFallback) {
PLYPresentationViewController *paywallController = presentation.controller;
// display paywall controller.
} else if (presentation.type == PLYPresentationTypeDeactivated) {
// nothing to display
} else if (presentation.type == PLYPresentationTypeClient) {
NSString *presentationId = presentation.id;
NSArray<NSString *> *plans = presentation.plans;
//display your own paywall
}
} completion:nil];
Purchasely.fetchPresentationForPlacement("onboarding") { presentation, error ->
if(error != null) {
Log.d("Purchasely", "Error fetching paywall", error)
return@fetchPresentationForPlacement
}
when(presentation?.type) {
PLYPresentationType.NORMAL,
PLYPresentationType.FALLBACK -> {
val paywallView = presentation.buildView(
context = this@MainActivity,
viewProperties = PLYPresentationViewProperties(
onClose = {
// TODO remove view
}
)
)
// Display Purchasely paywall
}
PLYPresentationType.DEACTIVATED -> {
// Nothing to display
}
PLYPresentationType.CLIENT -> {
val paywallId = presentation.id
val planIds = presentation.plans
// Display your own paywall
}
else -> {
//No presentation, it means an error was triggered
}
}
}