Circuit Directとは

概要

Circuit Directとはアプリインストール有無に関わらず、ユーザーをアプリの詳細ページへ誘導するためのソリューションです。

管理画面上から遷移先の必要な情報を入力することで、ユーザーの端末やアプリインストール有無に合わせてユーザーを最適なページへ遷移させます。

対応環境

Circuit Directは以下の環境に対応しています。

iOS SDK対応開発環境

Xcode5、Xcode6、Xcode7(予定) ネイティブ言語(Objective-C/Swift)による開発環境

iOS SDK対応OS

iOS7、iOS8、iOS9(予定)

Android SDK対応開発環境

Android Studio 1.0.0 以上

Eclipse(ADT Pluginは最新版を推奨)

Android SDK対応OS

Android2.3.3 APIs 以上、Android Support Library, revision 21.0.2

管理画面推奨環境OS

Windows7以上、MacOSX10.8以上

管理画面推奨環境ブラウザ

Chrome最新版、Firefox最新版、Safari最新版


サービス設計

iOS SDKの主な挙動

Circuit Directのダイレクトリンク(リダイレクト)からApp Storeに遷移してアプリをインストール、
その後起動した際に、FingerPrinting等を利用してマッチ判定を行い、値の受け渡しやディープリンクでの遷移を行います。
※FingerPrintingとはネットワーク環境やブラウザなどから取得できる値を元にユーザーをマッチ判定する技術

Circuitディープリンクサポーターとの併用

CircuitディープリンクサポーターとSDKを共有しておりますが、機能自体は個別で利用が可能です。

Android SDKの主な挙動

マッチ判定の処理フロー

Circuit Directのダイレクトリンク(リダイレクト)からGooglePlayに遷移する際、インストールリファラに固有のtokenを渡し、
アプリ起動後、そのtokenをCircuitのAPIに渡すことでマッチ判定を行います。

Circuitディープリンクサポーターとの併用

CircuitディープリンクサポーターとSDKを共有しておりますが、機能自体は個別で利用が可能です。


マッチング方式

FingerPrinting方式の解説

1. ダイレクトリンクにアクセス

管理画面から作成したダイレクトリンクにアクセスします。 例ではhttps://dr.cir.io/xxx?item_id=123&user_id=456にアクセスします。

2. ユーザーデータ、パラメータ情報をCircuitのDBに保存

ダイレクトリンクアクセス時に付加されたパラメータ情報、例の場合はitem_id=123user_id=456をパラメータとしてCircuitのDBに保存します。

ダイレクトリンクに付加されたパラメータ情報は上限値を超えない限りすべて保存されます。

また、パラメータ情報の保存と同時に、リンクにアクセスしたユーザーとアプリインストール後にどのリンクにアクセスしたユーザーかを照合するためのデータをCircuitのDBに保存します。

3. App Storeに遷移

各種データをCircuitのDBに保存した後、App Storeへリダイレクトします。

4. アプリをダウンロード、起動

App Storeからアプリをダウンロードし、起動します。

5. アプリを初回起動、ダイレクトリンクのデータを検索

2でダイレクトリンクにアクセスした際に、取得したデバイス情報等のデータをCircuit SDKがCircuitのサーバーへ送信し、マッチするデータを検索します。

6. パラメータ情報・ディープリンク情報を取得

5でマッチするデータが見つかった場合、以下のデータが取得できます。

  • ダイレクトリンクに設定された各種データ
    • ダイレクトリンク名
    • 初回起動時のディープリンクURI
    • ディープリンクの遷移タイミング
    • ラベル
  • ダイレクトリンクにアクセスした際のパラメータ情報

7. 取得したデータを元にページ遷移・最適化

取得したデータを元に、初回起動時に任意のページへ遷移させたり、表示の最適化を行います。
遷移の処理は、Circuitディープリンクサポーターの機能を利用するか、独自実装の遷移処理で行います。

Androidでのマッチング方式の解説

1. ダイレクトリンクにアクセス

管理画面から作成したダイレクトリンクにアクセスします。 例ではhttps://dr.cir.io/xxx?item_id=123&user_id=456にアクセスします。

2. パラメータ情報をCircuitのDBへ保存、hashの生成

