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 (新着記事を読む