In OnInitializeStoreComplete() you can currently query for products purchased (V2 did it this way and it still works this way in V3):
private void OnInitializeStoreComplete(BillingServicesInitializeStoreResult result, Error error) {
foreach (var product in result.Products) {
bool isProductPurchased = BillingServices.IsProductPurchased(product);
...
Or, you can explicitly wait for StoreComplete to finish, then call BillingServices.RestorePurchases() and do similar to the above in OnRestorePurchasesComplete().
Which is preferred?
Also, the docs say:
"It's always good to call Restore Purchases once you are done with InitializeStore call as the user will be available with unlocked content if he/she has purchased any earlier."
But Apple says you should not do automatically restore purchases unless the user presses the button. I am assuming if I use the new bool parameter in BillingServices.RestorePurchases(/forceRefresh=/false); it won't create a popup on IOS so it is OK to always do this.