• twitter
  • facebook
  • B!
  • google plus

PRESSRELEASE & BLOGS

2014

03/09

アプリの離脱率を劇的に下げるために!iOSアプリの離脱ページの計測テクニック

ウェブサービスに限らず、アプリの継続率を上げるためには離脱率や離脱ページの計測は重要です。
離脱率の高いページを知り、改善することでアプリの継続率やコンバージョン率の向上につなげることができます。
特に新規ユーザーの離脱ページを改善すると継続率への影響は大きいでしょう。

今回は、iOSアプリの離脱ページ計測について3点にわけて紹介します。
1. iOSアプリにおける離脱とは
2. 最前面のUIViewの特定
3. 最前面のViewController (離脱ページ) の特定

Homer-Soul-Out-Of-Body



iOSアプリにおける離脱とは


iOSアプリにける離脱とは、ホームボタンを押したり、かかってきた電話に出たりなど、そのアプリケーションの利用が終了することと同義です。
このタイミングは UIApplicationDelegateapplicationWillResignActive: というデリゲートメソッドで検知できます。
このタイミングで最終的に表示していたページ(=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 (

新着記事を読む

DEVELOPERS BLOG

# DEVELOPERS BLOG

RECENT POSTS

POPULAR POSTS

CATEGORY

MONTHLY ARCHIVE