インストールリファラでハマった話

19
インストールリファラで ハマった話 2014/4/9 @sakebook http://sakebook.blogspot.com https://github.com/sakebook

Upload: shinya-sakemoto

Post on 24-May-2015

949 views

Category:

Engineering


8 download

DESCRIPTION

potatotips #6 で発表した内容。

TRANSCRIPT

Page 1: インストールリファラでハマった話

インストールリファラで ハマった話

2014/4/9 @sakebook

http://sakebook.blogspot.com https://github.com/sakebook

Page 2: インストールリファラでハマった話

開発環境でテスト

Page 3: インストールリファラでハマった話

adb shell am broadcast -a com.android.vending.INSTALL_REFERRER -n PKG_NAME/.MyBroadcastReceiver —es referrer utm_campaign%3Dsample_campaign

Page 4: インストールリファラでハマった話

テストをパスしたため本番公開

Page 5: インストールリファラでハマった話

本番で不具合

Page 6: インストールリファラでハマった話

\(^o^)/

Page 7: インストールリファラでハマった話

開発環境では再現しないが 本番環境では再現する

Page 8: インストールリファラでハマった話

α/β版テスト機能

Page 9: インストールリファラでハマった話

既存ユーザに影響を与える事 無く本番環境でテストができる※バージョンはapkアップロードの度上昇し、戻せない

Page 10: インストールリファラでハマった話

ここから本題

Page 11: インストールリファラでハマった話

開発環境と本番環境では 何が違ったのか?

Page 12: インストールリファラでハマった話

ActivityとBroadcastは 別スレッドで走る

Page 13: インストールリファラでハマった話

Broadcastが先行するとは限らない!

adbを用いるため 必ずBroadcastが先行!

• $ adb ~

• BroadcastReceiver#onReceive

• アプリ起動

• Activity#onCreate

• アプリ起動

• Activity#onCreate

• ↕️

• BroadcastReceiver#onReceive

開発環境 本番環境

Page 14: インストールリファラでハマった話

Activityの状態を監視しよう (オブザーバー)

ActivityがBroadcastからの通知を受け取る準備が できてない状態で通知をしようとするため

通知に失敗する。 !

Activityが自分のタイミングで 通知を受け取るようにする。

Page 15: インストールリファラでハマった話

public class GooglePlayReceiver extends BroadcastReceiver{! @Override public void onReceive(Context context, Intent intent) { ….! if (!TextUtils.isEmpty(campaign)) { SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); preferences.edit().putString("referrer", campaign).commit();! MyObserver.getInstance().notifyObserver(); } }}

Broadcast

Page 16: インストールリファラでハマった話

public class MyObserver{ private static MyObserver ourInstance = new MyObserver(); private static List<ReceiveObserver> mObservers = new CopyOnWriteArrayList<ReceiveObserver>(); …. public void notifyObserver() { /* 登録されている全監視対象に変更を通知 */ for (int i=0; i<mObservers.size(); i++) { mObservers.get(i).onReceived(); } } ….}

Observer

Page 17: インストールリファラでハマった話

public class MainActivity extends ActionBarActivity implements ReceiveObserver{! @Override protected void onCreate(Bundle savedInstanceState) { … /* 呼ばれても良い状態になったら監視対象にする */ MyObserver.getInstance().addObserver(this); doSomeThing(); }! @Override public void onReceived() { /* 監視対象から外す */ MyObserver.getInstance().removeObserver(this); doSomeThing(); }! private void doSomeThing() { /* 通常起動、及びReceiverスレッドより先行した場合はリファラがない。 */ if (TextUtils.isEmpty(referrer)) { return; } /* 本当にしたいこと */ }}

Activity

Page 18: インストールリファラでハマった話

まとめ

・本番でしか再現できないときはα/β版で試そう ・ActivityとBroadcastは別スレッドで 動くので制御が必要 !

Page 19: インストールリファラでハマった話

以上

サンプルコード https://github.com/sakebook/android-sample-referrertest