2017-04-07 8 views
5

私の意図は、SKStoreレビューコントローラ(該当する場合)を表示するか、自分のフィードバックコントローラを表示して、ユーザーをApp Storeにリダイレクトすることです。これを行うことで、ユーザーに複数回フィードバックを求めるのを避けることができます。SKStore Review Controllerが提示されているかどうかを判断することは可能ですか?

SKStore Review Controller(https://developer.apple.com/reference/storekit/skstorereviewcontroller)に関するAppleの不足しているドキュメントを読んだ後、SKStore Review Controllerが現在提示されているか、それとも以前に提示されたかを判断する方法がないようです。

私はNSUserDefaultsに表示頻度を潜在的に格納することができると私は理解しますが、そうすることは避けたいと思います。

+0

あなたはUserDefaultsを使用したくないと言っていますが、SKStore Review Controllerが現在提示されているかどうかを判断する方法がある場合でも、その値をどのように保存しますか? しかし、私は[this](http://stackoverflow.com/questions/43075515/how-to-use-requestreview-skstorereviewcontroller-to-show-review-popup-in-the)に回答します。 –

+0

[SKStoreReviewController]が重複している可能性があります。ユーザーが設定したレートでこのアプリ(RTA)をオフにしたことを検出する方法は3回までに達していますか?](https://stackoverflow.com/questions/42533520/skstorereviewcontroller-how-to-detectユーザーがオフになっています。このアプリは動作しません。 –

答えて

-3

実際、あなたが持っている階層によって異なります。 1つのnavigationControllerを使用している場合

for (vc in self.navigationController.viewControllers) { 
if (vc isKindOfClass(SKStore​Review​Controller)){ 

//Means it is present 
    } 
} 
+1

これは機能しません。私は、SKStoreReviewControllerがナビゲーションスタックに何かを追加するとは思わない。 – Lachlan

0

これが表示されているかどうかを検出する方法は次のとおりです。

private static func checkIfShownSKStoreReviewController(_ iteration: Int, originalWindowCount: Int) { 
    let windows = UIApplication.shared.windows 
    if windows.count > originalWindowCount { 
     let window = windows[1] 

     if window.className == "UITextEffectsWindow" || window.className == "UIRemoteKeyboardWindow" { 
      print("Shown SKVC iteration: \(iteration)") 

      //Do logic stuff like saving to your database 
      return 
     } 
    } 

    if iteration > 2000 { 
     print("checkIfShownSKStoreReviewController: timeout, bailing \(iteration)") 
     return 
    } 

    runThisAfterDelay(seconds: 0.02, after: { 
     checkIfShownSKStoreReviewController(iteration + 1, originalWindowCount: originalWindowCount) 
    }) 
} 

private static func runThisAfterDelay(seconds seconds: Double, after:() ->()) { 
    let time = dispatch_time(DISPATCH_TIME_NOW, Int64(seconds * Double(NSEC_PER_SEC))) 
    dispatch_after(time, dispatch_get_main_queue(), after) 
} 

static func showReview() { 
    print("Showing AppStore Review") 
    if #available(iOS 10.3, *) { 
     SKStoreReviewController.requestReview() 
     checkIfShownSKStoreReviewController(0, originalWindowCount: UIApplication.shared.windows.count) 
    } 
} 
+0

答えをありがとう。理論的には機能しますが、私が探しているものではありません。 潜在的に40秒待ってから別のフィードバック/レビューコントローラでUIを更新することは理想的ではありません。 これは私がこれまでに見てきた最も良い応答ですが、最終的には表示が表示されているかどうかを判断する必要があります(40秒以内に提示されると仮定します)。 – Lachlan

+1

私は、 10回目の繰り返し。したがって、最大0.2秒です。しかし、私はそれがさまざまな要因によって異なると確信しています。あなたが好きな場合は、反復カウントで遊んで5秒後にメッセージを送信することができます。 – Esqarrouth

関連する問題