체제 : Mac OS 10.15.2, 엑스 코드 11.3, 신속한 5.0
작성 시간 : 2019년 12월 23일
1. 설명
개발 iOS 앱은 기본적으로 처음부터 내장 아니오. 시스템 때문에 등 UIKit, 재단, 웹킷, MapKit, 같은 프레임 워크의를 제공, GitHub의 많은 오픈 소스 프레임 워크가 Alamofire , 킹 피셔 등등합니다.
정적 및 동적 라이브러리 라이브러리의 차이.
- 도서관 정적 - 컴파일시에 링크 된 코드 링크, 미래는 변경되지 않습니다.
그러나 아이폰 OS 라이브러리가 정적 허용되지 않습니다 images/assets
(단지 코드). Quxianjiuguo 방법은 가입 번들을 사용하는 것입니다 images/assets
.
Dynamic library
- 코드 또는assets
내용이 변경됩니다 내부 실행시에 연결된 링크하는 런타임.
그러나, 애플은 공식적으로 아이폰 OS 만들 수 동적 라이브러리를 . 동적 라이브러리 프로젝트가있는 경우 응용 프로그램이 실패 검토 할 것입니다.
- 프레임 워크 - 컴파일 된 코드가 작업 ... 그래서 달성하기 위해 프레임 워크 , 그래픽 리소스 파일, 스토리 보드, 문자열을 포함 할 수있다, 정적 프레임 워크 , 동적 프레임 워크 또는 기타 프레임 워크 . 버전 관리를, 그리고 나눌 수 있습니다 (아이폰 OS 8 나중에 만들 수)
이 문서에서는 프레임 워크는 Alamofire 타사 프레임 워크에 따라 작성되었습니다.
처음부터 따라 프레임 워크되지 않습니다 만든, 참조하시기 바랍니다 - 에서 프레임 워크 스위프트 도로 CocoaPods의 구성 요소 만들기 (에)
2. 프로젝트 다운로드
https://github.com/zgpeace/IceCreamShopFramework
여기 포함
- 프로젝트의 시작 IceCreamShop_Starter를
- 완료 된 프로젝트 : IceCreamShop_Finisher
- 프레임 워크 : 도서관 / RWPickFlavor
프레임 워크를 생성합니다
파일> 신규> 프로젝트> 프레임 워크 및 라이브러리> 프레임 워크
다음, Product Name
쓰기 RWPickFlavor 새로운 라이브러리에 저장이, 내부 폴더에
새로운 Podfile 파일
cd ~/yourProjectPath/Libraries/RWPickFlavor
pod init
open -a Xcode Podfile
다음과 같이 Podfile 내용 작성
platform :ios, '12.0'
target 'RWPickFlavor' do
pod 'Alamofire', '~> 4.7'
pod 'MBProgressHUD', '~> 1.1.0', :modular_headers => true
end
이 방법은 프레임 워크의 구성 요소는 타사에 의존하고있을 것이다 Alamofire
,
MBProgressHUD
.
4. 스위프트 정적 라이브러리
4.1 CocoaPods 버전 이하 1.5.0보다 CocoaPods 정적 라이브러리를 사용할 수 없습니다. 포드는 스위프트 코드에 Podfile에 표시해야합니다 포함되어있는 경우 use_frameworks!
. CocoaPods를 1.5.0 후, CocoaPods 당신은 정적 라이브러리 정적 라이브러리를 사용할 수 있습니다!
당신이 Podfile에서 생략하면 use_frameworks!
, CocoaPods는 정적 라이브러리 정적 라이브러리와 프레임 워크를 대체합니다. 귀하의 Objective-C
전송 될 의존적으로 통합 모듈의 요구를, 그러나. MBProgressHUD
인가 Objective-C
종속 모듈이 지원되지 않습니다. 다행히도, 다시 MBProgressHUD 따라 증가 스크립트 :modular_headers => true
, CocoaPods 모듈 지원이 추가되었습니다.
4.2 포드 종속 라이브러리
pod install
4.3 새 프로젝트를 열기
open RWPickflavor.xcworkspace
열기 프로젝트보기는 엑스 코드
RWPickflavor 프레임 워크 IceCreamShop - STATER 내부 폴더 다음과 같은 다섯 개 사본에서 4.4 프로젝트를. (폴더 : 범주는이 컨트롤러, 모델, 조회수
, 자료)
RWPickflavor 폴더에 표시는 다음과 같습니다 :
4.5 다음 프로젝트를 열고 RWPickFlavor.xcworkspace
, ▸ 파일을 선택하여 Add Files to “RWPickFlavor”
아래와 같이 프로젝트에 추가 된 다섯 개 개의 새로운 폴더를 추가 ... :
4.6 열기 RWPickFlavor Images.xcassets
삭제, AppIcon
및 logo
이미지.
4.7 프로젝트 RWPickFlavor xcworkspace
, 우리는 것을 확인해야 Main.storyboard
객체가 세 개의 객체 다음 확인 링크에서 올바른 링크는 다음과 같습니다
- 당신의 맛을 선택
- Ice Cream View
- Pick Flavor Data Source
因为拷贝storyboard到不同的工程project, 你需要确认上面的对象的Module都设置为CocoaPod的工程RWPickFlavor. 记得保存Command-S
.
5. 工程IceCreamShop-Stater移除多余文件
- 在文件夹中IceCreamShop-Stater打开工程IceCreamShop.xcworkspace, 删除下面4个文件夹
- Categories
- Controllers
- Models
- Views
-
打开
Info.plist
文件,找到分组Supporting Files group
, 删除行Mainstoryboard file base name
。 -
打开工程中中的
Images.xcassets
, 删除background
images。 -
运行工程,显示的是一个黑屏。
创建Pod的最困难的部分已经完成!恭喜!
6. 创建Github仓库
-
创建一个新的仓库给Framework用
仓库名字为RWPickFlavor,笔者新建的仓库链接如下:
https://github.com/zgpeace/RWPickFlavor -
新建另一个仓库给Podspec用,名字命名为RWPodSpecs,并勾选初始化README。 CocoaPods要求
pod specs repo
至少有一个提交,否则不工作.
链接如下:
https://github.com/zgpeace/RWPodSpecs
7. 设置Podspec
如果没有Podspec, RWPickFlavor
只是一堆文件. Podspec
是CocoaPod
的描述信息. Podspec
包括pod的名字,版本,Git下载地址URL.
你需要为RWPickFlavor
创建创建RWPickFlavor.podspec
. 执行如下命令:
cd ~/yourProjectPath/Libraries/RWPickFlavor
pod spec create RWPickFlavor
open -a Xcode RWPickFlavor.podspec
把RWPickFlavor.podspec
里面的内容,替换为:
Pod::Spec.new do |s|
# 1
s.platform = :ios
s.ios.deployment_target = '12.0'
s.name = "RWPickFlavor"
s.summary = "RWPickFlavor lets a user select an ice cream flavor."
s.requires_arc = true
# 2
s.version = "0.1.0"
# 3
s.license = { :type => "MIT", :file => "LICENSE" }
# 4 - Replace with your name and e-mail address
s.author = { "Keegan Rush" => "[email protected]" }
# 5 - Replace this URL with your own GitHub page's URL (from the address bar)
s.homepage = "https://github.com/TheCodedSelf/RWPickFlavor"
# 6 - Replace this URL with your own Git URL from "Quick Setup"
s.source = { :git => "https://github.com/TheCodedSelf/RWPickFlavor.git",
:tag => "#{s.version}" }
# 7
s.framework = "UIKit"
s.dependency 'Alamofire', '~> 4.7'
s.dependency 'MBProgressHUD', '~> 1.1.0'
# 8
s.source_files = "RWPickFlavor/**/*.{swift}"
# 9
s.resources = "RWPickFlavor/**/*.{png,jpeg,jpg,storyboard,xib,xcassets}"
# 10
s.swift_version = "4.2"
end
8. 创建许可证License
像其它pod, 你需要创建LICENSE许可证文件.
比如拷贝MIT License 的内容, 并保存为文件名为LICENSE — 没有扩展名 — 到路径~/yourProjectPath/Libraries/RWPickFlavor
. 比替换内容里面的年份[year] 和 名字[fullname] !
Choose a License 这是一个特别好的网站,帮助你如何选择一个适合你的开源open-source license.
9. 推送到Git
把Pod推送到远程git,替换掉 [Your RWPickFlavor Git URL]
为你的git地址(比如笔者的https://github.com/zgpeace/RWPickFlavor
).
cd ~/Documents/Libraries/RWPickFlavor
git init
git add .
git commit -m "Initial commit"
git tag 0.1.0
git remote add origin [Your RWPickFlavor Git URL]
git push -u origin master --tags
恭喜你,完成了你的第一个有依赖的Framework。
Last one more thing…
10. 应用你新建的CocoaPod
首先需要把你的Podspec
增加到私有仓库private specs repo
; 这个让CocoaPods找到你安装的pod. 幸运的是, 你已经创建了为Podspec
创建了Git 仓库.
在RWPickFlavor路径下,输入一下命令。替换掉[Your RWPodSpecs Git URL]
为你的Podspec
的路径(比如笔者的为:https://github.com/zgpeace/RWPodSpecs
):
pod repo add RWPodSpecs [Your RWPodSpecs Git URL]
pod repo push RWPodSpecs RWPickFlavor.podspec
上面标示创建了本地的RWPodSpecs
保存在你机器的路径~/.cocoapods
, 并把RWPickFlavor.podspec推送到了里面.
最后在Starter的工程里面,替换掉Podfile
的内容如下:
platform :ios, '12.0'
source 'https://github.com/CocoaPods/Specs.git'
source '[Your RWPodSpecs Git URL Goes Here]'
target 'IceCreamShop' do
pod 'RWPickFlavor', '~> 0.1.0'
pod 'MBProgressHUD', '~> 1.1.0', :modular_headers => true
end
确保替换掉[Your RWPodSpecs Git URL Goes Here]
为你的RWPodSpecs的Git地址(比如笔者的为:https://github.com/zgpeace/RWPodSpecs
). 你不需要包含Alamofire
在Podfile
, 以为依赖以及配置好在RWPickFlavor.podspec
. 你需要增加一行给MBProgressHUD
,这样子可以增加配置信息:modular_headers =>
.
运行
pod install
替换掉AppDelegate.swift
的内容如下:
import UIKit
import RWPickFlavor
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
// MARK: Instance Variables
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
window = UIWindow(frame: UIScreen.main.bounds)
window?.rootViewController = createRootViewController()
window?.makeKeyAndVisible()
return true
}
func createRootViewController() -> UIViewController {
let bundle = Bundle(for: PickFlavorViewController.self)
let storyboard = UIStoryboard(name: "Main", bundle: bundle)
return storyboard.instantiateInitialViewController() ?? UIViewController()
}
}
运行的时候发现错误,重复的Images.xcassets
, XCode 10 以后不能有重复的内容,要不删掉项目的,或者File > Workspace Setting > Build System > Legacy Build System.
最终运行起来:
参考
https://www.raywenderlich.com/5823-how-to-create-a-cocoapod-in-swift
https://stackoverflow.com/questions/15331056/library-static-dynamic-or-framework-project-inside-another-project
https://www.vadimbulavin.com/static-dynamic-frameworks-and-libraries/
https://stackoverflow.com/questions/50718018/xcode-10-error-multiple-commands-produce