When you display a paywall with Purchasely.presentation you have a closure for the result of user action PLYProductViewControllerResult with three possible values
Purchased
Restored
Cancelled
You also have as a second argument the plan bought or restored by the user, it is set to nil if no purchase was made.
This is the preferred way to get notified when a purchase or restoration was made from a Purchasely paywall.
let paywallCtrl = Purchasely.presentationController(
for: "my_placement_id",
contentId: "my_content_id",
completion: { (result, plan) in
switch result {
case .purchased:
print("User purchased: \(plan?.name)")
break
case .restored:
print("User restored: \(plan?.name)")
break
case .cancelled:
break
@unknown default:
break
}
})
try {
var result = await Purchasely.presentPresentationForPlacement(
"onboarding",
isFullscreen: true);
switch (result.result) {
case PLYPurchaseResult.purchased:
print('User purchased: ${result.plan?.name}');
break;
case PLYPurchaseResult.restored:
print('User restored: ${result.plan?.name}');
break;
case PLYPurchaseResult.cancelled:
print("User cancelled purchased");
break;
}
} catch (e) {
print(e);
}
Anywhere in your application
When a purchase or restoration is made, you can listen to our notification.
This is the method to use in parts of your application where you wish to unlock some features after a purchase was made but you should only use it to unlock content, not to notify your server of a purchase or check the current state of user subscription.
Once the purchase is made to Apple Servers, registered in our systems, Purchasely sends a local Notification in the NotificationCenter. You can use it to unlock the content or refresh it.
// You can use LiveData
Purchasely.livePurchase().observe(this, (plan) -> {
reloadContent(plan);
});
// Or PurchaseListener
Purchasely.setPurchaseListener(purchaseListener);
Purchasely.addPurchasedListener(() => {
// User has successfully purchased a product, reload content
});
Purchasely.purchasedSubscription(() => {
// User has successfully purchased a product, reload content
});
Purchasely.listenToPurchases(() {
print('User has purchased a product');
});
//when no longer needed, remove listener
Purchasely.stopListeningToPurchases();
- (void)reloadContent: (NSNotification *)aNotification {
// Reload the content
}
private fun reloadContent(plan: PLYPlan?) {
//Reload the content
}
//Instance of PurchaseListener
private val purchaseListener: PurchaseListener = object : PurchaseListener {
override fun onPurchaseStateChanged(@NotNull state: State) {
if (state is State.PurchaseComplete) {
reloadContent(state.plan)
} else if (state is State.RestorationComplete) {
reloadContent(state.plan)
}
}
}
private void reloadContent(@Nullable PLYPlan plan) {
//Reload the content
}
//Instance of PurchaseListener
private PurchaseListener purchaseListener = new PurchaseListener() {
@Override
public void onPurchaseStateChanged(@NotNull State state) {
if(state instanceof State.PurchaseComplete) {
PLYPlan plan = ((State.PurchaseComplete) state).getPlan();
reloadContent(plan);
} else if(state instanceof State.RestorationComplete) {
PLYPlan plan = ((State.RestorationComplete) state).getPlan();
reloadContent(plan);
}
}
};
For example, this can be done in every controller that displays premium content. That way you won't have to reload the content each time the controller is displayed unless a payment was made