未找到 Flutter 插件“geolocator-Swift.h”文件

Posted

技术标签:

【中文标题】未找到 Flutter 插件“geolocator-Swift.h”文件【英文标题】:Flutter plugin `geolocator-Swift.h` file not found 【发布时间】:2018-12-05 23:36:01 【问题描述】:

我创建了一个小 Flutter 插件,可用于监控 Flutter 应用程序中的位置变化(来源:https://github.com/baseflowit/flutter-geolocator)。在使用作为项目结构一部分的示例项目(由 Flutter CLI 生成)进行广泛测试后,我们决定发布该插件以使其可供全世界使用。

现在我们收到一些反馈,当您将在线 Dart Packages repo 中的包包含到您的 Flutter App 中时,ios 版本无法编译并返回以下异常:

/Users/maurits/Developer/flutter/.pub-cache/hosted/pub.dartlang.org/geolocator-0.0.2/ios/Classes/GeolocatorPlugin.m:2:9:
fatal error: 'geolocator/geolocator-Swift.h' file not found

在调试模式下运行 Flutter App 时会出现此错误,但在使用 flutter build ios --release 制作 iOS 包时也会出现此错误。

我有点不知所措,因为example 应用程序是Geolocator 项目的一部分,它可以正常工作,没有任何问题。我知道geolocator/geolocator-Swift.h 文件是自动生成的,所以在我看来,该文件并没有出现在最终的 Dart 包中。为了运行最终的 Dart 包,我运行了以下命令:

flutter packages pub publish

这是flutter doctor -v的输出:

[✓] Flutter (Channel beta, v0.5.1, on Mac OS X 10.13.5 17F77, locale en-NL)
    • Flutter version 0.5.1 at /Users/maurits/Developer/flutter
    • Framework revision c7ea3ca377 (4 weeks ago), 2018-05-29 21:07:33 +0200
    • Engine revision 1ed25ca7b7
    • Dart version 2.0.0-dev.58.0.flutter-f981f09760

[✓] android toolchain - develop for Android devices (Android SDK 28.0.0)
    • Android SDK at /Users/maurits/Library/Android/sdk
    • Android NDK location not configured (optional; useful for native profiling support)
    • Platform android-28, build-tools 28.0.0
    • ANDROID_HOME = /Users/maurits/Library/Android/sdk
    • Java binary at: /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java
    • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1024-b01)
    • All Android licenses accepted.

[✓] iOS toolchain - develop for iOS devices (Xcode 9.4.1)
    • Xcode at /Applications/Xcode.app/Contents/Developer
    • Xcode 9.4.1, Build version 9F2000
    • ios-deploy 1.9.2
    • CocoaPods version 1.5.3

[✓] Android Studio (version 3.1)
    • Android Studio at /Applications/Android Studio.app/Contents
    • Flutter plugin version 25.0.1
    • Dart plugin version 173.4700
    • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1024-b01)

[!] VS Code (version 1.24.1)
    • VS Code at /Applications/Visual Studio Code.app/Contents
    • Flutter extension not installed; install from
      https://marketplace.visualstudio.com/items?itemName=Dart-Code.flutter

[✓] Connected devices (1 available)
    • iPhone X • 69C349CF-81E1-47E8-B35A-A149D885CE43 • ios • iOS 11.4 (simulator)

任何帮助将不胜感激。

【问题讨论】:

请更新 Flutter 然后检查。我遇到了同样的问题,刚刚更新了我的颤振和错误消失了。 【参考方案1】:

你去 Ios/Podfile 添加以下行:

use_frameworks! # required by Geolocator

喜欢下面的

准备符号链接文件夹。我们使用符号链接来避免 Podfile.lock 指的是开发者机器上的绝对路径。

use_frameworks! # required by Geolocator
system('rm -rf .symlinks')
system('mkdir -p .symlinks/plugins')

在此添加之后

config.build_settings['SWIFT_VERSION'] = '4.2'

如下:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['ENABLE_BITCODE'] = 'NO'
      config.build_settings['SWIFT_VERSION'] = '4.2' # added this
    end
  end
end

【讨论】:

为什么这是必要的?虽然我认为这是一种解决方法,但真正的潜在错误是什么?需要哪个项目来解决它? 因为“geolocator”库使用 Swift(不是 Ojbect-C),它要求您在 Podfile 中“使用_frameworks”,并且对于使用 Swift 的目标,必须将 SWIFT_VERSION 设置为支持的值。也许3.0、4.1和4.2,你可以试试【参考方案2】:

由于插件是使用 Swift 编写的,因此使用 Flutter 应用程序应该基于 Swift 项目模板:

$ flutter create -i swift my_app

geolocator: 添加到pubspec.yaml 并为iOS 构建my_app 然后使用最新的Flutter beta 对我有用。

[✓] Flutter (Channel beta, v0.5.1, on Mac OS X 10.13.5 17F77, locale en-US)

【讨论】:

如果您已经创建了应用程序而没有指定-i swift 参数,那么需要进行哪些更改才能使其运行? @keithbhunter 不,我猜。在您的 Podfile 中添加 use_frameworks!【参考方案3】:

错误时的小补充:找不到模块'geocoder'

您需要运行“Runner.xcworkspace”文件,而不是“Runner.xcodeproj”文件

【讨论】:

您在使用 CocoaPods 时总是需要使用.xcworkspace。这不是针对此问题或此特定错误的。

以上是关于未找到 Flutter 插件“geolocator-Swift.h”文件的主要内容,如果未能解决你的问题,请参考以下文章

Flutter Geolocator 显示方法 toDouble() 在 null 上被调用

Flutter:Geolocator返回方法'compareTo'在null上被调用

xcode 上的 Flutter audioplayers 插件错误(未找到模块“audioplayers”)

指定位置未找到 Flutter SDK

Flutter Geolocator给出错误的纬度和经度

Flutter Geolocator 无法在 Android 上运行,但可以在 iOS 上完美运行