2017-04-07 7 views
5

나의 의도는 SKStore 검토 컨트롤러 (해당되는 경우)를 표시하거나 내 자신의 피드백 컨트롤러를 표시하고 사용자를 App Store로 리디렉션하는 것입니다. 이렇게하면 사용자에게 한 번 이상 피드백을 묻지 않아도됩니다.SKStore Review Controller가 제공되었는지 확인할 수 있습니까?

SKStore 검토 컨트롤러 (https://developer.apple.com/reference/storekit/skstorereviewcontroller)에 대한 Apple의 부족한 설명서를 읽은 후 SKStore 검토 컨트롤러가 현재 제공되었거나 이전에 제공되었는지 확인할 방법이없는 것으로 보입니다.

잠재적으로 NSUserDefaults에 표시 빈도를 저장할 수 있다고 생각하지만 그렇게하지 않는 것이 좋습니다.

+0

당신은 UserDefaults를 사용하고 싶지 않지만 SKStore 검토 컨트롤러가 현재 제시되었거나 이전에 제공되었는지 확인하는 방법이 있다고하더라도 다음 값을 어떻게 저장하겠습니까? 하지만 [이] (http://stackoverflow.com/questions/43075515/how-to-use-requestreview-skstorereviewcontroller-to-show-review-popup-in-the) 답변을 확인합니다. –

+0

[SKStoreReviewController]의 가능한 중복 사용자가 설정에서 3 시간 제한에 도달 한이 앱 (RTA)을 해제했음을 감지하는 방법?] (https://stackoverflow.com/questions/42533520/skstorereviewcontroller-how-to-detect) -that-user-has-off-rate-this-app-rt) –

답변

-3

실제로 그것은 당신이 가진 계층에 달려 있습니다. 하나의 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

잘 시도해 보면 일반적으로 2 차원 그래픽으로 표시됩니다. 10 번째 반복. 따라서 최대 0.2 초. 그러나 나는 그것이 다른 요소들에 의해 다양 할 것이라고 확신합니다. 원하는 경우 반복 횟수로 재생하고 5 초 후에 메시지를 보낼 수 있습니다. – Esqarrouth