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.
You will be notified about the purchase but not about the plan purchased. If you want to know the plan, you must use the method describe above with paywall displayed
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