四:Flutter與原生iOS混編

一: 官方建議使用pod方法引入,因此我也采用pod方法引用
二:原生項目接入flutter工程。

不建議使用Android Studio或者VSCode創(chuàng)建,因為嘗試創(chuàng)建后發(fā)現(xiàn).iOS/Flutter目錄缺少podhelper.rb腳本命令,會導(dǎo)致配置完pod引入后報錯,建議使用命令行創(chuàng)建。

三: 建議使用命令行創(chuàng)建

創(chuàng)建的flutter工程目錄最好和iOS原生項目目錄一個級別文件目錄下:

image.png

//其中`my_flutter`為定義的`flutter工程名`  這里我定義為`flutter_project ` 
flutter  create -t  module  flutter_project
四: 使用命令行創(chuàng)建完后 在指定目錄下生成的flutter工程目錄如下
image.png
五: 經(jīng)過調(diào)研對比 Android StudioVSCode都可以開發(fā)flutter項目,但是個人建議使用Android Studio,真機調(diào)試或者log控制臺以及智能提示Android Studio都有較大優(yōu)勢,極其好用,我這里用的VSCode

注意:這個時候可以去看看 VSCode創(chuàng)建flutter項目哪篇文章,主要看如何先讓VSCode安裝好插件,如何VSCode跑起來看看效果。最后可以在VSCode的下面的終端里面執(zhí)行:flutter pub get命令,安裝插件,此命令也可以不執(zhí)行。

六: flutter項目創(chuàng)建完畢后。

1,打開新建的flutter項目,運行項目:

flutter run

確認無報錯。

2,那接下來SSB-iOS原生項目配置通過pod接入flutter項目,SSB-iOS項目的podfile配置如下:
pod目錄上面配置路徑下面配置對路徑的引用,如圖所示:

image.png

SSB-iOS項目的podfile配置具體代碼如下:

platform :ios, '12.0'

# flutter_application_path 是flutter 工程的項目路徑
flutter_application_path = '../flutter_project'
load File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')
post_install do |installer|
  flutter_post_install(installer) if defined?(flutter_post_install)
end

# 以及
target 'SSBApp' do
  use_frameworks!
  # 這邊引入
  install_all_flutter_pods(flutter_application_path)
end
七: 原生項目,執(zhí)行即可

1,原生項目,pod執(zhí)行

// cd 到iOS原生項目目錄下執(zhí)行:
pod install
// 或者
pod update --verbose --no-repo-update

2,原生項目,引入flutter配置

image.png

AppDelegate.h

#import <UIKit/UIKit.h>
#import <CoreData/CoreData.h>

#pragma mark --  flutter配置3
@import Flutter;
#import <FlutterPluginRegistrant/GeneratedPluginRegistrant.h>
@interface AppDelegate : FlutterAppDelegate //UIResponder <UIApplicationDelegate>
@property (nonatomic, strong) FlutterEngine *flutterEngine;
@property (readonly, strong) NSPersistentContainer *persistentContainer;
- (void)saveContext;

@end


image.png

AppDelegate.m

#import "AppDelegate.h"

@interface AppDelegate ()
@end

@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
   
#pragma mark --  flutter配置4
    self.flutterEngine = [[FlutterEngine alloc] initWithName:@"my flutter engine"];
    [self.flutterEngine run];
    [GeneratedPluginRegistrant registerWithRegistry:self.flutterEngine];
    return [super application:application didFinishLaunchingWithOptions:launchOptions];
}

八: 執(zhí)行完畢后 pod目錄下會引入flutter1.0FlutterPluginRegistrant如圖:
image.png

然后可以在VSCode下面的終端里面執(zhí)行

flutter run 

如果真機運行報錯:

image.png

那么需要把flutter里面的iOS工程Runner項目bundle Identifier改下,改成符合你的開發(fā)者開發(fā)者賬號格式
image.png

改成示例
image.png

注意:
1,flutter工程每次修改后,都需要進行

flutter run 

2,flutter工程每次修改后,原生主工程每次運行,都需要執(zhí)行一下:

pod install 

運行原生主工程,報錯
報錯1:Module 'Flutter' not found

image.png

解決:
image.png

Flutter工程

flutter clean
flutter pub get

SSB-iOS原生項目工程

pod install

報錯2:

Sandbox: rsync.samba(82572) deny(1) file-write-create /Users/yinxia/Library/Developer/
Xcode/DerivedData/iOSProject-dinnfnutvwrmoefkwmfpwlrafovp/Build/Products/Debug-iphonesimulator/Flutter.framework

//以及
[  +5 ms] Flutter failed to write to a file at "/Users/yinxia/Library/Developer/Xcode/DerivedData/
iOSProject-dinnfnutvwrmoefkwmfpwlrafovp/Build/Products/Debug-iphonesimulator/.last_build_id".

解決:在項目的構(gòu)建設(shè)置 > 構(gòu)建選項(BuildSettings)> 沙盒(User Script Sandboxing)' 改成NO

image.png

九: 那么iOS和flutter如何混編呢?iOS跳轉(zhuǎn)flutter頁面并傳參,flutter跳轉(zhuǎn)iOS頁面并傳參,如何做?

有多種種方式,其中一種就是flutter_boost
,我們用這種就行,看下一篇文章?!疚澹篎lutter與原生通信的方式簡介】

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容