如何混合 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.h
和 objc.m
文件,其中包含 Objc
class。我必须在 MyFramework.swift
.
中使用这个 Objc
class
在标准应用程序(非框架)中,我创建了一个头桥并导入了 objc.h
文件,因此我可以访问 Objc
class.
如何使用这里的Objc
class?
我应该把 objc.h
和 objc.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 文件
我正在创建一个 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.h
和 objc.m
文件,其中包含 Objc
class。我必须在 MyFramework.swift
.
Objc
class
在标准应用程序(非框架)中,我创建了一个头桥并导入了 objc.h
文件,因此我可以访问 Objc
class.
如何使用这里的Objc
class?
我应该把 objc.h
和 objc.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 文件