星期三, 9月 27, 2017

如何讓行動裝置專案輸出不同名稱

由於最近要交付二個不同平台的App出去,在開發上必需要比較有彈性。

以往的作法是,一個專案的名稱叫 myApp,那它輸出的app 名稱就叫作 myApp。

若是要改名稱,以我的作法,會把專案刪除了,另外創一個新的名稱的專案。

使得它輸出的名稱跟調整後的名稱是一樣的。

這樣的笨方法其實是不可行的,由其是專案越來越大的時候,不太可能為了一個app 名稱去刪除專案。

依照系統設計的邏輯,一定有什麼地方是可以調整輸出app 名稱。

Android的設定是在:

app->main->res->values->string.xml

<string name="app_name">app name you want</string>

iOS的設定是在:

Info.plist->Bundle display name -> Value -> app name you want

就可以解決問題。

解決因調整程式執行編碼,導致其它程式出現亂碼的問題。

為了解決程式輸入產生亂碼的問題,我把啟動前端程式的JVM的編碼參數移除。

使得JVM啟動程式時使用系統預設編碼。但這個導致了我們呼叫服務器get function回傳的中文值是亂碼。

為了要解決這個亂碼問題,我們打算先了解各系統使用的編碼本質,偵測程式碼如下:

String enc = System.getProperty("file.encoding");
System.out.println(enc);

得到的不是UTF-8,而是繁中系統所使用的MS950。

由於服務器系統回傳的是UTF-8,如果不使用UTF-8接收,直接用MS950接收,會產生亂碼。

於是我們將HttpURLConnection回傳的Inputstream,使用編碼為UTF-8的InputStreamReader接收。

這樣就可以解決MS950與UTF-8之間串接所造成的亂碼問題。程式碼如下,紅字部份為重點:

public static String doGet(String urlString, String contentType, String charset) throws IOException {
URL url = new URL(urlString);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setConnectTimeout(30000);
con.setRequestMethod("GET");
con.setRequestProperty("Content-Type", contentType);
con.setRequestProperty("charset", charset);
//
int http_status = con.getResponseCode();
if (http_status == 200) {
StringBuilder sb = new StringBuilder();
BufferedReader bfrd = new BufferedReader(new InputStreamReader(con.getInputStream(),"UTF-8"));
String temp = null;
while ((temp = bfrd.readLine()) != null) {
sb.append(temp);
sb.append("\r\n");
}
bfrd.close();
return sb.toString();
} else {
throw new IOException("Http Connection Error: " + http_status);
}
}