ダイレクトリンクアクセス時に付加されたパラメータ情報、例の場合はitem_id=123user_id=456をパラメータとしてCircuitのDBに保存します。 また、その際データに紐づく一意のhashを生成します。

また、ダイレクトリンクに付加されたパラメータ情報は上限値を超えない限りすべて保存されます。

3. Google Playに遷移

パラメータ情報をCircuitのDBに保存した後、生成したhashをreferrerに付加し、Google Playへリダイレクトします。https://play.google.com/store/apps/details?id=[app_id]&referrer=[hash]

4. アプリをダウンロード、起動

Google Playからアプリをダウンロードし、起動します。

5. hashからデータを検索

2で生成したhashをINSTALL_REFERRERから取得し、hashにマッチするデータを検索します。

6. パラメータ情報・ディープリンク情報を取得

hashが存在した場合、以下のデータが取得できます。

  • ダイレクトリンクに設定された各種データ
    • ダイレクトリンク名
    • 初回起動時のディープリンクURI
    • ディープリンクの遷移タイミング
    • ラベル
  • ダイレクトリンクにアクセスした際のパラメータ情報

7. 取得したデータを元にページ遷移・最適化

取得したデータを元に、初回起動時に任意のページへ遷移させたり、表示の最適化を行います。
遷移の処理は、Circuitディープリンクサポーターの機能を利用するか、独自実装の遷移処理で行います。

クイックスタート(iOS)

まずCircuit Directトップページにアクセスし、アプリグループの作成をクリックします。

アプリグループの作成

まずアプリグループを作成します。

アプリグループとは例えば、あるECサイトにiPhoneアプリ・Androidアプリがある場合、iPhoneアプリとAndroidアプリのセットのことを指します。(一つしか登録しない場合も便宜上グループと呼びます)

今回はiPhoneユーザー向けのサービスとしてアプリグループを設定します。

グループ名に "Sample EC"

「リンクを作成するアプリを選択します」 でiPhoneアプリにチェックを入れ、次へをクリックします。

iPadアプリやAndroidアプリはあとで追加することができます。

iPhoneアプリ設定

次に、iPhoneアプリの初期設定を行います。

iPhoneアプリ名に "SampleEC"、iTunesStoreURLにアプリのiTunesStoreURLを入力します。

まだストアに公開されていないアプリの場合は、仮に"https://itunes.apple.com/" まで入力し、アプリ公開時に修正してください。

このURLを元に、アプリがインストールされていないユーザーをストアに遷移させます。

最後に、ユーザーのマッチング方式を指定します。 今回はFingerPrinting方式を選択します。

以上でアプリグループの作成が完了し、リンク作成画面に遷移します。

SDK設定・テスト

SDKの設定 - CocoaPodsでインストール

1. CocoaPodsをインストールする

CocoaPodsがインストールされていない場合は、まずCocoaPodsをインストールしてください。

sudo gem install cocoapods

2. PodfileにCircuitを追加

Podfileに下記を追記してください。

Podfile
pod "Circuit"

pod installを実行

pod install

SDKの設定 - 手動でインストール

こちらのリンクからCircuit SDKをダウンロード

フレームワークの追加

iOS標準のフレームワークであるAdSupport.frameworkを追加します。

コードの埋め込み(Objective-C)

iPhoneアプリのみ、iPadアプリのみ、iPhoneアプリとiPadアプリが別アプリの場合

AppDelegate.mに以下の赤字部分のコードを追加します。

Universalアプリ以外の場合のAppDelegate.m
#import <CircuitDeepLinking/CircuitDeepLink.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
/****************************************************
- 開発時のみ以下を記述し開発モードをONにします。
- 開発モードがONの状態のときには
* xcodeのログ出力画面にエラーの内容などが出力されるようになります
- 申請の際には以下の記述はコメントアウトするか削除してください。
*****************************************************/
[[CircuitDeepLink sharedInstance] setDevelopmentMode:YES];
/****************************************************


/****************************************************
- インストール後の初回起動時にCircuitサーバーと通信し、インストール前の各種情報を取得するために必要な処理となります。
- 以下の処理は初回起動時のみ動きます。NSUserDefaultへ初回起動なのかどうかの状態を保存します。アプリを削除すると初回判定の情報も消えます。
*****************************************************/
[CircuitDirect setAppId:@"[CircuitDirectの管理画面より発行されたアプリケーションID]" callback:^(NSError *error) {
if ( error ) {
NSLog(@"error: %@", error);
}
}];
/*** 以下省略 ***/
}

