避免插页显示该应用程序是否是通过 App Store 应用程序购买的

Avoid Interstitial to show if the App is Purchased through App Store App

从iOS11开始,Apple推出了从App Store App购买In App的功能。

问题:我们的问题是避免在通过从 App Store 应用程序购买的应用程序内购买唤醒应用程序时显示插页式广告。

我正在尝试通过新的 Storekit 功能来管理它:

https://developer.apple.com/documentation/storekit/skpaymenttransactionobserver/2877502-paymentqueue?changes=latest_minor&language=objc

- (BOOL)paymentQueue:(SKPaymentQueue *)queue shouldAddStorePayment:(SKPayment *)payment forProduct:(SKProduct *)product

我有两个问题:

1- 我想知道我们是否可以在调用此方法之前检测到应用内购是通过以下功能之一从 Apple Store 购买的事实

launchOptions 参数 ? :

- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)launchOptions

2 - 当我们 return 是或否(并将我们自己的付款添加到队列中)到

- (BOOL)paymentQueue:(SKPaymentQueue *)queue shouldAddStorePayment:(SKPayment *)payment forProduct:(SKProduct *)product

我们具体什么时候会看到新的应用内弹出窗口?

感谢您的任何回复。

paymentQueue:shouldAddStorePayment:forProduct: 之前,您不会收到 App Store 中的 inApp 通知。此外,除非您的应用在 paymentQueue:updatedTransactions:.

中出现,否则不会出现应用内弹出窗口

这是我能为您推荐的最好的东西:

我假设您不会在应用程序启动时立即投放插页式广告 - 这不会是很好的用户体验。因此,您只需要在您知道用户购买商品的时间和您处理该交易的时间之间阻止广告展示。

  1. 那么,你可以有一个默认为YES的全局变量BOOL doAllowIntAd
  2. 为了查明用户是否在 App Store 中购买了 inApp,在 application:(UIApplication *)application didFinishLaunchingWithOptions: 的早期,您调用 [[SKPaymentQueue defaultQueue] addTransactionObserver:yourTransactionObserver]; 以便您的观察者设置为接收来自 App Store 的 inApp。这是我在 didFinishLaunchingWithOptions:.

  3. 中做的第一件事
  4. 当调用 yourTransactionObserver 上的 paymentQueue:shouldAddStorePayment:forProduct: 时,在返回 YES 之前,设置 doAllowIntAd = NO 以阻止显示广告。

  5. 当 StoreKit 使用来自 App Store 的 inApp 在 yourTransactionObserver 上调用 paymentQueue:updatedTransactions: 时,您处理它的方式与处理在您的应用内进行的购买的方式相同。例如,对于 transaction.transactionState==SKPaymentTransactionStatePurchased,只需在处理完事务、启用内容并调用 [yourSKPaymentQueue finishTransaction:] 后添加 doAllowIntAd = YES,即可再次显示插页式广告。当然,您不仅应该为 SKPaymentTransactionStatePurchased 重新启用 doAllowIntAd,还应该为其他一些 transactionState 重新启用。但是,例如,如果交易被推迟,您可能会决定停用广告。

因此,如果 3 和 4 之间有任何延迟,您的广告将不会在此期间展示。大家可以实验一下,看看在实践中有没有延迟。

如您所知,您应该在展示广告之前检查购买状态。

最好 save 文档目录中某处的购买状态。 (NSUserDefaults 提供此功能以将信息保存在键值对中)。

这是一个示例代码,它可能对尝试此操作的任何人都有用。

您可以调整为购买成功后调用。

NSUserDefaults * defaults;
[defaults setObject:@"Purchased" forKey:@"InAppStatus"];

在决定展示广告之前,您可以查看状态。

if([[defaults valueForKey:@"InAppStatus"] isEqualToString:@"Purchased"]) {

   //App Should Unlock with No Ads

} else {

    //Show Ads
}

Apple 只是提供了一种从您的应用调用 InApp 购买的方法。但你有责任避免自己陷入不同的无休止循环。