5

私はライブラリRMStoreを使用しています- ここに私が現在持っているものがあります。

1) 自動更新サブスクリプションを購入し、返された領収書を確認します。

[[RMStore defaultStore]addPayment:[Environment environment].premiumProductIAPId success:^(SKPaymentTransaction *transaction) {
  [[RMStore defaultStore].receiptVerificator verifyTransaction:transaction success:^{

    //enable premium service

  } failure:^(NSError *error) {

  }];
} failure:^(SKPaymentTransaction *transaction, NSError *error) {

}];

2) アプリを起動するたびに、その日付のサブスクリプションが有効であることを確認し、有効な場合はプレミアム サービスを有効にします。

RMAppReceipt *appReceipt = [RMAppReceipt bundleReceipt];
if (appReceipt){
  NSInteger isActive = [appReceipt containsActiveAutoRenewableSubscriptionOfProductIdentifier:[Environment environment].premiumProductIAPId forDate:[NSDate date]];
  //enable premium service if active
}

3) ユーザーが別のデバイスでアプリを起動した場合、レシートが存在する場合はそれを更新し、購入にアクティブなサブスクリプションがあるかどうかを確認することで、購入を復元できるようにします。

"In most cases, all your app needs to do is refresh its receipt and deliver the products in its receipt."

- ガイドからです。コードは次のとおりです。

[[RMStore defaultStore]refreshReceiptOnSuccess:^{

  if ([receipt containsActiveAutoRenewableSubscriptionOfProductIdentifier:[Environment environment].premiumProductIAPId forDate:[NSDate date]]){
   //enable
  }else{ 
   //no longer active
  }
} failure:^(NSError *error) {

}];

私の質問:

  • RMStore がサブスクリプションがアクティブかどうかを確認すると、no が返されることがあります。レシートを確認すると、レシートは正しく、自動更新されていないと想定しています。別のサブスクリプションを購入しようとすると、既にサブスクリプションしているというメッセージが itunes から表示されます。その後の起動時に、新しいレシートが表示されます。これは、起動時に領収書を更新する必要があることを示していますが、不要なユーザー名とパスワードのポップアップが表示されるため、更新したくありません。ここでのベストプラクティスは何ですか?
  • 別のデバイスのサブスクリプションを正しい方法で復元していますか? サブスクリプションを復元するには、複数回の試行が必要な場合があります。
  • サブスクリプションをサーバーに保存するために、記録を保持する以外に必要なことはありますか?
4

1 に答える 1

4

私は自分の質問に答えようとします。

起動時に最初に検出されない更新がある可能性があるため、サブスクリプションは非アクティブに見えます。

完了したトランザクションをリッスンするオブザーバーを追加しました (RMStore はこの StoreKit 機能を拡張します)。

この通知を受け取るたびに、アクティブなサブスクリプションの (現在更新されている) 領収書を確認し、プレミアム サービスがあればそれを有効にします。

- (void)storePaymentTransactionFinished:(NSNotification*)notification
{
  BOOL isActive = [[RMAppReceipt bundleReceipt] containsActiveAutoRenewableSubscriptionOfProductIdentifier:[Environment environment].premiumProductIAPId forDate:[NSDate date]];
  if (isActive){
    //enable premium
  }
}  

これは機能しているようです。誰か他の提案があれば教えてください。

于 2015-08-24T23:07:58.257 に答える