Universalアプリの場合

AppDelegate.mに以下の赤字部分のコードを追加します。

UniversalアプリのAppDelegate.m
#import <CircuitDeepLinking/CircuitDeepLink.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
/****************************************************
- 開発時のみ以下を記述し開発モードをONにします。
- 開発モードがONの状態のときには
* xcodeのログ出力画面にエラーの内容などが出力されるようになります
- 申請の際には以下の記述はコメントアウトするか削除してください。
*****************************************************/
[[CircuitDeepLink sharedInstance] setDevelopmentMode:YES];
/****************************************************


/****************************************************
- インストール後の初回起動時にCircuitサーバーと通信し、インストール前の各種情報を取得するために必要な処理となります。
- 以下の処理は初回起動時のみ動きます。NSUserDefaultへ初回起動なのかどうかの状態を保存します。アプリを削除すると初回判定の情報も消えます。
*****************************************************/
BOOL isIpad = [[[UIDevice currentDevice] model] hasPrefix:@"iPad"];
NSString *circuitDirectAppId = isIpad ? @"[CircuitDirectの管理画面より発行されたiPadのアプリケーションID]" : @"[CircuitDirectの管理画面より発行されたiPhoneのアプリケーションID]";
[CircuitDirect setAppId:circuitDirectAppId callback:^(NSError *error) {
if ( error ) {
NSLog(@"error: %@", error);
}
}];
/*** 以下省略 ***/
}

Circuitディープリンクサポーターとの連携

Circuitディープリンクサポーターと連携してディープリンクで遷移する場合は以下のコードを追加する

CircuitDeepLink機能の設定ファイルを読み込みます。設定ファイルの読み込みが完了した後に引数で指定したcallbackが呼ばれます。

Circuitのサーバーが正常に動作していない、または通信が正常に完了しなかった場合にはerrorに値が入ります。

AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
*****************************************************/
[[CircuitDeepLink sharedInstance] setAppId:@"[CircuitDeeplinkSupporterの管理画面より発行されたアプリケーションID]" callback:^(NSError *error) {
if ( error ) {
NSLog(@"Error: %@", error);
} else {
}
}];
}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
/****************************************************
- アプリがurlスキーム経由で起動された際に、CircuitDeeplinkの機能を呼び出すために必要となります。
*****************************************************/
[[CircuitDeepLink sharedInstance] routeUsingUrl:url];
/*** 以下省略 ***/
}

コードの埋め込み(Swift)

1. Bridging-Header.hを作成する

プロジェクト名-Bridging-Header.hという名前のheaderファイルを作成してください。

2. Bridging-Header.hを編集する

Bridging-Header.hに以下のコードを追加

Bridging-Header.h
#import <CircuitDeepLinking/CircuitDeepLink.h>

3. Bridging-Header.hを読み込む

[Build Settings] > [Objective-C Bridging Header]プロジェクト名-Bridging-Header.hを指定する

4. AppDelegateにSDK読み込み用コードを追加する

iPhoneアプリのみ、iPadアプリのみ、iPhoneアプリとiPadアプリが別アプリの場合

AppDelegate.swiftに以下の赤字部分のコードを追加します。

