https://blog.csdn.net/qiaobinXU/article/details/82460949
前情提示:此篇文章不论打包过程,只记录下过程中遇到的几个问题以及解决方法。
第一次给ios打包,也是遇到了各种问题啊。这不,记录几个,长长记性。
项目里使用的是Lua和c#
问题一:网络请求报错 code = 1002
错误打印:NSURLConnection finished with error - code -1002
code 1002 无效的url。有可能是url没拼对。也有可能是因为编码问题。
查找问题原因的时候可以先把url的请求路劲打印出来,确定地址没问题后再找其它原因。
而我的问题,就是编码问题,需要转成utf-8编码。
尝试了很多次转码,比如,怀疑是有特殊字符导致的,不管是进行了utf-8转码,还是我直接用工具转好后再替换原先的url。都失败了。原因就是,转码这个步骤,要用object-c来转。我原先尝试的都是直接用的c#里的转码方法。
解决办法:从c#调用object-c转码方法。
步骤:① 在项目Assets/Plugins/ios 下新建一个文件,格式为.mm。例如,我的是utfformat.mm
代码:
#import <Foundation/Foundation.h>
extern "C"
{
const char* getUtf8Url(const char* url)
{
NSString *strNSString;
strNSString = [[NSString alloc] initWithUTF8String:url];
// NSLog(@"%@", strNSString);
NSString *urlString = [strNSString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet characterSetWithCharactersInString:@"#%^{}\"[]|\\<> "].invertedSet];
// NSLog(@"%@", urlString);
char* ret = nullptr;
ret = (char*) malloc([urlString length] + 1);
memcpy(ret,[urlString UTF8String],([urlString length] + 1));
return ret;
}
}
格式很明显了,先引进NSCharacterSet的命名空间
#import <Foundation/Foundation.h>
由于函数的签名要符合C的调用规范,因此要加上
extern "C"
这个函数的参数类型需要用c的类型,url在c#里是string格式,因为在这里要写成const char *,返回的自然也是这个格式。
NSString *urlString = [strNSString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet characterSetWithCharactersInString:@"#%^{}\"[]|\\<> "].invertedSet];
这句就是转码的啦。由于接受的参数类型是string,所以要先将char * 转换成string。
转换完成后自然也是要将string转成char*。一开始,我只是用简单的一句来实现。
char* ret = [urlString UTF8String];
但是这就引发了第二个问题。pointer being freed was not allocated。所以,才需要我如图所示的方式来转换。
②在c#里调用我们刚写的getUtf8Url方法
1、引进命名空间
using System.Runtime.InteropServices;
2、DllImport是System.Runtime.InteropServices命名空间下的一个属性类,其功能是提供从非托管DLL导出的函数的必要调用信息
#if UNITY_IOS && !UNITY_EDITOR
[DllImport("__Internal")]
private static extern string getUtf8Url(string url);
#endif
3、如果是ios平台,则将url转下编码。
#if UNITY_IOS && !UNITY_EDITOR
string resultUrl = getUtf8Url(url);
#else
string resultUrl = url;
#endif
至此,这个问题解决了。
问题二:指针报空
错误打印:pointer being freed was not allocated
这就是问题一里解决string转char * 时引发的一个问题。解决方法前头也说过了,略。
问题三:unable to open archive file :
无法找到资源。
我这个项目的资源是用 assetbundle 打的包,放在了项目的 StreamingAssets 下。
这种只能用 www 加载,或者是 assetbundle 的 loadfromfile,然后传路径url
加载方法要是没问题,那就是路径的问题了,或者是打包的参数和平台错误了。
最后发现,是我一开始打资源的时候忘记先设置下build settings,将它选中ios平台。而是默认选中了第一个平台,所以打出来的资源,储存在了StreamingAssets下osx包里。而不是ios下。
被自己蠢哭。
好啦,以上就是我踩得坑。在解决了这些问题后,我的第一个ios包终于是问世了,感动。哈哈哈