#むおおおお に「本番環境とテスト環境で接続先サーバが違うときどう管理してますか?」と聞かれました。
リリース時にいちいちソースやリソースを書き直すのは手間だしミスがあるといけないし、VCSでの管理的にビミョー…みたいな。
Windowsアプリを作ってる頃は、変わりうる設定は全部INIファイルから読み込めるようにしていました。
[server]
Host=hoge.tamac.jp
Port=80
のような.iniファイルを.exeと同じ名前で同じディレクトリに置いて ::GetPrivateProfileString() 的な(Win32 SDKを直で使ってたので)。
デフォルト値(本番環境用)はアプリ内に持っておいて、INIファイルがない時はその値を用います。
Androidでも同じ考え方で、外部ストレージから特定のファイルを読み込んで設定値を取得します。
例えばmicroSDのルートディレクトリに
パッケージ名.conf というファイルがあればそれを読み込んで通信先URLを取得。同ファイルが無ければアプリ内に持っている(本番環境用の)デフォルト値を用いる、みたいな。
これだと、複数の対向サーバがあるような状況(例えば開発サーバ(ローカルPCとか)、テストサーバ、ステージングサーバ、本番サーバ)でも、同一のバイナリで実行時に通信先を切り替えることができます。
SDK(adbやDDMS)がない環境でもmicroSDにアクセスできれば通信先を変更できるので、例えばクライアントにテストサーバを見てもらうような場合でも割とハードルが低くてすみます。
見ようによっては余計なデバッグ機能を残したままアプリをリリースする形になるのでクライアントやプロジェクトリーダーとネゴっておく必要はあると思いますが、何かの参考になれば(o'ヮ'o)
public class Configuration
{
/** 設定ファイル */
private static final String CONF_FILENAME = "CONF_FILENAME";
/** 接続URL設定 */
private static final String CONF_CONNECTION_URL = "CONNECTION_URL";
/** 接続URL設定 組み込み値 */
private static final String CONF_CONNECTION_URL_DEFAULT = "http://hoge.tamac.jp";
/** コンテキスト */
private final Context mContext;
/** 設定ファイル */
private final Properties mProperties = new Properties();
/**
* コンストラクタ
* @param context コンテキスト
*/
public Configuration(Context context) {
mContext = context;
// 設定ファイル読み込み
String filename = getMetaData(CONF_FILENAME); // "jp.tamac.hoge.conf"
if (filename != null) {
if (filename.startsWith("/")) {
// フルパス
loadProperties(filename);
} else {
// XOOMの外部SDカード → 内部(エミュレート)SDカード → getExternalStorageDirectory()の返すパス
boolean result =
loadProperties("/mnt/sdcard-ext/" + filename) ||
loadProperties("/mnt/sdcard/" + filename) ||
loadProperties(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + filename);
}
}
}
/**
* プロパティ読み込み
* @param filepath 設定ファイルパス
* @return 結果
*/
private boolean loadProperties(String filepath) {
if (!new File(filepath).isFile()) {
// ファイルがない
return false;
}
try {
mProperties.load(new FileInputStream(filepath));
} catch (Exception e) {
android.util.Log.e("Configuration#loadProperties()", e.toString());
return false;
}
// 読み込み成功
return true;
}
/**
* 接続先URL取得
* @return 接続先URL
*/
public String getConnectionURL() {
String url = null;
if (url == null) {
// 設定ファイルから
url = mProperties.getProperty(CONF_CONNECTION_URL);
}
if (url == null) {
// AndroidManifestから
url = getMetaData(CONF_CONNECTION_URL);
}
if (url == null) {
// 組み込みデフォルト値 ※お好みでリソースから読むのでも
url = CONF_CONNECTION_URL_DEFAULT;
}
return url;
}
/**
* AndroidManifestからMETAデータ取得
* @param name パラメタ名
* @return METAデータ
*/
private String getMetaData(String name) {
try {
PackageManager manager = mContext.getPackageManager();
ApplicationInfo info = manager.getApplicationInfo(mContext.getPackageName(),
PackageManager.GET_META_DATA);
return info.metaData.getString(name);
} catch (Exception e) {
// 無ければ無いで問題ないのですりつぶす
return null;
}
}
}
設定ファイルサンプル。先頭が
# の行はコメント行として無視されます。
# 開発環境
CONNECTION_URL=http://192.168.1.20:8080/
# テスト環境
#CONNECTION_URL=http://test.hoge.tamac.jp/
# 本番環境
#CONNECTION_URL=https://hoge.tamac.jp/