せっかく作ったアプリもAppStoreでレビューを書いてもらわないと、新たなユーザーによるダウンロードにつながらない。よくあるのが一定時間経過するとアラートが表示されてレビューしますか?と聞いてくるタイプ。でもこれユーザーからすると、ちょっとうっとおしい。突然アラートが表示されると脊髄反射的にキャンセルを押してしまいますよね。

そこで自分は以下のようにしてみました。

  • 一定時間以上使用するとレビュー画面へ遷移するボタン表示
  • レビューボタンは画面の空いている場所に配置。ツールバーなど
  • レビューボタンは一度押されるまで表示され続ける

こうしておくと、一定時間使用した後にレビューを書くという流れに誘導しやすいかも?少なくとも突然アラートが上がるよりは、気が向いた時にレビューボタンを押せてよい気がします。

とりあえず自分はこのように簡単な方法で実装しました。

  • アプリがアクティブになった時の時刻を保持(applicationBecomeActiveAt)
  • アプリがアクティブでなくなった時の時刻を保持(applicationResignActiveAt)
  • アプリがアクティブでなくなった時、上記の時間差を計測して保存(totalApplicationActiveTime)
  • totalApplicationActiveTimeが一定時間以上の値になった時、レビューボタンを表示
  • レビューボタンが押された時のイベントでレビューを開いたことを保持(isOpenApplicationReview)

AppDelegateのイベントで各値を更新します。

  • applicationBecomeActive(NSDate)はAppDelegate#applicationDidBecomeActiveで更新
  • applicationResignActive(NSDate)はAppDelegate#applicationDidResignActiveで更新
  • totalApplicationActiveTime(NSTimeInterval)もAppDelegate#applicationDidResignActiveで更新

totalApplicationActiveTimeの更新はこんな感じ。

_lastApplicationResignActiveAt = [NSDate date];
// 前回Activeになってから今回Activeでなくなるまでの期間を加算
_lastTotalApplicationActiveTime += [_lastApplicationResignActiveAt timeIntervalSinceDate:_lastApplicationBecomeActiveAt];
// TODO:NSUserDefaultsに保存

あとはlastTotalApplicationActiveTimeが一定時間以上か判定してレビューボタンを表示するか決める。

if (!_isOpenApplicationReview && (_lastTotalApplicationActiveTime >= 10*60*60)) {
  // TODO:レビューを開いたことがなく、10時間以上経過したらレビューボタンを表示
}

あとはレビューボタンのTouchUpInsideイベントでisOpenedApplicationReviewをYESにすればよいでしょう。

- (void)reviewButtonDidTouchUpInside {
  _isOpenApplicationReview = YES;
  // TODO:NSUserDefaultsへ保存
  // TODO:レビュー画面を開く
}

ちなみにレビュー画面は以下のようにしてSafariで開くことができます。

NSURL *reivewURL = [NSURL URLWithString:[NSString stringWithFormat:@"http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?id=%@&mt=8&type=Purple+Software", AppStoreでのアプリのID]];
[[UIApplication sharedApplication] openURL:reviewURL];

アプリのIDはAppStoreでのアプリのURLから判断できます。

https://itunes.apple.com/jp/app/passionz-for-tumblr/id557879179?mt=8

上記の場合、557879179がアプリのIDです。