unity 3D 给 ios 打包

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qiaobinXU/article/details/82460949

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 加载,或者是 assetbundleloadfromfile,然后传路径url

加载方法要是没问题,那就是路径的问题了,或者是打包的参数和平台错误了。

最后发现,是我一开始打资源的时候忘记先设置下build settings,将它选中ios平台。而是默认选中了第一个平台,所以打出来的资源,储存在了StreamingAssets下osx包里。而不是ios下。

被自己蠢哭。

好啦,以上就是我踩得坑。在解决了这些问题后,我的第一个ios包终于是问世了,感动。哈哈哈

猜你喜欢

转载自blog.csdn.net/qiaobinXU/article/details/82460949