AppDelegate.swift
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
/****************************************************
- 開発時のみ以下を記述し開発モードをONにします。
- 開発モードがONの状態のときには
* xcodeのログ出力画面にエラーの内容などが出力されるようになります
- 申請の際には以下の記述はコメントアウトするか削除してください。
*****************************************************/
CircuitDeepLink.sharedInstance().setDevelopmentMode(true)
/****************************************************
- インストール後の初回起動時にCircuitサーバーと通信し、インストール前の各種情報を取得するために必要な処理となります。
- 以下の処理は初回のみ動きます。NSUserDefaultへ初回なのかどうかの状態を保存します。アプリを削除すると初回判定の情報も消えます。
*****************************************************/
CircuitDirect.setAppId("[CircuitDirectの管理画面より発行されたアプリケーションID]", callback: { (_error:NSError!) -> Void in
if let error = _error {
print("error: \(error)")
/*** 以下省略 ***/
}

Universalアプリの場合

AppDelegate.swiftに以下の赤字部分のコードを追加します。

UniversalアプリのAppDelegate.swift
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
/****************************************************
- 開発時のみ以下を記述し開発モードをONにします。
- 開発モードがONの状態のときには
* xcodeのログ出力画面にエラーの内容などが出力されるようになります
- 申請の際には以下の記述はコメントアウトするか削除してください。
*****************************************************/
CircuitDeepLink.sharedInstance().setDevelopmentMode(true)
/****************************************************
- インストール後の初回起動時にCircuitサーバーと通信し、インストール前の各種情報を取得するために必要な処理となります。
- 以下の処理は初回のみ動きます。NSUserDefaultへ初回なのかどうかの状態を保存します。アプリを削除すると初回判定の情報も消えます。
*****************************************************/
let isIpad = UIDevice.currentDevice().model.hasPrefix("iPad")
let circuitDirectAppId = isIpad ? "[CircuitDirectの管理画面より発行されたiPadアプリのアプリケーションID]" : "[CircuitDirectの管理画面より発行されたiPhoneのアプリのアプリケーションID]"
CircuitDirect.setAppId(circuitDirectAppId, callback: { (error:NSError!) -> Void in
if error != nil {
println(error)
}
})
/*** 以下省略 ***/
}

Circuitディープリンクサポーターとの連携

Circuitディープリンクサポーターと連携してディープリンクで遷移する場合は以下のコードを追加する

CircuitDeepLink機能の設定ファイルを読み込みます。設定ファイルの読み込みが完了した後に引数で指定したcallbackが呼ばれます。

Circuitのサーバーが正常に動作していない、または通信が正常に完了しなかった場合にはerrorに値が入ります。

AppDelegate.swift
*****************************************************/
CircuitDeepLink.sharedInstance().setAppId("[CircuitDeeplinkSupporterの管理画面より発行されたアプリケーションID]", callback: { (_error:NSError!) -> Void in
if let error = _error {
print("error: \(error)")
}
})
/****************************************************
func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool {
/****************************************************
- アプリがurlスキーム経由で起動された際に、CircuitDeeplinkの機能を呼び出すために必要となります。
*****************************************************/
  CircuitDeepLink.sharedInstance().routeUsingUrl(url);
/*** 以下省略 ***/
}

ビルド

以上のコードの埋め込みが完了したらビルドします。

動作確認・テスト

デベロッパー側での動作確認方法(事前準備)

管理画面より発行された計測用のURLをiosシミュレーターのSafariのロケーションバーに貼り付けてアクセスします。

  1. デスクトップ側のブラウザでURLをコピー
  2. iosシミュレーターのSafariのロケーションバーにフォーカスした状態でCtrl+Vを押す
  3. ロケーションバーの上をタップするとでてくるメニューの中からペーストを選択する

この手順を踏まえると楽にコピー&ペーストすることができます。

計測用のurlへのアクセスが完了するとCircuitDirect側のサーバーに状態が保存されます。

マッチング方式別確認手順(事前準備完了後)

下の手順は事前準備を終えた状態ではじめてください。

※ テストする際にはiosシミュレーター上にテストする対象のアプリがない状態で行ってください。

※ [[CircuitDeepLink sharedInstance] setDevelopmentMode:YES]; を記述してログが出力されるようにしてください。

FingerPringting方式でのテスト・確認方法

アプリを立ち上げた後にCircuitDirect側とユーザーマッチングの為に通信を行います。正常にユーザーの情報のマッチングが行われると

  • ログの出力が有効な場合はxcodeのログ画面にユーザー情報が出力されます。
  • deeplinkが設定されている場合は自動でdeeplinkを開きます。
  • deeplinkを設定せずに任意のタイミングでviewControllerの遷移を行いたい場合は、任意のviewController上で以下のコードを実行

