プッシュ通知からアプリ内の特定のviewを開く(iOS)

プッシュ通知による起動から離脱させない方法

通常、プッシュ通知よる起動ではアプリのTOPが開きます。ユーザーはプッシュ通知の文言に惹かれて起動したのにも関わらず、該当箇所を探すのに手間取り、そのまま離脱につながってしまうことがあります。離脱率の低下を防ぐため、プッシュ通知からアプリTOPではなく、任意の場所に直結した導線を張りましょう。

(例)

・新着記事のプッシュ通知から、該当記事に遷移させたい。
・セール情報のプッシュ通知から、セール商品特集ページに遷移させたい。
・新キャラ追加のプッシュ通知から、ガチャページに遷移させたい。

設定方法を以下にてご説明させて頂きます。

プッシュ通知にURLを添えて開く方法

Growth Pushのプッシュ通知には、カスタムフィールドという形で、ユーザーに表示されるメッセージ以外のデータを添えることが可能です。 このデータにWebページのURLを添えることで、プッシュ通知を開いたユーザーにそのURLのWebページを即座に見せることが可能です。

iOSで、プッシュ通知ごとにURLを指定して、アプリ起動時に開く方法 

このURLの代わりにアプリ内の特定の画面を識別するIDを指定することで、プッシュ通知からアプリ内の特定の画面を開くことが可能です。

プッシュ通知からカスタムフィールドのデータの受け取り

UIApplicationDelegateの実装クラスに下記のコードを実装することで、プッシュ通知からカスタムフィールドのデータを受け取ることができます。

- (BOOL) application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
 
    NSDictionary *userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
    if (userInfo) {
        // TODO userInfoから画面を識別するIDを取得して画面を開く
    }
 
    // ...(略)...
    return returnValue;
}
- (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
    if (application.applicationState == UIApplicationStateActive)
        return;
    // TODO userInfoから画面を識別するIDを取得して画面を開く
}

IDは上記画像のようにカスタムフィールドで指定して下さい。

画面を開く際の具体的な実装について説明します。

画面を識別するIDにしたがって画面を開く

たとえば、画面を識別するIDとして、独自のURLスキームをもつURLを指定するとします。

myapp://example.com/areas/123

このURLは、エリアのうちID:123の画面へ直接遷移するというURLです。

先のプッシュ通知受信時の処理として、たとえば下記のようなURLのパースと振り分けの処理を実装します。

- (BOOL) openUrl:(NSURL *)url {
 
    // URLスキームがHTTPの場合は、Webブラウザで開く
    if ([url.scheme isEqualToString:@"http"] || [url.scheme isEqualToString:@"https"]) {
        // TODO HTTPのURLをWebブラウザで開く処理
        return YES;
    }

    // 独自のURLスキームだった場合
    if ([url.scheme isEqualToString:kMyAppUrlScheme]) {
        NSArray *pathComponents = url.pathComponents;
        if ([pathComponents count] >= 3) {
            // パスを確認して処理を振り分ける
            if ([[pathComponents objectAtIndex:1] isEqualToString:@"area"]) {
                NSUInteger areaId = [[pathComponents objectAtIndex:2] integerValue];
                // TODO 指定のエリア画面を開く処理
            }
            // ...(略)...
        }
        // ...(略)...
    }
    return YES;
}

具体的な実装については、アプリに依存する部分が多いですが、同様の手法によって、プッシュ通知からアプリ内の特定の画面を開くことが可能です。