【问题标题】:swift dependency in objc podspec projectobjc podspec项目中的快速依赖
【发布时间】:2023-03-17 02:06:02
【问题描述】:

我正在创建我的第一个 CocoaPod 项目 (ObjC),它需要 Swift 依赖项。当我尝试对项目进行 lint 时,出现错误:

用 Swift 编写的 Pod 只能作为框架集成;将use_frameworks! 添加到您的 Podfile 或目标以选择使用它。

我了解在常规 xcode 项目中包含 CocoaPod 时如何执行此操作,但是当项目是 CocoaPod 时如何解决此问题?我尝试添加“use_frameworks!” podspec 文件中的声明,但这似乎不正确。

这是我的 podspec 文件:

Pod::Spec.new do |s|

  s.name             = "my-custom-pod"
  s.version          = "0.0.1"
  s.summary          = "totally awesome stuff"

  s.description      = <<-DESC
                         more details about the totally awesome stuff, if only it worked :(
                       DESC

  s.homepage         = "https://awesomestuff.com"
  # s.screenshots     = "www.example.com/screenshots_1", "www.example.com/screenshots_2"
  s.license          = 'MIT'
  s.author           = { "Me" => "me@awesomestuff.com" }
  s.source           = { :git => "https://awesome.com/awesome/my-custom-pod.git", :tag => s.version.to_s }
  s.social_media_url = 'https://twitter.com/awesomestuff'

  s.platform     = :ios, '8.0'
  s.requires_arc = true

  s.source_files = 'Pod/Classes/**/*'
  s.resource_bundles = {
    'my-custom-pod' => ['Pod/Assets/*.png']
  }

  # s.public_header_files = 'Pod/Classes/**/*.h'
  s.frameworks = 'CoreLocation', 'MapKit'
  s.dependency 'SSKeychain', '~> 1.2.3'
  s.dependency 'FMDB', '~> 2.5'
  s.dependency 'GoogleMaps', '~> 1.10.4'
  s.dependency 'Socket.IO-Client-Swift', '~> 4.0.4'
end

这里,socket io 客户端是问题所在。我可以将 socket io 框架导入到我的其他 ObjC 项目中,但我从未尝试将其导入到自定义可可豆荚中。

非常感谢任何帮助。提前致谢。

【问题讨论】:

    标签: ios objective-c swift cocoapods podspec


    【解决方案1】:

    添加 podsepc 文件:-

    spec.dependency 'Socket.IO-Client-Swift', '12.0.0'
    
      spec.pod_target_xcconfig   = {
    
        'SWIFT_VERSION' => '4.0',
        'VALID_ARCHS' => 'x86_64 arm64'
      }
    

    【讨论】:

      【解决方案2】:

      lint 失败了,因为我试图包含 --use-libraries lint 命令以适应 GoogleMaps pod,但是在尝试包含 Socket.IO 之类的 swift pod 时这不兼容。由于 GoogleMaps pod 在 pod 中包含其自身的静态版本,因此您不能简单地将其包含在您的 pod 项目中,否则您会收到 lint 错误 The 'Pods' target has transitive dependencies that include static binaries

      所以我最终不得不获取 GoogleMaps.framework 并将其静态包含在我的 pod 中(而不是将 pod 列为依赖项)。不理想,但我找不到另一种可行的解决方案来同时包含 swift pod 和 GoogleMaps pod。

      以下是我的 podspec 文件中的相关位:

      s.libraries = 'c++', 'icucore', 'z'
      
      s.dependency 'SSKeychain', '~> 1.2.3'
      s.dependency 'FMDB', '~> 2.5'
      s.dependency 'Socket.IO-Client-Swift', '~> 5.3.3'
      
      s.frameworks = 'MapKit', 'GoogleMaps', 'AVFoundation', 'CoreData','CoreLocation', 'CoreText', 'GLKit', 'ImageIO', 'OpenGLES', 'QuartzCore', 'SystemConfiguration', 'Accelerate'
      s.resource_bundles = { 'GoogleMaps' => ['Pod/Dependencies/GoogleMaps.framework/Resources/*.bundle'] }
      s.vendored_frameworks = 'Pod/Dependencies/GoogleMaps.framework'
      s.xcconfig = { 'LD_RUNPATH_SEARCH_PATHS' => 'Pod/Dependencies' }
      

      这是适用于这个 podspec 的 lint 命令:

      pod lib lint my-custom-pod.podspec --private --allow-warnings

      我现在看到的唯一问题是,当我将 pod 导入我的项目时,我要么在运行前遇到此警告:

      自动链接提供的“path/to/GoogleMaps.framework/GoogleMaps”,path/to/Pod/Dependencies/GoogleMaps.framework/GoogleMaps 中的框架链接器选项不是 dylib

      或者这个在编译时(显示在控制台中):

      GMSBillingPointRecorder 类在 path/to/my/application/Frameworks/my-custom-pod.framework/my-custom-pod 和 path/to/my/app/myapp.app/myapp 中实现。将使用两者之一。哪一个是未定义的。

      对于 GoogleMaps 框架中的每个类,都有一个单独的控制台日志警告。我似乎无法摆脱这些警告。如果我链接我会收到警告,如果我不链接我会收到警告。

      【讨论】:

        【解决方案3】:

        use_frameworks! 是一个 podfile-only 设置。

        在检查 podspec 时使用框架的方法是为您的 pod spec lint 命令提供 --use-frameworks 标志。

        【讨论】:

        • 感谢您的回复,@pevasquez!我在 linting 时使用了 --use-frameworks 标志,因为我也在使用 GoogleMaps 框架,但我仍然收到与 Socket IO 框架为 Swift 相关的错误。
        • 更正,--use-frameworks 不是有效的 lint 命令。 --use-libraries 可能是您所指的?不过,这似乎并不能解决问题;同样,由于 GoogleMaps 的依赖,我以前使用过它。
        • 嗯,你是对的,--use-frameworks 不再是 lint 的标志,因为它现在是默认行为。 --use-libraries 的意思正好相反,所以尝试不使用它,看看你会怎么做。没有 Swift 依赖项可以使用该标志
        • 再次感谢,pevasquez。这是问题的一部分。下面总结一下。
        猜你喜欢
        • 2018-05-24
        • 1970-01-01
        • 1970-01-01
        • 2014-05-11
        • 2020-01-19
        • 2015-12-11
        • 2013-11-02
        • 1970-01-01
        • 2014-12-13
        相关资源
        最近更新 更多