Objective-Cの場合

任意のViewController
CircuitDirectResponseModel *model = [CircuitDirect getCircuitDirectResponseModel];
if ( model && !model.hasError ) {
// 正常にデータを取得できた場合の処理を記述します
} else {
// データが取得できなかった場合の処理を記述します
}

Swiftの場合

任意のViewController
let model = CircuitDirect.getCircuitDirectResponseModel()if model != nil && !model.hasError { // 正常にデータを取得できた場合の処理を記述します} else { // データが取得できなかった場合の処理を記述します}

このコードを実行し、modelの中身を見て遷移させてください。

AppDelegateに記載したsetAppIdのcallbackが呼ばれます。エラーがあり正常に取得できなかった際には NSError *errorに値が入ります。

以上の確認が完了したらFingerPrinting方式のテストは完了です。

ディープリンクで画面遷移しない場合のパラメータの取得の仕方

任意のViewControllerで以下のコードを実行するとCircuitDirect用のパラメーターを取得することができます。

Objective-Cの場合

任意のViewController
CircuitDirectResponseModel *model = [CircuitDirect getCircuitDirectResponseModel];
if ( model && !model.hasError ) {
// 正常にデータを取得できた場合の処理を記述します
} else {
// データが取得できなかった場合の処理を記述します
}

Swiftの場合

任意のViewController
let model = CircuitDirect.getCircuitDirectResponseModel()if model != nil && !model.hasError { // 正常にデータを取得できた場合の処理を記述します} else { // データが取得できなかった場合の処理を記述します}

以上の確認が完了したらFingerPrinting方式のテストは完了です。

クイックスタート(Android)

まずCircuit Directトップページにアクセスし、アプリグループの作成をクリックします。

アプリグループの作成

まずアプリグループを作成します。

アプリグループとは例えば、あるECサイトにiPhoneアプリ(ユニバーサルアプリ)・Androidアプリがある場合、iPhoneアプリとAndroidアプリのセットのことを指します。(一つしか登録しない場合も便宜上グループと呼びます)

今回はAndroidユーザー向けのサービスとしてアプリグループを設定します。

グループ名に "Sample EC"

「リンクを作成するアプリを選択します」 でAndroidアプリにチェックを入れ、次へをクリックします。

iPhoneアプリやiPadアプリはあとで追加することができます。

Androidアプリ設定

次に、Androidアプリの初期設定を行います。

Androidアプリ名に "SampleEC"、Google Play URLにアプリのGoogle Play URLを入力します。

このURLを元に、アプリがインストールされていないユーザーをストアに遷移させます。

※まだストアに公開されていないアプリの場合はhttps://play.google.com/store/apps/details?id=アプリのパッケージ名と入力してください。 テストの際、パッケージ名を入力しないと正しいテストを行うことができません。

最後に、ユーザーのマッチング方式を指定します。 今回はFingerPrinting方式を選択します。

以上でアプリグループの作成が完了し、リンク作成画面に遷移します。

SDK設定・テスト

SDKの設定 - Android Studioでインストール

1. gradleの設定

app/build.gradleにてCircuitのバージョン1.2.0以降を追加。

build.gradle
repositories {
maven {
url "http://products.cir.io/sdk/android/cds"
}
}

dependencies {
compile 'io.cir:Circuit:1.2.0'
}

2. AndroidManifest.xmlの設定

AndroidManifest.xmlに下記を追記してください。

AndroidManifest.xml
<manifest ...>
<!-- CircuitDeepLinkSupporterとの共通箇所 -->
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!-- CircuitDeepLinkSupporterとの共通箇所ここまで -->
<application ...>
...
<!-- CircuitDeepLinkSupporterとの共通箇所 -->
<activity
android:name="io.cir.DeepLinkSupporterActivity"
android:theme="@android:style/Theme.NoDisplay"
android:noHistory="true">
<intent-filter>
<data android:scheme="アプリのURLスキーム"/>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
</activity>
<meta-data android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version"/>
<!-- CircuitDeepLinkSupporterとの共通箇所ここまで -->

<!-- CircuitDirectの設定 -->
<receiver
android:name="io.cir.CircuitDirectReceiver"
android:exported="true">
<intent-filter>
<action android:name="com.android.vending.INSTALL_REFERRER"/>
</intent-filter>
</receiver>
<!-- CircuitDirectの設定ここまで -->
</application>
...
</manifest>

3. Activityでの設定

最初に起動するアクティビティのonCreateとonPauseからCircuitDirectのメソッドを呼び出してください。また、適宜importを記述してください。

最初に起動するアクティビティ
import io.cir.CircuitDirect;
import io.cir.CircuitDirectException;
import io.cir.DirectInfo;
...
@Override
protected void onCreate(Bundle savedInstanceState) {
...
// ここからCircuit
CircuitDirect.getDirectInfo(this, new CircuitDirect.GetLinkListener() {
@Override
public void onSuccess(DirectInfo directInfo) {
// ここにディープリンク実行処理を記述します。
}
@Override
public void onError(CircuitDirectException e) {
Toast.makeText(MainActivity.this, "Failed to get direct info", Toast.LENGTH_SHORT).show();
}
});
// ここまでCircuit
}
...
@Override
protected void onPause() {
super.onPause();
// ここからCircuit
CircuitDirect.onPause(this);
// ここまでCircuit
}

onSuccess時に取得できるdirectInfoオブジェクトがディープリンク情報の実体となります。

これを用いて任意のタイミングでディープリンクへ遷移してください。

Circuitディープリンクサポーター併用の場合

CircuitDeeplinkSupporterと併用されている場合は、下記のようにディープリンク実行することができます。

public void onSuccess(DirectInfo directInfo) {
CircuitDirect.handleDeepLink(MainActivity.this, directInfo);
}

独自実装でディープリンク遷移する場合

ディープリンク処理を独自実装されている場合や他のサードパーティツールで実装されている場合、DirectInfoのメソッドを呼び出し必要なパラメータを取得してください。

また、ディープリンク起動を実行する前にCircuitDirect.done(context)を実行してください。CircuitDirect.done()を呼び出さない場合、CircuitDirect.getDirectInfo()を呼び出すとディープリンク取得処理を再度実行させることも可能です。

public void onSuccess(DirectInfo directInfo) {
directInfo.getDeferredDeepLink().toString(); //ディープリンクURLが取得できます。
CircuitDirect.done(getApplicationContext());
}

ディープリンク起動を任意のタイミングで呼び出したい場合

ディープリンク起動をアプリ初回起動直後ではなく、ユーザログイン後やチュートリアル後など任意のタイミングで呼び出したい場合、DirectInfoオブジェクトをメンバ変数として保持し、任意のタイミングでディープリンク起動を実行してください。

また、DirectInfoオブジェクトはParcelableを実装しているので、次のようにIntentやBundleにそのままセットすることができます。

// 次のActivityに渡す例
Intent it = new Intent(this, TutorialActivity.class);
it.putExtra("directInfo", mDirectInfo);
startActivity(it);

// FragmentのArgumentとする例
TutorialFragment fragment = new TutorialFragment();

Bundle args = new Bundle();
args.putParcelable("directInfo", mDirectInfo);
fragment.setArguments(args);

なお、CircuitDirect.getDirectInfoはバックグラウンドで実行されます。そのためDirectInfoをメンバ変数として保持する場合はDirectInfoの取得タイミングにご注意ください。

その他の機能

DirectInfoからいくつかの設定情報が渡すことができます。

directInfo.getDirectLinkQueryStrings(): リダイレクタへのクエリをJSONObject型で取得できます。例えば「https://dr.cir.io/ur/?item_id=10&user_id=100」というURLからリダイレクタを開きアプリをインストールすると、{"item_id":10, "user_id":100}が本メソッドから取得できます。

directInfo.getDirectLinkName(): ダイレクトリンクに設定した名前をString型で取得できます。

directInfo.getLabels(): ダイレクトルールに設定したラベルをJSONArray型で取得できます。

Eclipseでのインストール方法

まず、New -> Android Application Projectで新規プロジェクトを作成します。

この時、Minimum Required SDKはAPI Level 10以上にしてください。DeepLinkSupporter SDKはAPI Level 10以上でのみ動作します。

プロジェクトを作成すると、appcompat_v7というプロジェクトも同時に作成されます。 お使いのEclipseプラグインのバージョンによってはエラーになっているので、このエラーを解決します。

appcompat_v7プロジェクトのプロパティを開きます。

左側のAndroidセクションを選び、Project Build TargetをAndroid 5.0.x以上にします。 これは、appcompat_v7プロジェクトがAndroid 5.0以上の設定を保持しているためです。

Project Build Targetを変更したら、一度appcompat_v7プロジェクトをcleanし、再ビルドします。 これでappcompat_v7プロジェクトのエラーが解消されます。

次に、アプリプロジェクトのプロパティを開きます。左側のAndroidセクションを選び、LibraryのAdd...をクリックします。 そして先ほどエラーを解消したappcompat_v7を選びます。DeepLinkSupporter SDKはappcompat_v7ライブラリを使用します。

次に、Google Play Servicesライブラリプロジェクトをimportします。

importを選んだら、AndroidセクションのExisting Android Code Into Workspaceを選びます。

Root Directoryの選択で、$ANDROID_HOME/extras/google/google_play_services/libproject/google-play-services_lib/ を選びます。

この後、Copy projects into workspaceにチェックをつけてFinishを選びます。

Google Play Servicesライブラリプロジェクトのimportが完了したら、アプリプロジェクトのプロパティを開き、 Google Play Servicesライブラリプロジェクトを追加します。これは、先ほどのappcompat_v7プロジェクトの追加と同じ手順です。

最新版のSDKファイルをこちらからダウンロードして、解凍します。

アプリプロジェクトのlibsフォルダに.jarファイルをコピーします。

AndroidManifest.xmlの設定などは、Android Studioと同様です。

ビルド

ビルドを行います。正常にビルドが完了していることを確認したら、動作確認を行います。

動作確認・テスト

1. ログ出力設定の追加

Applicationファイルに、デバッグ用のログ出力設定を記述します。

Applicationファイル
import io.cir.DeepLinkSupporterActivity; // この行を追加してください


public class YourAppsApplication extends Application {
@Override
public void onCreate() {
DeepLinkSupporterActivity.setLogEnabled(true); // この行を追加してください
}
...
}

2. アプリのビルド

SDKを導入しディープリンク機能を実装したアプリをビルドしてください。

3. Android端末へのアプリのadbインストール

アプリをビルドすると、プロジェクトルートからapp/build/outputs/apk内にapp-debug.apkというデバッグ用apkファイルが生成されます。

android-sdkのplatform-toolsのadbを用い、コンソールから下記のようなコマンドでapkファイルをAndroid実機にインストールしてください。

adb install app-debug.apk

※そのアプリがAndroid端末にインストールされていない状態からインストールしてください。

4. ダイレクトリンクの発行

ディープリンクが起動するように設定したダイレクトリンクを発行します。

5. リダイレクタのからのadbコマンド発行

PC上でダイレクトリンクにcdr_android_referrer_test_mode=trueというパラメータを付与し、PC上で開いてください。

例:https://dr.cir.io/ur/?cdr_android_referrer_test_mode=true

すると、下記のようなadbコマンドが表示されます。

adb shell am broadcast -a com.android.vending.INSTALL_REFERRER -n /io.cir.CircuitDirectReceiver --es referrer 

6. adbコマンドの実行

5で表示されたadbコマンドをコピーし、Android端末が接続されたPCでコンソールから実行します。

実行した際にlogcatに下記のようなログが出力されることをご確認ください。

D/DeepLinkSupporter﹕ CircuitDirectReceiver was called! Referrer = 

7. アプリの起動

アプリを初回起動してください。CircuitDirectの呼び出しに成功すると、下記のようなログがlogcatに出力されます。

D/DeepLinkSupporter﹕ Succeeded to get response from CircuitAPI. Response json = {"deferred_type":null,"direct_link_name":<管理画面で設定したダイレクトリンク名>,"deferred_deeplink":<管理画面で設定したディープリンクURL>,"token":<ダイレクトリンクの固有token>,"status":"success","direct_link_query_strings":<リダイレクタに付与したクエリ>,"labels":<管理画面で設定したラベル>}

ディープリンクが想定通りに実行されることをご確認ください。

また、ディープリンクの実行後に下記のログがlogcatに出力されていることをご確認ください。

D/DeepLinkSupporter﹕ Done a CircuitDirect.

これはCircuitDirect.handleDeepLink()メソッドおよびCircuitDirect.done()メソッドが呼ばれた時に出力されるログです。

これらが呼ばれていない場合、アプリの再起動時に再びディープリンクが実行されます。

8. アプリの再起動

アプリを一旦閉じて、「設定」>「その他」>「アプリケーション管理」からそのアプリの設定を開き、「強制終了」を実行してください。

その後アプリを再起動し、その際にはディープリンクが起動されないことをご確認ください。

動作確認は以上となります。

1で追加したログ出力用コードは削除いただいて構いません。

ルール設定とは

ルール設定とはアプリ初回起動時のディープリンク設定や、個別に引き継ぎたいデータを設定できます。

SDKが取得するデータのdeferred_deeplink(初回起動時に遷移するディープリンク)、deferred_type(ディープリンクの遷移タイミング設定)、labels(特定の条件に付加するラベル)を設定できます。

SDKが取得するデータ
{
"token": "xxxxxxx",
"direct_link_name": "商品詳細ページ",
"deferred_deeplink": "ecapp://item/123",
"deferred_type": "immediately",
"labels": ['male'],
"direct_link_query_strings": {
"item_id": 123
}
}

ルールとは

ルールはある条件を指定して、それに対してディープリンクとラベルを設定します。

ルールは複数設定することができます。

例えばあるルールAでは取得したdirect_link_query_stringsのパラメータ、campaign_idの値が1だった場合はdeeplinkAに遷移する。

ルールBではパラメータのcampaign_idの値が2だった場合はdeeplinkBに遷移するといったことが可能です。

ルールの追加

ルールの追加はダイレクトリンク設定の各アプリの設定のルール設定部分に表示されている「ルールを追加」ボタンを押すと新しいルールが追加されます。

条件とは

条件はパラメータに対して、マッチ判定を行いすべての条件を満たした場合のみルールを有効化します。

条件は任意設定で、条件を一つも指定しなかった場合は無条件で指定したディープリンク情報をSDKから取得できます。

パラメータに対して選べる条件は以下の通りです。

  • 選択したパラメータが存在する
  • 選択したパラメータが存在しない
  • 選択したパラメータが次のテキストを含む
  • 選択したパラメータが次のテキストを含まない
  • 選択したパラメータが次のテキストと完全一致する
  • 選択したパラメータが次の数値以上
  • 選択したパラメータが次の数値より大きい
  • 選択したパラメータが次の数値以下
  • 選択したパラメータが次の数値より小さい
  • 選択したパラメータが次の数値と等しい
  • 選択したパラメータが次の数値と等しくない
  • 選択したパラメータが次の正規表現にマッチする
  • 選択したパラメータが次の正規表現にマッチしない

条件の追加

条件の追加は、ルール内の上部に表示されている「条件を追加(任意)」を押します。

条件はパラメータを基準に設定するため、条件に使用するパラメータはダイレクトリンク設定の上部にある「パラメータ設定(任意)」から追加する必要があります。

初回起動時のディープリンクの遷移タイミング設定

初回起動時に、ディープリンク設定をしていた場合(deferred_deeplinkが存在する場合)、デフォルトではアプリ起動直後に設定されているディープリンクに遷移の処理を行います。

もし、アプリ起動直後ではなく任意のタイミング(チュートリアル後、ログイン後等)で設定したディープリンクに遷移した場合はルール内の「初回起動時のディープリンクの遷移タイミング設定」で、遷移するタイミングを任意に指定するを選択してください。

ラベル名とは

ラベル名とは、設定した条件に対してディープリンク設定とは別にアプリへデータを渡したい場合に便利な設定です。

例えば、ダイレクトリンクにアクセスする際に性別やユーザー属性のパラメータを付加しておき、アプリ側でユーザーの属性に合わせて表示の最適化を行う。 といった際に活用できます。

他にもアナリティクスなどのデータ解析等にも活用できます。