2014
03/09
アプリの離脱率を劇的に下げるために!iOSアプリの離脱ページの計測テクニック
離脱率の高いページを知り、改善することでアプリの継続率やコンバージョン率の向上につなげることができます。
特に新規ユーザーの離脱ページを改善すると継続率への影響は大きいでしょう。
今回は、iOSアプリの離脱ページ計測について3点にわけて紹介します。
1. iOSアプリにおける離脱とは
2. 最前面のUIViewの特定
3. 最前面のViewController (離脱ページ) の特定
iOSアプリにおける離脱とは
iOSアプリにける離脱とは、ホームボタンを押したり、かかってきた電話に出たりなど、そのアプリケーションの利用が終了することと同義です。
このタイミングは UIApplicationDelegate の applicationWillResignActive: というデリゲートメソッドで検知できます。
このタイミングで最終的に表示していたページ(=ViewController)を取得できればよいのですが、アプリケーションの実装によっては同時に複数のViewControllerが存在するため特定が困難です。
ここでは applicationWillResignActive: が呼ばれた時点で最前面にあるViewControllerを離脱ページとして計測すればよいでしょう。
最前面のViewControllerを取得するには、下記の2ステップです。
- 最前面のUIViewを特定
- そのUIViewが属するUIViewControllerを特定
Google Analyticsなんかでもやってることでしょ?
Google Analyticsでも画面ごとの離脱率を計測することができます。
ですが、今回は新規ユーザーについてのみ、どの画面で離脱したかを計測するために実施しました。
最前面のUIViewの特定
最前面のUIViewを取得するには UIWindow から始まるsubviewsツリーの最後のViewを再帰的にたどって行くことで最前面のUIViewが取得できます。
最終的に applicationWillResignActive: で取得するので、UIApplicationDelegateのクラスでメソッドを実装します。
アプリケーションの最前面のUIViewを取得する処理の実装例
@implementation MyAppDelegate - (UIView *)foregroundView { // UIWindowから始まるView階層を再帰的にたどる UIView *foregroundView = self.window; while (1) { UIView *tmpView = nil; for (UIView *subview in foregroundView.subviews.reverseObjectEnumerator) { // 非表示のviewは除く if (!subview.hidden && subview.alpha > 0.f) { tmpView = subview; break; } } if (tmpView) { foregroundView = tmpView; } else { break; } } return foregroundView; } @end
最前面のViewController (離脱ページ) の特定
さきほど取得した最前面のUIViewのレスポンダチェーンをたどって行くと、そのUIViewが属するUIViewControllerが取得できます。
UIResponderクラスのカテゴリのメソッドを実装します。
UIViewのレスポンダチェーンから自身が所属するUIViewControllerを取得する処理の実装例
@implementation UIResponder (Addition) - (UIViewController *)belongingViewController { UIResponder *responder = self; while (1) { if (!responder) { return nil; } else if ([responder isKindOfClass:[UIViewController class) { return (UIViewController *)responder; } else { responder = responder.nextResponder; } } } @end
最終的に最前面のUIViewControllerを取得して計測する処理は下記のようになります。
最前面のUIViewControllerを取得して計測する処理の実装例
@implementation MyAppDelegate - (UIViewController *)foregroundViewController { // 表示されている最前面のViewControllerを返す UIViewController *vc = self.foregroundView.belongingViewController; if ([vc isKindOfClass:[UINavigationController class]]) { // UINaviagtionControllerの場合はtopViewControllerを返す return ((UINavigationController *)vc).topViewController; } else { return vc; } } - (void)applicationWillResignActive:(UIApplication *)application { // 会員登録から24時間以内のユーザーのみログを落とす if (
新着記事を読む