Unity3D工程打包成iOS的framework

吐血整理!!!转载请注明出处!

前言

如果不是公司业务非要用这种方案,请不要选这种方案,坑哭你。。。。
参考链接:
unity-in-framework
unity-ios-framework

正题

  1. 工具版本

unity版本 2018.2.1f
Xcode版本 xcode10(10的小版本没一个个试应该都可以 我是10.2.1)
很重要这两个版本对不上 会有很多其他的错误,只能自己在解决了,每个版本unity导出的c文件都不一样,xcode配置也略有不同(具体哪里不同别问我,我也不知道,反正各种报错就对了)。

  1. 文件打包

在playsetting中other settings中的strip engine code勾去掉,正常导出unity中的iOS工程。这步不会去百度,很简单,百度也一大堆。

  1. 新建iOS的framework工程

新建一个Unity文件夹,文件夹和App..xcodeproj文件同一目录,加入工程 把Data Library Classes都拖进新建的工程
Data 文件夹加入工程 选择Create folder refrences

LibraryClasses 加入工程选择Create groups

去掉Library中的libil2cpp文件夹Remove Refreence

MapFileParser.sh加入到根目录下,不用拖到项目中也就是和App..xcodeproj文件同一目录。

Build phases中添加Run Script脚本"$PROJECT_DIR/MapFileParser.sh"

加入几个预先写好的类主要是用来调用u3d中界面类的下载地址

重要
SpaceAppController.mm中的sharedController类方法,Unity使用_NSGetExecutablePath来查找可执行文件的路径,所以用facebook的fishhook hook住动态链接。

接下来,我们需要覆盖UnityAppController以防止Unity在加载资源时接管应用程序UI并使用框架路径而不是主程序包。覆盖didFinishLaunchingWithOptions并执行以下更改:

// we will replace this:
//     UnityInitApplicationNoGraphics([[[NSBundle mainBundle] bundlePath] UTF8String]);
// with this:
UnityInitApplicationNoGraphics([[[NSBundle bundleForClass:[self class]] bundlePath] UTF8String]);

添加系统库 见下图


屏幕快照 2019-05-05 下午5.08.53.png

Build Settings中添加User Define Setting 两项

屏幕快照 2019-05-05 下午3.35.27.png

继续在Other Lunker Flags中添加-weak_framework CoreMotion -weak-lSystem

Header Search Paths中添加$(PROJECT_DIR)/Unity/Classes $(PROJECT_DIR)/Unity/Classes/Native $(PROJECT_DIR)/Unity/Libraries/bdwgc/include $(PROJECT_DIR)/Unity/Libraries/libil2cpp/include

Other C Flags 添加 -DINIT_SCRIPTING_BACKEND=1 -fno-strict-overflow -DRUNTIME_IL2CPP=1

Prefix Header添加Unity/Classes/Prefix.pch

Mismatched Return Type添加YES 不要用YES(Error)

编译通过

  1. 新建测试APP工程

把编译出的framework拖入测试工程

Build phases中添加Run Script脚本"$PROJECT_DIR/MapFileParser.sh"
MapFileParser.sh别忘了拖过来

添加copy file parse

屏幕快照 2019-05-05 下午5.11.30.png

删掉 Build Setting中的Library Search Paths中的内容

Other C Flags添加$(inherited) -weak_framework CoreMotion -weak-lSystem

viewController.m代码

//
//  ViewController.m
//  testu3d-app
//
//  Created by King on 2019/4/25.
//  Copyright © 2019 King. All rights reserved.
//

#import "ViewController.h"
#import <testliboc/testliboc.h>

@interface ViewController ()
@property (nonatomic, weak) IBOutlet UIView* unityContainerView;
@property (nonatomic, strong) UIView* unityView;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    [[SpaceAppController sharedController] application:[UIApplication sharedApplication] didFinishLaunchingWithOptions:[NSDictionary dictionary]];
    [[SpaceAppController sharedController] applicationDidBecomeActive:[UIApplication sharedApplication]];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillResignActive) name:UIApplicationWillResignActiveNotification object:nil];
    
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidBecomeActive) name:UIApplicationDidBecomeActiveNotification object:nil];
    
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillEnterForeground) name:UIApplicationWillEnterForegroundNotification object:nil];
    
    
    self.unityView = [SpaceAppController sharedController].unityView;
    [self.unityContainerView addSubview:self.unityView];
    
}
- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    self.unityView.frame = self.unityContainerView.bounds;
}


- (void)applicationWillResignActive {
    [[SpaceAppController sharedController] applicationWillResignActive:[UIApplication sharedApplication]];
}

- (void)applicationDidBecomeActive {
    [[SpaceAppController sharedController] applicationDidBecomeActive:[UIApplication sharedApplication]];
}

- (void)applicationWillEnterForeground {
    [[SpaceAppController sharedController] applicationWillEnterForeground:[UIApplication sharedApplication]];
}

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [[SpaceAppController sharedController] applicationWillResignActive:[UIApplication sharedApplication]];
}


@end

所有的例子:地址我放百度网盘了 别问我为啥不传GitHub 打开你就知道了。网盘链接
打包编译的时候别忘了 把我例子里的iOS版本改成你要的

ps:其实我公司业务要求,把这个framework和公司原来的framework再次融合,再给APP集成,中间又有几个小坑。我就不说了。有需要的同学可以给我留言。

感谢大大大大大萝卜指出的两个注意点:
1.framework主要需要dynamic,否则ipa体积会很大。
2.fishhook非常危险,请谨慎使用!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容