Chrome to Phone (2)

昨日のエントリで誤りがあった。

C2DMessaging push = C2DMessaging.get(getServletContext());

〜
boolean res = push.sendNoRetry(deviceInfo.getDeviceRegistrationID(),
        collapseKey,
        "url", url,
        "title", title,
        "sel", sel,
        "debug", deviceInfo.getDebug() ? "1" : null);

やはり(というか当たり前だが)C2DM(Cloud to Device Messaging)を使っているのだということが解る。

これは、正しくは「通信デバイスがChromeではない場合、C2DM(Cloud to Device Messaging)を使っている」だ。

private boolean doSendToDevice(String url, String title, String sel, String userAccount,
        String deviceName, String deviceType, HttpServletResponse resp) throws IOException {
        :
        if (deviceInfo.getType().equals(DeviceInfo.TYPE_CHROME)) {
            res = doSendViaBrowserChannel(url, deviceInfo);
        } else {
            res = doSendViaC2dm(url, title, sel, push, collapseKey, deviceInfo);
        }
        :
}
:
:
boolean doSendViaC2dm(String url, String title, String sel, C2DMessaging push,
        String collapseKey, DeviceInfo deviceInfo) throws IOException {
:
:
    boolean res;
    res = push.sendNoRetry(deviceInfo.getDeviceRegistrationID(),
            collapseKey,
            "url", url,
            "title", title,
            "sel", sel,
            "debug", deviceInfo.getDebug() ? "1" : null);
    return res;
}
:
:
boolean doSendViaBrowserChannel(String url, DeviceInfo deviceInfo) {
    String channelToken = deviceInfo.getDeviceRegistrationID();
    ChannelServiceFactory.getChannelService().sendMessage(
            new ChannelMessage(channelToken, url));
    return true;
}
:

コードを見れば解るが、通信デバイスがChromeの場合はGoogle App Engine独自のChannel APIでプッシュ、非ChromeつまりAndroidの場合はC2DMと使い分けているのだ。

Channel APIは最近App Engineで使えるようになった(最近この辺が疎いので勉強しなくちゃ)チャネル型の双方向非同期通信サービス用API。技術的にはComet※を使用しており、これによりサーバ側からのプッシュを実現している。

やはりAndroidを知るにはAndroidだけでは駄目で、サービス側(サーバ側)の仕組みも併せて理解することが重要。

Chromeに関して話はよく聞くのに実際には未だに姿が見えないデバイスだが、このように実装されているとなにやら実感が沸く。Channel APIHTML5のWebSocketとして実装されるらしい。むべなるかな。

情報処理試験の疑似アセンブラでは無い