インストールリファラでハマった話
DESCRIPTION
potatotips #6 で発表した内容。TRANSCRIPT
![Page 1: インストールリファラでハマった話](https://reader036.vdocuments.pub/reader036/viewer/2022081512/5561528fd8b42a857d8b5030/html5/thumbnails/1.jpg)
インストールリファラで ハマった話
2014/4/9 @sakebook
http://sakebook.blogspot.com https://github.com/sakebook
![Page 2: インストールリファラでハマった話](https://reader036.vdocuments.pub/reader036/viewer/2022081512/5561528fd8b42a857d8b5030/html5/thumbnails/2.jpg)
開発環境でテスト
![Page 3: インストールリファラでハマった話](https://reader036.vdocuments.pub/reader036/viewer/2022081512/5561528fd8b42a857d8b5030/html5/thumbnails/3.jpg)
adb shell am broadcast -a com.android.vending.INSTALL_REFERRER -n PKG_NAME/.MyBroadcastReceiver —es referrer utm_campaign%3Dsample_campaign
![Page 4: インストールリファラでハマった話](https://reader036.vdocuments.pub/reader036/viewer/2022081512/5561528fd8b42a857d8b5030/html5/thumbnails/4.jpg)
テストをパスしたため本番公開
![Page 5: インストールリファラでハマった話](https://reader036.vdocuments.pub/reader036/viewer/2022081512/5561528fd8b42a857d8b5030/html5/thumbnails/5.jpg)
本番で不具合
![Page 6: インストールリファラでハマった話](https://reader036.vdocuments.pub/reader036/viewer/2022081512/5561528fd8b42a857d8b5030/html5/thumbnails/6.jpg)
\(^o^)/
![Page 7: インストールリファラでハマった話](https://reader036.vdocuments.pub/reader036/viewer/2022081512/5561528fd8b42a857d8b5030/html5/thumbnails/7.jpg)
開発環境では再現しないが 本番環境では再現する
![Page 8: インストールリファラでハマった話](https://reader036.vdocuments.pub/reader036/viewer/2022081512/5561528fd8b42a857d8b5030/html5/thumbnails/8.jpg)
α/β版テスト機能
![Page 9: インストールリファラでハマった話](https://reader036.vdocuments.pub/reader036/viewer/2022081512/5561528fd8b42a857d8b5030/html5/thumbnails/9.jpg)
既存ユーザに影響を与える事 無く本番環境でテストができる※バージョンはapkアップロードの度上昇し、戻せない
![Page 10: インストールリファラでハマった話](https://reader036.vdocuments.pub/reader036/viewer/2022081512/5561528fd8b42a857d8b5030/html5/thumbnails/10.jpg)
ここから本題
![Page 11: インストールリファラでハマった話](https://reader036.vdocuments.pub/reader036/viewer/2022081512/5561528fd8b42a857d8b5030/html5/thumbnails/11.jpg)
開発環境と本番環境では 何が違ったのか?
![Page 12: インストールリファラでハマった話](https://reader036.vdocuments.pub/reader036/viewer/2022081512/5561528fd8b42a857d8b5030/html5/thumbnails/12.jpg)
ActivityとBroadcastは 別スレッドで走る
![Page 13: インストールリファラでハマった話](https://reader036.vdocuments.pub/reader036/viewer/2022081512/5561528fd8b42a857d8b5030/html5/thumbnails/13.jpg)
Broadcastが先行するとは限らない!
adbを用いるため 必ずBroadcastが先行!
• $ adb ~
• BroadcastReceiver#onReceive
• アプリ起動
• Activity#onCreate
• アプリ起動
• Activity#onCreate
• ↕️
• BroadcastReceiver#onReceive
開発環境 本番環境
![Page 14: インストールリファラでハマった話](https://reader036.vdocuments.pub/reader036/viewer/2022081512/5561528fd8b42a857d8b5030/html5/thumbnails/14.jpg)
Activityの状態を監視しよう (オブザーバー)
ActivityがBroadcastからの通知を受け取る準備が できてない状態で通知をしようとするため
通知に失敗する。 !
Activityが自分のタイミングで 通知を受け取るようにする。
![Page 15: インストールリファラでハマった話](https://reader036.vdocuments.pub/reader036/viewer/2022081512/5561528fd8b42a857d8b5030/html5/thumbnails/15.jpg)
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: インストールリファラでハマった話](https://reader036.vdocuments.pub/reader036/viewer/2022081512/5561528fd8b42a857d8b5030/html5/thumbnails/16.jpg)
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: インストールリファラでハマった話](https://reader036.vdocuments.pub/reader036/viewer/2022081512/5561528fd8b42a857d8b5030/html5/thumbnails/17.jpg)
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: インストールリファラでハマった話](https://reader036.vdocuments.pub/reader036/viewer/2022081512/5561528fd8b42a857d8b5030/html5/thumbnails/18.jpg)
まとめ
・本番でしか再現できないときはα/β版で試そう ・ActivityとBroadcastは別スレッドで 動くので制御が必要 !
![Page 19: インストールリファラでハマった話](https://reader036.vdocuments.pub/reader036/viewer/2022081512/5561528fd8b42a857d8b5030/html5/thumbnails/19.jpg)
以上
サンプルコード https://github.com/sakebook/android-sample-referrertest