最近项目要上越南版本,然后需要接Facebook功能。其实在之前的各个地区的版本里面我的游戏都接过Facebook功能的。这次唯一的区别是越南那边的运营想在 Facebook里面直接显示游戏的名字是越南文的名字,而sdk是读取ios的product name作为显示的。游戏之前接的其他地区的product name都是使用英文的,于是感觉很简单,直接把xcode里面的product name改成了越南文的游戏名字。
结果发现游戏启动失败了,看看报错,是因为项目有个版本文件是放在StreamingAssets文件夹的,游戏启动的时候使用了WWW的方式去加载。然后把product name改成了越南文之后,在ios上面的StreamingAssets的路径会变成了/var/containers/Bundle/Application/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/user/越南文.app/Data/Raw/…这时候,直接使用StreamingAssets来做为WWW的url,会报unsupported url的错误。
看了一下这个错误,感觉是因为路径里面有utf-8的字符导致的,于是对路径做了一下urlencode,然后再WWW加载,就能正常读取了。c#里面有urlencode的方法:Uri.EscapeUriString(string str)
这个问题再延申一下,读取StreammingAssets路径,在pc 、mac、iOS上面其实都是可以直接用I/O的方式读取的,只有Android不行。这是因为Android的StreamingAssets文件夹是被打包在了apk的Assets里面,这个路径是只读的,而且不能用I/O的方式读取。当初我的项目就是为了方便,不想区分平台,才用了WWW的加载方式。
实际上同步读取Android上的StreammingAssets也是有很多方法的,比如AssetBundle.LoadFromFile就可以同步的读取StreamingAssets下面的AssetBundle文件。但这个方法只能读取AssetBundle,有一定的限制性。所以也可以通过jar或者aar的方式给项目写安卓的原始方法来读取,比如getResources().getAssets().open(filename)。
最后再做了一些尝试,发现只有WWW的url需要做urlencode,其他诸如AssetBundle.LoadFromFile系列的方法,是不需要urlencode直接传中文、越南文之类的路径都能读取的。