如何混合 objective-c 和 swift 来制作 cocoapods 框架

How to mix objective-c and swift to make a cocoapods framework

我正在创建一个 swift 框架,我想在框架中使用 objective-c class。

我用 pod lib create frameworkName 创建了库。

这是我的 podspec 文件:

http://guides.cocoapods.org/syntax/podspec.html

Pod::Spec.new do |s|
s.name             = 'MyFramework'
s.version          = '0.1.0'
s.summary          = 'A short description of RadiantSensorsRSPOS.'

s.description      = <<-DESC
TODO: Add long description of the pod here.
                   DESC
s.license          = { :type => 'MIT', :file => 'LICENSE' }
s.ios.deployment_target = '8.0'

s.source_files = 'MyFramework/Classes/**/*'
s.public_header_files = 'Pod/Headers/*.h'
# s.frameworks = 'UIKit', 'MapKit'
# s.dependency 'CocoaAsyncSocket'
end

我有 objc.hobjc.m 文件,其中包含 Objc class。我必须在 MyFramework.swift.

中使用这个 Objc class

在标准应用程序(非框架)中,我创建了一个头桥并导入了 objc.h 文件,因此我可以访问 Objc class.

如何使用这里的Objcclass?

我应该把 objc.hobjc.m 文件放在哪里?

这里如何制作header bridge?

我意识到回答你的问题可能有点晚了,但我最近不得不和你做同样的事情 - 创建一个 Swift 框架的 cocoapod,其中混合了一些 Objective C 代码在里面。

当您在 Xcode(我使用的是 8.2 或更高版本)中创建一个 Swift-based 框架时,它会生成一个名为 header 的同名文件 (.h)作为目标。因此,如果您的框架目标称为 'MyFrameworkTarget',则 Xcode 添加的保护伞 header 称为 'MyFrameworkTarget.h'。将此 header 与其他 Swift 和 Objective C 源代码文件一起包含在您的 cocoapod 中很重要。

例如,这是一个有效的 podspec 文件,它将 Swift 和 Objective C 源文件组合到一个同时针对 iOS 和 macOS 的框架中:

Pod::Spec.new do |s|

s.name         = "MyFramework"
s.version      = "1.0.0"
s.summary      = "Example cocoapod spec for a mixed language framework"
s.description  = <<-DESC
  Example cocoapod spec for a mixed language framework that targets both iOS and macOS.
DESC

s.homepage     = "https://github.com/username/MyFramework"

s.license      = "Apache License, Version 2.0"

s.author       = { "My Name" => "info@code.myname.com" }

s.ios.deployment_target = "9.0"
s.osx.deployment_target = "10.11"

s.source       = { :git => "https://github.com/username/MyFramework.git", :tag => "#{s.version}" }

s.source_files       = 'Shared/*.{swift,h,m}'
s.ios.source_files   = 'MyFrameworkMobile/*.h'
s.osx.source_files   = 'MyFrameworkMac/*.h'

end

在这个特定的例子中,我有 Swift 和 Objective C 文件构成了文件夹 'Shared' 中为 iOS 和 macOS 构建的框架并引用了在 's.source_files' 的 podspec 中。然后 Xcode 生成并为我的两个框架目标 iOS(我命名为 MyFrameworkMobile)和 macOS(我命名为 MyFrameworkMac)编辑的框架伞文件在 's.ios.source_files' 和 's.osx.source_files',分别。在我的示例中,它们对于 iOS 和 macOS 是分开的,因为我有两个目标。实际的 header 位于文件夹 'MyFrameworkMobile' 和 'MyFrameworkMac'.

这是我实际的 on-disk 项目文件夹布局,以帮助可视化 podspec 指向的内容:

MyFramework.podspec
MyFramework.xcodeproj

MyFrameworkMac
  MyFrameworkMac.h
  Info.plist

MyFrameworkMobile
  MyFrameworkMobile.h
  Info.plist

Shared
  MyFramework.swift
  MyFramework.h
  MyFramework.m

希望这些信息对您有所帮助。有一个很好的示例项目演示了如何在 https://github.com/axl411/NVMDummyTestPod

GitHub 上为 Swift 和 Objective C 文件的混合项目创建 pod 文件