Flutter运行iOS26真机的两个问题

一、Debug编译崩溃

../../../flutter/third_party/dart/runtime/vm/virtual_memory_posix.cc: 428: error: mprotect failed: 13 (Permission denied)
在iOS上Dart不管是JIT运行还是进行hotload的时候,都需要涉及代码在内存从RW变成RX的调整,而这在Flutter低版本是通过mprotect完成,而这在iOS 26被禁止了

所以Flutter在Debug模式下真机运行iOS 26设备就崩溃了。如果确实需要在iOS 26上真机调试,方案如下:

  1. 目前测试最新的3.38.5版本可以正常在Debug模式运行iOS 26设备。
  2. 如果不能升级Flutter版本,只能暂时使用Release或Profile模式运行(修改iOS项目Scheme,设置run->Build Configuration)

二、Flutter适配UIScene

当我的iOS 26的设备正常运行后,发现Xcode控制台有一行打印:

UIScene lifecycle will soon be required. Failure to adopt will result in an assert in the future.

强制使用UIScene不然未来就可能触发断言,太可怕了😱那就顺便做了吧。

Flutter最低版本

dart 复制代码
environment:
  sdk: ^3.10.0
  flutter: ">=3.38.0"

方案一: 自动化迁移,适合iOS AppDelegate文件没有大量定制化修改,在项目终端运行命令:

sh 复制代码
flutter config --enable-uiscene-migration

迁移成功后,会在构建日志中看到 "Finished migration to UIScene lifecycle" 的提示,否则工具会给出警告,并提示你手动迁移。

方案二: 手动迁移

  1. AppDelegate移除window生命周期相关的方法,使用UIScene lifecycle的对应方法,保留application(_:didFinishLaunchingWithOptions:)方法,移除所有创建和设置window的代码
  2. AppDelegate类遵循协议:FlutterImplicitEngineDelegate,并在didInitializeImplicitFlutterEngine方法中注册插件,并将创建Method Channels或Platform Views的逻辑都迁移到此处,因为在didFinishLaunchingWithOptions执行时,FlutterViewController可能还不存在
swift 复制代码
import Flutter
import UIKit

@main
@objc class AppDelegate: FlutterAppDelegate, FlutterImplicitEngineDelegate {
    override func application(
    _ application: UIApplication, 
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
  
    func didInitializeImplicitFlutterEngine(_ engineBridge: any FlutterImplicitEngineBridge) {
        GeneratedPluginRegistrant.register(with: engineBridge.pluginRegistry)
        // Channel、Platform Views
    }
}
  1. 创建SceneDelegate.swift文件,基础定义如下:
swift 复制代码
import UIKit
import Flutter

class SceneDelegate: FlutterSceneDelegate {
}
  1. info.plist添加Application Scene Manifest相关key:
XML 复制代码
<key>UIApplicationSceneManifest</key>
<dict>
    <key>UIApplicationSupportsMultipleScenes</key>
    <false/>
    <key>UISceneConfigurations</key>
    <dict>
        <key>UIWindowSceneSessionRoleApplication</key>
        <array>
            <dict>
                <key>UISceneConfigurationName</key>
                <string>Default Configuration</string>
                <key>UISceneDelegateClassName</key>
                <string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
                <key>UISceneStoryboardFile</key>
                <string>Main</string>
            </dict>
        </array>
    </dict>
</dict>

key缺失可能会导致启动黑屏或控制台打印xxxkey缺失,其中key:

  • UISceneConfigurationName:Default Configurationflutter均可
  • UISceneDelegateClassName:FlutterSceneDelegate$(PRODUCT_MODULE_NAME).SceneDelegate均可

到此基础配置就完成了,恭喜你demo项目可以正常运行了,如果你的项目其他定制化修改还需要迁移,详细可以参考下面的Flutter Docs

参考链接

相关推荐
songgeb12 小时前
Compositional layout in iOS
ios·swift·设计
UTF_812 小时前
iOS动画浅谈
ios·客户端
2501_9160074714 小时前
HTTPS 抓包的流程,代理抓包、设备数据线直连抓包、TCP 数据分析
网络协议·tcp/ip·ios·小程序·https·uni-app·iphone
eleven409615 小时前
穿透内容审查与阻断:基于 DNS TXT 记录的动态服务发现与客户端安全加固实践
网络协议·ios·app
游戏开发爱好者815 小时前
React Native iOS 代码如何加密,JS 打包 和 IPA 混淆
android·javascript·react native·ios·小程序·uni-app·iphone
2501_9160074716 小时前
在非 Xcode 环境下完成苹果开发编译的记录 iOS 编译与调试
ide·vscode·ios·cocoa·个人开发·xcode·敏捷流程
程序员Ctrl喵16 小时前
异步编程:Event Loop 与 Isolate 的深层博弈
开发语言·flutter
1024小神16 小时前
记录xcode项目swiftui配置APP加载启动图
前端·ios·swiftui·swift
2501_9159184116 小时前
iOS mobileprovision 描述文件管理,新建、下载和内容查看
android·ios·小程序·https·uni-app·iphone·webview
00后程序员张17 小时前
iOS 应用程序使用历史记录和耗能记录怎么查?
android·ios·小程序·https·uni-app·iphone·webview