背景介绍
首先flutter项目里面又个ios文件夹就相当于那个android文件夹一个道理,外面是flutter的dart代码里面就是各自的原生代码,至于是怎么转译过去的我猜就是每次运行的时候编译过去了。
然后就是苹果app是.ipa结尾的,苹果的app只能用苹果电脑打包发版,并且要求很多,其实可以直接用xcode直接运行,但是前辈姐说在as先运行,一开始真的我搞不明白as和xcode都扮演着什么角色,后来这那的就是不断撞南墙才知道原来as就是和在windowds电脑上没什么区别,xcode是苹果自带的就是专门用来开发苹果生态软件的东西,是可以直接在里面运行的,但是我是真的没找到控制台在哪,所以还是先用as运行然后看报错,已经试过了两边报错一样。
准备条件
首先一个完整的过程首先就是运行编译成功,用as还有个原因大概是可以先不用管证书那一套,应该是吧虽然现在还没运行出来,然后之后其实很简单就是按照xcode上一步步点就行。在此之前需要准备好苹果的相关文件。首先得有个账号,然后在你的账号里还有team,这个team也用得到,然后就是他申请的那些东西,首先最好先申请appid,这个东西一个app一个,不管以后更不更新都只是这一个,然后设备,这个就是如果你想运行到某个手机上你就得把你手机加上去,最后搞证书和描述文件,这一步就需要到苹果电脑的钥匙串,应该是一个电脑就一个,反正需要的时候穿上去就行,分为两种开发和发行,还没搞明白具体怎么用,但是as里面又个auto什么可以自动识别,识别不了也可以下到本地自己选,据前辈姐说如果证书不过期就可以不用再重新生成啥的,如果过期也不会影响已经发版的app
基础知识吧
完全不懂到不断看报错才能稍微懂点的关于苹果生态的一些基础词。
对于android来说可以直接在flutter项目运行,运行之前pubget,苹果的话这些我也先执行了,在之后进入ios项目很多说要运行 pod install,但是我观察发现在flutter项目运行 flutter build ios --release的时候也会运行pod install不知道是不是一个步骤还是都运行好了,记得flutter clean。
pod应该就是CocoaPods 是一个用于Swift和Objective-C Cocoa项目的依赖管理工具。它简化了在iOS和macOS项目中添加、更新和管理第三方库的过程
然后这里就有一个文件是podfile,这个就相当于pubspec.yaml,是两种不同编程语言生态系统中用于管理项目依赖的文件。
ios项目列表:
Flutter.podspec 和 Podfile.lock 是在 iOS 开发中使用 CocoaPods 作为依赖管理工具时涉及的两个不同文件,它们在项目管理和构建过程中扮演着不同的角色。以下是它们之间的联系和区别:
Flutter.podspec
定义:Flutter.podspec 是一个用于定义 Flutter 模块的 Podspec 文件。它包含了模块的元数据、源代码的位置、依赖关系、编译设置等信息。
作用:它告诉 CocoaPods 如何集成 Flutter 模块到 iOS 项目中,包括如何获取源代码、编译和链接模块。
内容:通常包含模块的名称、版本、描述、作者、源代码路径、依赖的 Pods、资源文件等。
更新:当 Flutter 模块更新时,Flutter.podspec 文件可能需要被修改以反映这些变化。
Podfile.lock
定义:Podfile.lock 是一个由 CocoaPods 生成的文件,它记录了当前项目依赖的每个 Pod 的确切版本。
作用:确保项目中的所有开发者以及持续集成环境使用相同版本的依赖库,从而保持构建的一致性。
内容:包含每个 Pod 的版本号、校验和、依赖关系以及安装时的依赖树。
更新:当运行 pod install 或 pod update 命令时,Podfile.lock 可能会被更新以反映依赖关系的改变。
联系
依赖管理:两者都与依赖管理有关。Flutter.podspec 定义了 Flutter 模块自身的依赖,而 Podfile.lock 确保了这些依赖的具体版本。
项目构建:在构建项目时,CocoaPods 会使用 Flutter.podspec 来集成 Flutter 模块,并使用 Podfile.lock 来确保所有依赖项的版本正确。
区别
文件类型:Flutter.podspec 是一个 Podspec 文件,用于定义一个 Pod;而 Podfile.lock 是一个锁定文件,用于记录项目依赖的详细版本信息。
内容:Flutter.podspec 包含了模块的定义和配置,而 Podfile.lock 只记录了依赖的版本信息。
更新频率:Flutter.podspec 在模块更新时可能需要修改,而 Podfile.lock 在每次运行 pod install 或 pod update 时都可能更新。
作用域:Flutter.podspec 是针对单个 Flutter 模块的,而 Podfile.lock 是针对整个 iOS 项目的。
总的来说,Flutter.podspec 是一个用于定义和配置 Flutter 模块的文件,而 Podfile.lock 是一个用于确保项目依赖一致性的锁定文件。它们共同工作,帮助开发者管理和维护 iOS 项目中的依赖关系。
swift和Objective-C都是苹果的语言,类似于vue和js区别吧我个人理解,一个新一个老。
这里就不得不提一下一个报错:
‘install_plugin-Swift.h’ file not found
看看ai说的:
这三个文件共同构成了一个Flutter插件,它们各自的作用和联系如下:
文件作用
InstallPlugin.h
这是一个Objective-C的头文件,它声明了一个InstallPlugin类,该类遵循FlutterPlugin协议。
它的作用是提供一个公开的接口,以便Flutter框架可以注册和使用这个插件。
InstallPlugin.m
这是一个Objective-C的实现文件,它包含了InstallPlugin类的具体实现。
在这个文件中,它调用了SwiftInstallPlugin的registerWithRegistrar:方法,将Swift编写的插件注册到Flutter框架中。
SwiftInstallPlugin.swift
这是一个Swift源文件,它定义了一个SwiftInstallPlugin类,该类同样遵循FlutterPlugin协议。
它实现了具体的方法,比如gotoAppStore,这些方法可以通过Flutter的MethodChannel被Dart代码调用。
文件联系
InstallPlugin.h和InstallPlugin.m共同定义了一个Objective-C的插件入口点,它允许Flutter框架与Swift编写的插件交互。
SwiftInstallPlugin.swift包含了插件的实际实现,它使用Swift编写,因此需要通过Objective-C的桥接头文件与Objective-C代码进行交互。
报错原因
错误 ‘install_plugin-Swift.h’ file not found 发生在InstallPlugin.m文件中,这通常是因为以下原因:
Xcode没有正确地为Swift类生成Objective-C的头文件。
桥接头文件没有被正确地配置在Xcode的构建设置中。
最终我找到了其他文件同样目录结构都是这样三个文件的把这个
#import <install_plugin-Swift.h>
改成
#if __has_include(<install_plugin/install_plugin-Swift.h>)
#import <install_plugin/install_plugin-Swift.h>
#else
#import "install_plugin-Swift.h"
#endif
行吧先写到这,总结一下:苹果垃圾!
成功后话
最开始没有运行出来先阐述一下我自己修改的过程:
最开始是抱着个错主要就是版本的问题
然后还有一堆其他的报错,
我搜了之后把最低版本改成了12.0之后就只剩下那个install_plugin-Swift.h文件的报错,然后我把在电脑上搜到的这个文件复制过去,我发现他爆粗了一个复制重复的错误,然后我去搜了那个文件里import的写法我发现那个意思是它是根据InstallPlugin.h生成install_plugin-Swift.h文件这个文件本来就应该没有,这个是InstalPlugin文件
之后修改过程前文也提到了,在之后又报错个推插件的问题
经过搜索这个时候可能推测是pod版本问题,在前辈的建议下我降低了版本由1.15.2降低到1.0.0
卡,此时有个哥来帮助我了,我们吧从windows系统上的项目复制过来的,没有采用从git上拉代码,所以之前存在的错误都先搁置。哥让我把版本先弄回去,所以我又升回了1.15.0
复制过来的项目pubget之后(androidstudio打开)之后当然还是报错最开始的版本问题,这次依旧按照原来的方式把相关文件里的9.0改为12.0,之后报错了一个新的错误
(由于之前那个install插件是存在于flutter目录下,所以我认为那个地方改了以后就都不会报错了)
(再另外就是由于这一次是进行更新所以新加的插件有一些可能会不支持ios,在flutter官网引用的时候记得按照redme添加相关内容配置)
这个错误简直是离奇事件,报错的路径在电脑中根本不存在,总之在文件中全局搜索搜到一个文件里有着两行内容,删掉之后报错大概意思是找不到LanchScreen.strings文件,差不多这个意思,所以我猜测此时项目已经构建成功只是缺少了打开屏幕的文件,所以就大胆试了一下把之前可以运行成功的相关配置以及文件复制过来最后成功运行。
0723B84625B910DD005E88AF /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "../../../tlpd_app_new/ios/Runner/zh-Hans.lproj/LaunchScreen.strings"; sourceTree = "<group>"; };07CA31C7255D1D870048C65B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = ../../../tlpd_app_new/ios/Runner/Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
(另外xcode控制台也是够奇葩的,一开始啥也不显示成功运行之后才有信息)