自定义 cocoapod 找不到 swift 文件

Posted

技术标签:

【中文标题】自定义 cocoapod 找不到 swift 文件【英文标题】:Custom cocoapod not finding swift file 【发布时间】:2019-05-03 20:56:45 【问题描述】:

我正在尝试创建一个自定义 Cocoapod 来处理我的 ios 应用程序的所有网络调用。我遇到的问题是,当我尝试在代码中引用它们时,找不到应该属于我的新 Cocoapod/框架的一些文件。

我按照本教程https://www.raywenderlich.com/5823-how-to-create-a-cocoapod-in-swift 成功创建了 Cocoapod .xcworkspace 项目(名称:ios-oauth2-rest-template)并将其添加到 bitbucket 并在 bitbucket 上创建了一个私有 PodSpec 存储库(名称:KPodSpec) (两个单独的仓库)。

我能够完成本教程,但我被困在“使用您的新 CocoaPod”部分。我能够运行以下命令将 Cocoapod 添加到我的 PodSpec 存储库中:

pod repo add KPodSpecs [Your RWPodSpecs Git URL]
pod repo push KPodSpecs ios-oauth2-rest-template.podspec

当我尝试在现有项目(名为:KApp)中使用我的新 pod 时,我的 Cocoapod 中的一些文件能够被引用,而其他文件即使在我 import ios_oauth2_rest_template 之后也不会自动完成。

我不确定我是否只是在我的KApp 项目中缺少ios-oauth2-rest-template 的框架。任何帮助将不胜感激。

KApp Podfile:

    # Uncomment the next line to define a global platform for your project
platform :ios, '12.0'

source 'https://github.com/CocoaPods/Specs.git'
source 'https://bitbucket.org/kpodspecs.git'

target 'KApp' do
  # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
  use_frameworks!

  # Pods for KApp

  target 'KAppTests' do
    inherit! :search_paths
    # Pods for testing
  end

  target 'KAppUITests' do
    inherit! :search_paths
    # Pods for testing
  end

  pod 'LBTAComponents'
  pod 'SwiftyJSON', '~> 4.0'
  pod 'TRON', '~>4.0'

  pod 'ios-oauth2-rest-template', '~> 0.0.1'

end

ios-oauth2-rest-template podspec:

Pod::Spec.new do |s|

# 1
s.platform = :ios
s.ios.deployment_target = '12.0'
s.name = "ios-oauth2-rest-template"
s.summary = "My summary here"
s.requires_arc = true

# 2
s.version = "0.0.1"

# 3
s.license =  :type => "Proprietary", :file => "LICENSE" 

# 4 - Replace with your name and e-mail address
s.author =  "My Name" => "myemail@email.com" 

# 5 - Replace this URL with your own GitHub page's URL (from the address bar)
s.homepage = "https://bitbucket.org/myStuff"

# 6 - Replace this URL with your own Git URL from "Quick Setup"
s.source =  :git => "https://bitbucket.org/myStuff.git",
:tag => "#s.version" 

# 7
s.framework = "UIKit"
s.dependency 'Heimdallr', '~> 3.6.1'

# 8
s.source_files = "ios-oauth2-rest-template/**/*.swift"

# 9
#s.resources = "RWPickFlavor/**/*.png,jpeg,jpg,storyboard,xib,xcassets"

# 10
# s.swift_version = "4.0"

end

ios-oauth2-rest-template Podfile:

# Uncomment the next line to define a global platform for your project
platform :ios, '12.0'

target 'ios-oauth2-rest-template' do
  # Uncomment the next line if you're using Swift or would like to use dynamic frameworks
  use_frameworks!

  # Pods for ios-oauth2-rest-template
    pod 'Heimdallr', '~> 3.6.1'

  target 'ios-oauth2-rest-templateTests' do
    inherit! :search_paths
    # Pods for testing
  end

end

提前致谢。我已经在互联网上搜索了为什么会发生这种情况,但我很困惑,因为我一开始就没有太多使用 CocoaPods 的经验。

更新 这是一些截图

KApp 的 Pod 部分,用于展示我的一些课程。当我尝试使用ApplicationUtils 时,它工作得很好并且可以自动完成,但是当我尝试使用BaseClass 时,它似乎找不到它。

设置下的构建阶段显示所有 30 个文件都在编译源下。这 30 个文件与来自 ios-oauth2-rest-template Xcode 项目的 30 个文件相匹配。第 31 个文件是ios-oauth2-rest-template-dummy.m

图片显示了ios-oauth2-rest-template Cocoapod 项目的文件夹结构。

【问题讨论】:

所有 .swift 源文件都放入了ios-oauth2-rest-template 文件夹吗?安装 pod 后,在 Xcode 中打开您的项目,从底部选择 Pods 项目,在 Targets 下选择您的库名称,然后进入 Build Phases / Compile Sources。你能看到你的 pod 的所有 swift 源,还是缺少一些 swift 文件? 所有 .swift 源代码都在 ios-oauth2-rest-template 文件夹中。我在ios-oauth2-rest-template Xcode 项目中有 30 个文件,当我打开 KApp 时,ios-oauth2-rest-template 文件夹中有 30 个文件。当我转到 Build Phases/Compile Sources 时,我看到了我的 pod 的所有 swift 源,是的。 参考上面上传的图片。 有趣...另一个提示:如果您使用 Xcode 的新构建系统(Xcode > 文件 > 工作区设置),您可能需要清理您的项目(Xcode > 产品 > 清理构建文件夹)和如果您正在开发自己的 pod,请再次构建它。或者只是尝试使用旧版构建系统。 最后一个提示:确保在有问题的 swift 文件中,类、结构、枚举等及其属性/函数是 publicopen 以允许从吊舱外。 【参考方案1】:

感谢@balazs630,我能够解决问题。我必须确保我的访问控制设置为 publicopen 才能访问它们。回顾我的代码,ApplicationUtils 是一个公共类,BaseClass 没有指定,所以默认是internal,根据docs:

内部访问使实体可以在任何源文件中使用 来自他们的定义模块,但不在此之外的任何源文件中 模块。

对于遇到类似问题的任何人,请检查以确保您的访问控制设置正确。这里有一些资源可以让您熟悉 Swift 中的访问控制:

https://medium.com/@abhimuralidharan/swift-3-0-1-access-control-9e71d641a56c https://docs.swift.org/swift-book/LanguageGuide/AccessControl.html

【讨论】:

我遇到了这个问题,我已经在我的框架中使用了“Public Struct AppConstant”。但是,在 Pod 安装后,“AppConstant” - 使用未解析的标识符。你能指导我吗?

以上是关于自定义 cocoapod 找不到 swift 文件的主要内容,如果未能解决你的问题,请参考以下文章

在添加的 CocoaPods 项目中找不到一些导入

在框架头文件中找不到 swift 文件

RestKit 编译失败,cocoapods use_frameworks for swift

CocoaPods 找不到 pod “5.0.0-beta.1” 的兼容版本

使用 cocoapods 时找不到 Mantle/Mantle.h' 文件

找不到 CocoaPods 桥接头文件