這篇是紀錄一個因緣際會下不斷查找Unity開發,如何在移動裝置上取得使用者國別
其中實現的階段性方向、過程,及結果的紀錄
需求
原先台版專案中需要玩家在進入遊戲後自行選取國別
但針對國籍功能來說,若直接給玩家進行選擇會有弊端產生,
舉例專案實際情形來說,在明明是台灣地區發行的遊戲,數據中卻出現了大量的外國人士
(大家都想要成為歐洲人,血統改命
為此,老闆希望能再不讓玩家修改的情況下得知國籍並顯示
寫在開始前的檢討
後來發現新版Unity (2017.x ?)
Application.SystemLanguage 就能確保取到玩家裝置的系統語言,
如果不是後續的需求被限制,其實應該能直接使用這個方法處理就好
需求分析
從需求面來說,主要分成獲取國籍,及針對國別進行對應處理的兩個部分
1.獲取國籍
取得國籍來說,一般處理涉及全球資訊的原始資料,都會有ISO標準進行對應,
包含國家識別碼與貨幣單位,基本上都會有對應的ISO國際規範
我們需要取得的資料,基本上就是對應基於ISO3166的國家識別碼。
2.對應處理
而在對應部分,因為我們專案原先就已經台版顯示國籍的功能,
所以遊戲中已經有對應ISO3166-1(alpha-3 codes)的國別碼資料集供查詢及顯示
如果專案內沒有相關邏輯的資料的話,建議可以直接針對遊戲上架的地區國別選用ISO3166與其子集,
進行簡單的資料對應
設計
在開始實作前,我們預想了幾個可以從玩家裝置上取得的來源及理由
1.系統語言/系統國別:
理由:在大部分手機中我們都能看到系統設定中含有國別跟在部分OEM廠商中
2.玩家聯網的IP:
理由:因為是聯網遊戲,從玩家連線IP判斷國別很直覺,不太會有沒有回傳值的可能
(有現成API服務:ip2c
3.裝置國別 / 顯示語言
理由:玩家裝置上至少會有系統上設定的顯示語言,還可能會有國家欄位可以直接撈取
(事實證明想法太膚淺,比方Android 的國別台灣常見的手機廠商基本上都不會把國別跟顯示語言做額外的設定;
除了Sony以外基本上都英文都會幫你顯示美國
※不過確保做法統一情況下可以使用 Locale跟Telephony
4.GPS 地理座標
(這個也被第一時間否決了
實作 - 情境剖析
在開始實作前,先來比較上述來源取用後會出現的實際問題
- IP:玩家會有使用VPN跨區以及Proxy的問題
- Locale:部分OEM廠商有針對系統設定做客製化,但一般Language跟Country會回傳相近的結果;
舉例來說:法國人使用英文作為系統語言,結果來說大部分安卓手機會回傳美國的CountryISO - TelePhony:最可靠但也是最可能取不到的來源,所有遵循國際標準的ISP供應商會使用MCC跟MNC作為自己的識別碼,
但最關鍵的問題是;比如平板用戶,在Wifi版本的硬體支援下根本不會有插入SIM卡的可能,當在情況下呼叫會回傳空值 - Gec:取得地理座標,但就要自己處理國別資料轉換的問題,沒看到可用的解決方案xD
實作 - 快速實踐
這次就不細說實際處理的做法,只單就手法描述
iOS來說,基本上就是要直接寫C去處理,目前沒看到其他Unity引擎方面有提供的API使用
而Android來說,就算完全不自己包jar,
也有直接硬摳Android Activity來執行某些Android Native Function的這種做法
(早期的Unity 5.x官方範例就直接示範了呼叫AndroidClass的做法
要理解幾個關鍵字的用法,像是AndroidClass 跟 AndroidOnject的用法
像是StackOverflow上也有很多相關文章
剩下就可以直接透過類似SendMessage的方式,填入正確的Method Name就可以進行呼叫了
感謝觀看,若你能夠留下一些建議與感想
都會成為我寫文章的動力,感謝!!