吐血整理?。?!轉(zhuǎn)載請(qǐng)注明出處!
前言
如果不是公司業(yè)務(wù)非要用這種方案,請(qǐng)不要選這種方案,坑哭你。。。。
參考鏈接:
unity-in-framework
unity-ios-framework
正題
-
工具版本
unity版本 2018.2.1f
Xcode版本 xcode10(10的小版本沒一個(gè)個(gè)試應(yīng)該都可以 我是10.2.1)
很重要這兩個(gè)版本對(duì)不上 會(huì)有很多其他的錯(cuò)誤,只能自己在解決了,每個(gè)版本unity導(dǎo)出的c文件都不一樣,xcode配置也略有不同(具體哪里不同別問我,我也不知道,反正各種報(bào)錯(cuò)就對(duì)了)。
-
文件打包
在playsetting中other settings中的strip engine code勾去掉,正常導(dǎo)出unity中的iOS工程。這步不會(huì)去百度,很簡單,百度也一大堆。
-
新建iOS的framework工程
新建一個(gè)Unity文件夾,文件夾和App..xcodeproj文件同一目錄,加入工程 把Data Library Classes都拖進(jìn)新建的工程
把 Data 文件夾加入工程 選擇Create folder refrences
把Library和Classes 加入工程選擇Create groups
去掉Library中的libil2cpp文件夾Remove Refreence
把MapFileParser.sh加入到根目錄下,不用拖到項(xiàng)目中也就是和App..xcodeproj文件同一目錄。
在Build phases中添加Run Script腳本"$PROJECT_DIR/MapFileParser.sh"
加入幾個(gè)預(yù)先寫好的類主要是用來調(diào)用u3d中界面類的下載地址
重要
SpaceAppController.mm中的sharedController類方法,Unity使用_NSGetExecutablePath來查找可執(zhí)行文件的路徑,所以用facebook的fishhook hook住動(dòng)態(tài)鏈接。
接下來,我們需要覆蓋UnityAppController以防止Unity在加載資源時(shí)接管應(yīng)用程序UI并使用框架路徑而不是主程序包。覆蓋didFinishLaunchingWithOptions并執(zhí)行以下更改:
// we will replace this:
// UnityInitApplicationNoGraphics([[[NSBundle mainBundle] bundlePath] UTF8String]);
// with this:
UnityInitApplicationNoGraphics([[[NSBundle bundleForClass:[self class]] bundlePath] UTF8String]);
添加系統(tǒng)庫 見下圖

在Build Settings中添加User Define Setting 兩項(xiàng)

繼續(xù)在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)
編譯通過
-
新建測試APP工程
把編譯出的framework拖入測試工程
在Build phases中添加Run Script腳本"$PROJECT_DIR/MapFileParser.sh"
MapFileParser.sh別忘了拖過來
添加copy file parse

刪掉 Build Setting中的Library Search Paths中的內(nèi)容
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
所有的例子:地址我放百度網(wǎng)盤了 別問我為啥不傳GitHub 打開你就知道了。網(wǎng)盤鏈接
打包編譯的時(shí)候別忘了 把我例子里的iOS版本改成你要的
ps:其實(shí)我公司業(yè)務(wù)要求,把這個(gè)framework和公司原來的framework再次融合,再給APP集成,中間又有幾個(gè)小坑。我就不說了。有需要的同學(xué)可以給我留言。
感謝大大大大大蘿卜指出的兩個(gè)注意點(diǎn):
1.framework主要需要dynamic,否則ipa體積會(huì)很大。
2.fishhook非常危險(xiǎn),請(qǐng)謹(jǐn)慎使用!