月別アーカイブ: 2014年11月

[Adobe Analytics] Mobile SDK 4.x でアプリ計測する際の小技

久々にスマホアプリをSiteCatalystで計測する方法について調べる機会がありました。

現在リリースされているアプリ計測ライブラリだと、昔のような

s.pageName = "top";
s.prop1 = "main";
s.eVar1 = "man";
s.events = "event1";
s.track();

みたいな実装をしないんですね。

Context Data and Adobe Mobile Analytics: Change is Good

で、代わりにContext Dataに入れた値をProcessing Rule (処理ルール)で変数に入れるという。

HashMap cdata = new HashMap<String, Object>();
cdata.put("my.section", "main");
cdata.put("my.gender", "man");
cdata.put("my.action", "login");
Analytics.trackState("top", cdata);

みたいに実装して、Processing RulesでContext Dataからそれぞれ任意の変数に値をコピーする、と。
この方がより直感的だ、と言われてるそうですが、昔ながらのSiteCatalystのインプリに慣れてるので、かえって心地悪い。
あと、Processing RuleだとビーコンをCharlesやBloodhoundで見て目視、という確認がやりづらい。

従来のs変数に直接値を入れるやり方がもう出来ないのか?という訳でもありませんでした。
Processing Rulesがサポートしていないproducts変数や、events変数のシリアライゼーションは”&&”を付けて直接値を代入するやり方です。

Products Variable – Android SDK 4.x for Marketing Cloud Solutions

cdata.put("&&products", "Category;Product;Quantity;Price");

見慣れたproducts変数の構文です。

Event Serialization – Android SDK 4.x for Marketing Cloud Solutions

cdata.put("&&events", "event1:12341234");

実際に使った事はないんですが、お馴染みのイベントシリアライゼーションの書き方です。

というわけでビーコンパラメータ名(変数名ではない)に、”&&”を付けることで、Context Dataではなく、通常のパラメータとして処理されるようです。
パラメータ名だとこうなります。

  • prop1 → c1
  • eVar1 → v1
HashMap cdata = new HashMap<String, Object>();
cdata.put("&&c1", "main");
cdata.put("&&v1", "man");
cdata.put("&&events", "event1");
Analytics.trackState("top", cdata);

pageNameはtrackStateの第一引数なので仕方ない。
で、ビーコンをログで見るとちゃんとパラメータに入ってますね。
log
&c. から &.c の間に入るとContext Data扱いになり、Context DataはProcessing Rulesで拾わない限りレポートには出てきません。
で、”&&パラメータ名”という書式でセットすれば、&c. ~ &.c の外につくので、Context Dataにならない。
そのため、Processing Rulesを使わなくても、直接値をセット出来る、という仕組みです。

この”&&パラメータ名”の仕組みを使って直接値をセットすれば、”D=”のDynamic Variablesも使えるので

cdata.put("&&c1", "foobar");
cdata.put("&&v1", "D=c1");

という書式でprop1の値をeVar1にコピーする、おなじみのインプリも可能です。

events変数に数値を入れるカウンタ型を使う時も

cdata.put("&&events", "event2=5");

この書き方で対応します。

Unicode Escape Sequence 変換ツール

昔PHPで書いたUnicode Escapeツールを載せてましたが、今度はJavaScriptで書いたので載せます。

Unicode Escape Sequence 変換ツール

日本語などのマルチバイト文字を\uXXXX形式にUnicodeエスケープします。

こういう風にエスケープ出来ます。

/* テスト */
var hoge = 'ほげ';
alert(hoge);

/* \u30c6\u30b9\u30c8 */
var hoge = '\u307b\u3052';
alert(hoge);

ASCIIコード127番以上の文字だけエスケープするので、空白や改行、半角記号などはエスケープしません。
Unicodeエスケープした文字列をアンエスケープして戻す事も出来ます。

Firefox32でしか動作確認してないので、addEventListenerに対応してない昔のIEでは動作しません。

ソースですが、Escapeを行う部分はこうなってます。

var escapeUnicode = function(str) {
    var code = '';
    var head = {1: '\\u000', 2: '\\u00', 3: '\\u0', 4: '\\u'};
    return str.replace(/[^\x00-\x7F]/g, function(c) {
        return head[(code = c.charCodeAt(0).toString(16)).length] + code;
    });
};

エスケープした時に、\uXXXXの4ケタになるように、頭に0を付けて詰めてます。
また、マルチバイト文字だけエスケープして、シングルバイトの記号はエスケープしないように、ASCIIコード127以下の文字は置き替えません。正規表現[^\x00-\x7F] の部分です。
16進数の7Fは、10進数の127なので、つまり0から127に該当しない場合だけ変換します。

つづいてUnesacpeを行う部分はこうです。

var unescapeUnicode = function(str) {
  return str.replace(/\\u([a-fA-F0-9]{4})/g, function(m0, m1) {
    return String.fromCharCode(parseInt(m1, 16));
  });
};

正規表現で\uXXXXを表すと\\u([a-fA-F0-9]{4})なので、このパターンに一致する部分を変換する、という仕組みです。

再開します

昔書いてましたが、またしてもただのメモを書き綴ります。
プログラミング、Linux、Web解析、デジタルマーケティングなどなど。
毎度不定期更新。