iOS导出unityFramework历程

一、背景

由于定义了unity和原生之间交互的桥,因此在导出unity项目后,需要将桥源码加到unityFramework里面参与编译,编译出动态库。

image.png
image.png

二、问题及排查历程

  1. 符号未定义

在unity那个demo里面进行桥使用:

image.png

发现符号未定义的问题:

image.png

然后发现为什么库里面其他的符号可以被使用:

image.png
  1. 符号未定义原因

细看不同之处:

image.png

原来加了这个显示,符号默认对外界隐藏。查看动态库设置参数,果然如此:

image.png

于是乎我也在自定义的类加上这个参数不就解决了?(哈哈哈,只能说运气没有站在我这边,啪啪打脸):

image.png

在自定义的类声明前面,也加上了这个标识,再次编译,wtf还是报符号未定义的错误。然后开始反思为什么会出现这样的效果,明明是一样的。我甚至尝试把这个类定义到UnityFramework文件里面,以避免库单独对这个文件做了什么处理。结果还是不行(依然报错)。然后再次问:明明是一样的,为什么还会报这个问题????但是真的是一样的吗?(使用的时候还是有不一样的)请看:

image.png

会发现,没有报错的12行是通过bundle.principalclass去获取的class,查看静态库的info.plist可以发现,这个主要类设置的就是UnityFramework

image.png

那么至于为什么会出现符号未定义的问题也就显而易见了:因为这个动态库是懒加载的,并不是我们常用的系统自动加载的动态库。报符号未定义的错是因为在编译时,如果调用了[HostRouterApi sharedInstance].sendEventToHostBlock,编译器会去验证app的mach-o文件以及它依赖的动态库的mach-o文件中是否有这个类的定义。

由于在编译时,程序还没有加载动态库UnityFramework,而程序只包含了HostRouterApi类的头文件,并没有它对应的.m文件(编译器只会将.m文件编译到最终的mach-o文件中),所以编译器在app的mach-o文件以及它依赖的动态库中找不到HostRouterApi类的定义,然后编译器就报错了。所以如果我们把12行换成13行,也会出现同样的报错:

image.png

三、究竟设置了啥,让这个demo只能懒加载动态库

一开始以为是因为Link Binary With Libraries(构建阶段(Build Phase),用于指定要与你的应用程序一起链接的二进制文件。而且因为正常我们引入framework的时候,这里也会存在。但是Unity-iPhone这个demo是没有的)。

image.png

但是经过自己创建新的demo,去验证发现,动态库依然会主动被加载,并不需要手动去加载(没有模拟出Unity-iPhone这个demo的效果)。

这个问题还有待确定(为什么unity导出来的demo会出现使用类编译找不到符号的错误)。。。

四、修复措施

image.png

新建的类按照这个方法,让其符号是可见的,然后直接导入该动态库使用即可。

五、自定义组件

  1. 修改组件名称

不要直接修改target名称

image.png

直接修改target名称虽然可以达到修改组件名称的目的,但是后续unity项目无法继续导出项目(会因为路径问题导致导出出错)。

image.png

修改framework对应target的build settings里面的product name

  1. 更新bridge文件

  2. bridge文件直接放在unityframework参与编译

bridge文件直接拖进unityframework里面参与编译,有更新的时候直接替换bridge文件即可。

image.png
  1. unityframework依赖bridge组件

bridge作为一个单独的组件,unityframework依赖该组件:

image.png

注意要把use_frameworks!注释掉,否则unityframework里面不会有bridge组件里面的符号(也就达不到最终只提供一个framework给业务的目的)。

而且LZAvatarBridge需要支持bitcode(因为unityframework支持)

image.png

但是由于最新苹果要求关掉该配置,因此需要把unityframework默认的yes改成NO。LZAvatarBridge也不用开启bitcode。

  1. 自动获取main函数的两个参数

- (void)runEmbeddedWithArgc:(int)argc argv:(char*[])argv appLaunchOpts:(NSDictionary*)appLaunchOpts

启动unity引擎需要main入口函数的两个参数(int)argc 和 argv:(char*[])argv,一开始尝试让组件使用方在main函数里面将这两个参数传给组件。但是细想一下,发现这样不太美观(主要是即构也没这样搞,那么肯定是内部有办法去获取这两个参数的)。经过一顿牛逼的操作后,终于实现:

        NSArray<NSString *> *arguments = [[NSProcessInfo processInfo] arguments];
        // 创建一个 char ** 数组,长度为 arguments 数组的长度加一(用于存储 NULL 结束符)
        char **argv = (char **)malloc((arguments.count + 1) * sizeof(char *));
        // 遍历 arguments 数组,将每个 NSString 对象转换为对应的 C 字符串
        for (NSInteger i = 0; i < arguments.count; i++) {
            NSString *argument = arguments[i];
            const char *cString = [argument UTF8String];
            // 复制 C 字符串到动态分配的内存中
            argv[i] = strdup(cString);
        }
        // 最后一个元素设置为 NULL,表示参数列表的结束
        argv[arguments.count] = NULL;
        int argc = (int)arguments.count;
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容