1.pod库创建
方式一 : pod spec create (pod库名称)
方式二: pod lib create (pod库名称) 带有示例工程
本地验证 pod lib lint 文件名.podspec
pod lib lint JCMaNongChenZaiTest.podspec --allow-warnings
联网验证 pod spec lint JCMaNongChenZaiTest.podspec
2.podspec文件基本操作
#
# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html.
# Run `pod lib lint jdfpassportlogin.podspec' to validate before publishing.
#
Pod::Spec.new do |s|
# 库名
s.name = 'jdfpassportlogin'
# 库版本号, 和下载使用版本对应
s.version = '0.0.1'
# 简短介绍
s.summary = 'A new Flutter plugin.'
# 详细介绍
s.description = <<-DESC
A new Flutter plugin.
DESC
# 主页,这里要填写可以访问到的地址,不然验证不通过
s.homepage = 'http://example.com'
# 截图
# s.screenshots = "www.example.com/screenshots_1", "www.example.com/screenshots_2"
# 开源协议
s.license = { :file => '../LICENSE' }
# 作者信息
# s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'Your Company' => 'email@example.com' }
# 项目地址,不支持ssh的地址,验证不通过,只支持HTTP和HTTPS,最好使用HTTPS
s.source = { :path => '.' }
# { :git => 'https://github/jdfpassportlogin.git', :tag => s.version.to_s }
# 支持的平台及版本
s.platform = :ios, '9.0'
# 添加模块名
# spec.module_name = 'Three20'
# 是否使用ARC,如果指定具体文件,则具体的文件使用ARC
# s.requires_arc = true
# 代码源文件地址,**/*表示Classes目录及其子目录下所有文件,如果有多个目录下则用逗号分开,如果需要在项目中分组显示,这里也要做相应的设置
# Classes/**/*.{h,m} 以 .h 和 .m 结尾的文件
# Classes/**/*.h 以.h 结尾的文件
# Classes/**/*.{h,m,storyboard}
s.source_files = 'Classes/**/*.{h,m}'
# 图案: *
# *将匹配所有文件
# c*将匹配所有以开头的文件c
# *c将匹配所有以c
# *c*将匹配其中的所有文件c(包括开头或结尾)
# 图案: **
# 递归匹配目录。
# 多个文件示例
# s.source_files = #{root}/JZActionJumpModule-umbrella.h", "#{root}/Classes/**/*.{h,m}"
# 导入头文件, 不建议
# spec.prefix_header_contents = '#import <UIKit/UIKit.h>', '#import <Foundation/Foundation.h>'
# 头文件引用, 不建议
# spec.prefix_header_file = 'iphone/include/prefix.pch'
# 公开头文件地, 也可以指定具体文件
s.public_header_files = 'Classes/**/*.h', #'Classes/example/example.h'
# 项目头文件
# spec.project_header_files = 'Headers/Project/*.h'
# 私有文件, 即不公开
# spec.private_header_files = 'Headers/Private/*.h'
# 排除文件
# spec.exclude_files = 'Classes/**/unused.{h,m}'
# buildsetting相关设置, 这里bitcode设置为NO, C++ Standard Library设置为libstdc++
# s.xcconfig = {
# 'ENABLE_BITCODE' => 'NO',
# 'CLANG_CXX_LIBRARY' => 'libstdc++'
# }
# 该pod依赖的系统framework,多个用逗号隔开
# s.frameworks = 'UIKit','CoreGraphics'
# 弱引用的库
# spec.weak_frameworks = 'Twitter', 'SafariServices'
# 该pod依赖的系统library,多个用逗号隔开
# s.libraries = 'iconv','sqlite3','stdc++','z'
# 第三方.a文件
# s.vendored_libraries = 'login_sdk/*.a'
# 第三方frameworks文件
# s.vendored_frameworks = 'XXEncryptKit/Classes/ThirdParty/*.framework'
# 依赖关系,该项目所依赖的其他库,如果有多个需要填写多个s.dependency
# 依赖项可以指定版本要求。建议使用乐观版本指示器~>,因为它提供了对版本的良好控制,而不会太严格。
# 例如, ~> 1.0.1相当于与>= 1.0.1结合< 1.1。同样, ~> 1.0将匹配1.0, 1.0.1, 1.1,但不会升级到2.0.
# spec.dependency 'AFNetworking', '~> 1.0', :configurations => ['Debug']
# spec.dependency 'AFNetworking', '~> 1.0', :configurations => :debug
# spec.dependency 'AFNetworking', '~> 1.0'
s.dependency 'Flutter'
s.dependency 'JDLLogin'
s.dependency 'YYKit'
# 此处待验证, 配置可能添加到示例工程
# spec.info_plist = {
# 'CFBundleIdentifier' => 'com.myorg.MyLib',
# 'MY_VAR' => 'SOME_VALUE'
# }
# 应该传递给编译器的标志列表。
# spec.compiler_flags = '-DOS_OBJECT_USE_OBJC=0', '-Wno-format'
# 添加到最终私有pod 目标 xcconfig 文件的任何标志。
# spec.pod_target_xcconfig = { 'OTHER_LDFLAGS' => '-lObjC' }
# 是否允许使用静态库
s.static_framework = true
# 使用subspec来实现目录分层。
s.subspec 'IdassSKD' do |ss|
ss.source_files = 'login_sdk/**/*.{h,m}'
ss.vendored_library = 'login_sdk/libJDMobileLoginSDK.a'
# 资源文件地址
ss.resources = 'login_sdk/JDMobileLoginSDK.bundle'
end
s.subspec 'LegoasSDK' do |ss|
ss.vendored_frameworks = "legolas_sdk/*.framework"
ss.resources = 'legolas_sdk/JDJR_Legolas.bundle'
ss.frameworks = 'Security','WebKit'
end
# Flutter.framework does not contain a i386 slice. Only x86_64 simulators are supported.
s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS[sdk=iphonesimulator*]' => 'x86_64' }
end
3.加载xcassets图片
- 这种方式把resources资源合并主项目的xcassets中
- 加载图片依然使用[UIImage imageNamed:@"test"]
- podfie 需要添加install! 'cocoapods',
:disable_input_output_paths => true- 使用它use_frameworks
示例
s.resources = "Assets/*.xcassets"
3.framework脚本
# Sets the target folders and the final framework product.
FRAMEWORK_NAME=LibraryName
FRAMEWORK_VERSION=1.0
FRAMEWORK_CONFIG=Release
# Install dir will be the final output to the framework.
# The following line create it in the root folder of the current project.
INSTALL_PATH=${PROJECT_DIR}/Products/
INSTALL_DIR=${INSTALL_PATH}/${FRAMEWORK_NAME}.framework
# Working dir will be deleted after the framework creation.
WORK_DIR=build
DEVICE_DIR=${WORK_DIR}/${FRAMEWORK_CONFIG}-iphoneos/${FRAMEWORK_NAME}.framework
SIMULATOR_DIR=${WORK_DIR}/${FRAMEWORK_CONFIG}-iphonesimulator/${FRAMEWORK_NAME}.framework
xcodebuild -configuration "${FRAMEWORK_CONFIG}" -target "${FRAMEWORK_NAME}" -sdk iphoneos
echo "Build simulator"
xcodebuild -configuration "${FRAMEWORK_CONFIG}" -target "${FRAMEWORK_NAME}" -sdk iphonesimulator
# Creates install directory if it not exits.
if [ ! -d "${INSTALL_DIR}" ]
then
mkdir -p "${INSTALL_DIR}"
fi
# Creates headers directory if it not exits.
if [ ! -d "${INSTALL_DIR}/Headers" ]
then
mkdir -p "${INSTALL_DIR}/Headers"
fi
# Remove all files in the headers diectory.
for file in `ls "${INSTALL_DIR}/Headers"`
do
rm "${INSTALL_DIR}/Headers/${file}"
done
# Remove binary library file.
rm -f ${INSTALL_DIR}/${FRAMEWORK_NAME}
# Copies the headers files to the final product folder.
if [ -d "${DEVICE_DIR}/Headers" ]
then
for file in `ls "${DEVICE_DIR}/Headers"`
do
cp "${DEVICE_DIR}/Headers/${file}" "${INSTALL_DIR}/Headers/${file}"
done
fi
# copy nibs to bundle,then copy bundle to final folder
BUNDLE_DIR=${DEVICE_DIR}/${FRAMEWORK_NAME}.bundle
if [ -d "${BUNDLE_DIR}" ];then
if ls ${DEVICE_DIR}/*.nib >/dev/null 2>&1;then
rm -rf ${BUNDLE_DIR}/*.nib
cp -rf ${DEVICE_DIR}/*.nib ${BUNDLE_DIR}
fi
rm -rf "${INSTALL_DIR}/${FRAMEWORK_NAME}.bundle"
cp -R "${BUNDLE_DIR}" "${INSTALL_DIR}/${FRAMEWORK_NAME}.bundle"
fi
echo "Merge with simulator"
# Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product.
lipo -create "${DEVICE_DIR}/${FRAMEWORK_NAME}" "${SIMULATOR_DIR}/${FRAMEWORK_NAME}" -output "${INSTALL_DIR}/${FRAMEWORK_NAME}"
open "${INSTALL_PATH}"
# rm -r "${WORK_DIR}"
4. static_framework应用
s.static_framework = true
1.用cocoapods
导入swift
框架到swift
项目和OC
项目都必须要在 Podfile
文件 use_frameworks!
2.使用use_frameworks!
, cocoapods
, 会生成相应的, .frameworks
,文件(动态链接库:实际内容为 Header + 动态链接库 + 资源文件)
此时如果podspec
中又必须引入.a
文件, 可以使用此命令解决
否则pod install
报错
[!] The 'Pods-***_Example' target has transitive dependencies that include statically linked binaries:
(/***/***/Example/Pods/DouyinOpenSDK/DouyinOpenSDK/libDouyinOpenSDK.a)
静态库:(静态链接库)(.a)在编译时会将库copy一份到目标程序中,编译完成之后,目标程序不依赖外部的库,也可以运行
缺点: 会使应用程序变大
动态库:(.dylib)编译时只存储了指向动态库的引用。可以多个程序指向这个库,在运行时才加载,不会使应用体积变大,但是运行时加载会损耗部分性能,并且依赖外部的环境,如果库不存在或者版本不正确则无法运行
Framework:实际上是一种打包方式,将库的二进制文件,头文件和有关的资源文件打包到一起,方便管理和分发。