一步步創建自己的 iOS 框架

来源:http://www.cnblogs.com/8hao/archive/2016/03/04/5241899.html
-Advertisement-
Play Games

創建你的第一個iOS框架 如果你曾經試圖去創建一個自己的iOS框架的話,你應該知道這件事並不是那些畏懼困難的人能夠成功完成的-畢竟管理依賴和編寫測試並不容易。這篇文章將從開始到最終完成一步步的進行講解,以便你掌握後可以更好的創建自己的框架。 在教程中我們會構建一個框架,框架裡面會暴露一個名為RGBU


創建你的第一個iOS框架

如果你曾經試圖去創建一個自己的iOS框架的話,你應該知道這件事並不是那些畏懼困難的人能夠成功完成的-畢竟管理依賴和編寫測試並不容易。這篇文章將從開始到最終完成一步步的進行講解,以便你掌握後可以更好的創建自己的框架。

在教程中我們會構建一個框架,框架裡面會暴露一個名為RGBUIColor(red:green:blue)的函數,該函數會返回使用這些參數創建的UIColor對象。我們會使用Swift語言,並且使用Carthage作為依賴項的管理工具。我們的框架將會支持通過CarthageCocoaPods或者git來使用。

讓我們開始吧!

創建Xcode工程

  1. 選擇 File -> New -> Project
  2. 在左側的選擇 iOS -> Framework & Library,右側選擇“Cocoa Touch Framework”。
  3. 點擊“下一步”,並填寫選項提示。確保以及勾選了“Include Unit Tests”。
  4. 選擇工程保存的位置。
  5. 不要勾選“Create Git repository on My Mac”,我們在後面手動進行設置。
  6. 點擊“創建”並且打開工程。
  7. 選擇File -> Save As Workspace並使用工程相同的名字保存到相同的目錄中。之所以創建workspace是因為我們需要添加Carthage中的依賴作為子模塊;使用Xcode
    編譯他們的時候必須是在一個workspace中。
  8. 選擇File -> Close Project關閉工程。
  9. 然後選擇File -> Open打開*workspace*文件。
  10. Xcode左上角的scheme並選擇“Manage Schemes”。我們需要確保sheme勾選了“shared”,以便能使用“Carthage”來構建工程

初始化git

首先,切換到工程所在的目錄。

  1. 運行git init初始化空版本庫。
  2. 創建一個 .gitignore的文件。該文件會過濾一些Xcode或者依賴文件中一些我們不想也不需要上傳的文件。

這裡是一個標準的Swift工程的gitignore文件,我們只是添加了.DS_Store並移除了fastlane和一些多餘的部分。

   
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 ## OS X Finder .DS_Store   ## Build generated build/ DerivedData   ## Various settings *.pbxuser !default.pbxuser *.mode1v3 !default.mode1v3 *.mode2v3 !default.mode2v3 *.perspectivev3 !default.perspectivev3 xcuserdata   ## Other *.xccheckout *.moved-aside *.xcuserstate *.xcscmblueprint   ## Obj-C/Swift specific *.hmap *.ipa   # Swift Package Manager .build/   # Carthage Carthage/Build

 

添加Carthage和依賴項

  1. 在工程的文件目錄下創建一個名為Cartfile的文件以及運行時的依賴性。我們添加**Curry]**([鏈接)

    github "thoughtbot/Curry"

  2. 創建一個名為Cartfile.private的文件。它會負責私有的一些依賴就像我們的測試框架一樣。我們使用QuickNimble

     

       
    1 2 github "Quick/Quick" github "Quick/Nimble"

     

  3. 新建bin/setup腳本。它可以提供一個簡單的方式來處理依賴和工程,無論時對於貢獻者還是我們自己。

     

       
    1 2 3 mkdir bin touch bin/setup chmod +x bin/setup

     

  4. 打開bin/setup並將一下代碼加入:

     

       
    1 2 3 4 5 6 7 #!/usr/bin/env sh    if ! command -v carthage > /dev/null; then        printf 'Carthage is not installed.n'        printf 'See https://github.com/Carthage/Carthage for install instructions.n'    exit 1    fi      carthage update --platform iOS --use-submodules --no-use-binaries

     

在這個腳本裡面,我們假設用戶一句安裝了Carthage鏈接,然後我們使用update命令來安裝那些依賴項。

我們使用–use-submodules,所有那些依賴項會以子模塊的方式被添加。當用戶需要的時候,他就可以直接使用我們的框架而不需要使用Carthage。我們使用了–no-use-binaries,所有這些依賴項都會在我們自己的系統上進行編譯。

bin/setup建好後,我們直接在終端運行腳本讓Cartfile自行下載依賴項。

現在我們就可以設置我們的工程並且編譯這些依賴項了。

添加依賴到工作區

因為我們的依賴是作為子模塊,我們需要將這些自模塊添加到工作區。

1.打開Carthage/Checkouts然後將每個依賴項的.xcodeproj添加到工作區。你可以使用直接拖拽到項目的工作區。

添加完結束後:

鏈接運行時依賴

  1. 在工作區的導航欄選擇”RGB” ,然後在中間選擇”RGB”目標,進而選擇”Build Phases”,展開”Link binary with libraries”。
  2. 點擊”+”然後選擇Curry.framework框架的Curry-iOS
  3. 點擊添加。

鏈接開發依賴項

  1. 在中間的工具欄選擇”RGBTests”。
  2. 使用上面一樣的步驟,將”Quick”和”Nimble”框架添加到”Link binary with libraries”。
    當我們將依賴添加到兩個目標的時候,Xcode會自動在”Build Settings”下添加”Framework Search Paths”。我們可以在”RGB”和”RGBTests”中移除,因為同處同一工作區, Xcode將他們本身的一部分。
  3. 選擇目標下的兩個目標,選中”Build Settings”下的”Framework Search Paths”,然後按“退格鍵”刪除。
  4. 接下來,在導航欄選擇”RGB”工程的時候,你就會看見下麵you三個剛剛添加的三個框架。然後全選這三個框架,然後右擊選擇”New group from selection”然後將他們放到一個組裡, 我將組命名為”Frameworks”。

現在Carthage已經設置完成,接下來是CocoaPods

添加CocoaPods支持

為了添加CocoaPods支持,我們需要在工程的根目錄新建.podspec,並且包含工程的信息。

  1. 新建RGB.podspec文件。
  2. 將下麵的實例拷貝並複製到文件中(自行對照修改相應的部分)。
  3. 使用項目的信息來設置那些選項。更多的選項詳情鏈接,但是該工程中你所需要的那些選擇如下。

 

   
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Pod::Spec.new do |spec|   spec.name = "RGB"   spec.version = "1.0.0"   spec.summary = "Sample framework from blog post, not for real world use.Functional JSON parsing library for Swift."   spec.homepage = "https://github.com/jakecraige/RGB"   spec.license = { :type => 'MIT', :file => 'LICENSE' }   spec.authors = {     "Jake Craige" => '[email protected]',     "thoughtbot" => nil,   }   spec.social_media_url = "http://twitter.com/thoughtbot"         spec.source = { :git => "https://github.com/jakecraige/RGB.git", :tag => "v#{spec.version}", :submodules => true }   spec.source_files  ="RGB/**/*.{h,swift}"   spec.requires_arc = true   spec.platform     = :ios   spec.ios.deployment_target = "9.1"       spec.dependency "Curry", '~> 1.4.0' end

這裡面需要註意到的一行是spec.dependency “Curry”, ‘~> 1.4.0′。因為我們需要支持CocoaPods,我們假設框架的使用者會使用CocoaPods而不是Carthage
所有我們我們在最後一行也聲明依賴而不僅僅只在Carthfile聲明。

當我們設置好了之後,我們在終端中運行pod lib lint命令測試所有的東西是不是都配置好了。如果沒錯的話,我們能看見如下的提示:

當工程的依賴項設置好後,我們就可以寫代碼了。但是在我們開始之前,先提交代碼。

   
1 git commit -am "Project and dependencies set up"

 

編寫第一個測試

打開RGBTests/RGBTests.swift文件,你可以看見一個預設的模版。她使用了@testableXCTest(,但是接下來我們會作出一些調整。

首先,我們會移除@testable,因為我們需要測試那些框架使用者可能調用的API介面。隨著框架的增長,我們可能會需要@testable去測試那些不是作為公共介面暴露的部分;總的來說,就是我們想避免測試那些暴露給使用者的介面。這個特性在測試應用的時候會更加有效,而不是在框架測試中。

來源於蘋果關於測試部分的文檔:

伴隨者可測試性,你系那種能夠在Swift 2.0框架和應用中編寫測試並且不需要要測試所有的internalpublic部分。在XCTest目標而不是其他框架或者應用的測試代碼中
使用@testable import {ModuleName}

我們使用QuickNimble作測試。Quick提供以一個行為驅動類型的測試介面,與RSpecSpecta非常相近;Nimble給我們提供了強大的斷言以及少量模版就能寫成非同步代碼的能力。

寫完之後,代碼如下:

   
1 2 3 4 5 6 7 8 9 10 11 12 13 import Quick import Nimble import RGB   class RGBTests: QuickSpec {     override func spec() {         describe("RGB") {             it("works") {                 expect(true).to(beTrue())             }         }     } }

使用快捷鍵CMD + U或者Product -> Test運行測試代碼,會顯示測試成功。

所以,到現在已經完成了!

開玩笑而已。讓我們來一些真正的測試。

我們暴露一個RGBUIColor(red: 195, green: 47, blue: 52)調用介面,介面會返回一個漂亮的thoughtbot red的UIColor。

代碼如下:

   
1 2 3 4 5 6 7 8 9 10 11 12 13 describe("RGBUIColor") {     it("is a correct representation of the values") {         let thoughtbotRed = UIColor(             red: CGFloat(195/255),             green: CGFloat(47/255),             blue: CGFloat(52/255),             alpha: 1         )         let color = RGBUIColor(red: 195, green: 47, blue: 52)           expect(color).to(equal(thoughtbotRed))     } }

如果你此時運行此時的話,會像預料中的那樣-失敗。因為Swift語言的類型檢查會組織我們運行一個沒有定義的RGBUIColor函數。接下來讓我們完成它。

編寫實現代碼

右擊RGB選擇新建一個文件。創建一個名為RGBUIColor.swift的文件,並將下麵的代碼拷貝過去。

   
1 2 3 4 5 6 7 8 9 10 11 12 13 14 import Curry   func RGBUIColor(red red: Int, green: Int, blue: Int) -> UIColor {     return curry(createColor)(red)(green)(blue) }   private func createColor(red: Int, green: Int, blue: Int) -> UIColor {     return UIColor(         red: CGFloat(red/255),         green: CGFloat(green/255),         blue: CGFloat(blue/155),         alpha: 1     ) }

這裡使用Curry作為一個運行時的依賴性的例子來使用。這裡採用了一個不標準的使用斌強沒有提供任何值。讓我們繼續測試!

第一眼看過去,我們可能會感到很奇怪。我們明明已經定義了RGBUIColor函數啊?

確實我們定義了該函數但是,我們並沒有將她聲明為public

這意味著,如果有人系有人使用我們的框架的話,他們是不能使用這個函數介面的。如果你想看見什麼不同的話,將@testable添加回來,你會發現你的測試通過了。

通過這個錯誤我們就知道為什麼要在iomport前面將@testable移除。這能讓我們在發佈框架之前更好的捕捉到錯誤。

讓我們將函數聲明為public,來修複這個問題。運行測試,問題解決了。然後我們提交代碼。

   
1 git commit -am "Completed my first iOS framework!"
原文出處: Jake Craige   譯文出處:BNCoding(@BigNerdCoding ) 

問啊-定製化IT教育平臺,牛人一對一服務,有問必答,開發編程社交頭條 官方網站:www.wenaaa.com

QQ群290551701 聚集很多互聯網精英,技術總監,架構師,項目經理!開源技術研究,歡迎業內人士,大牛及新手有志於從事IT行業人員進入!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 自己的學習筆記。
  • 轉載自並做少量添加:http://www.cnblogs.com/playing/archive/2011/04/07/2008620.html Layout對於迅速的搭建界面和提高界面在不同解析度的屏幕上的適應性具有很大的作用。這裡簡要介紹Android的Layout和研究一下它的實現。 Andr
  • 原文出處: codingZero 歡迎分享原創到伯樂頭條 導語 不會使用block的iOS程式員,不是一個合格的程式員學會了block,你再也不想用繁瑣的代理block沒有你想象中的那麼難,不要害怕,不要畏懼,勇敢嘗試筆者入行iOS時已經是ARC的天下,所以這裡只說ARC環境下的使用 什麼是bloc
  • Android Studio 優秀插件系列: Android Studio 優秀插件(一):GsonFormat Android Studio 優秀插件(二): Parcelable Code Generator -------------------------------------------
  • 自己的學習筆記。
  • 一般比較短小的音樂(如游戲中的打鬥、按鍵音效等)則要通過playEffect來播放。
  • 問題 大家都知道,在iOS里的AlertView不會阻塞後續代碼的執行,但如果有時候需要這樣做該怎麼辦呢? 解決方案 通過回調 也就是把後續要執行的代碼放到回調函數中去,可以參見 "UIAlertView Blocks" ,我今天要重點說明的是下麵這種方式。 使用RunLoop 我們都主線程上的Ru
  • 一、概述 隨著Android 6.0發佈以及普及,我們開發者所要應對的主要就是新版本SDK帶來的一些變化,首先關註的就是許可權機制的變化。對於6.0的幾個主要的變化,查看查看官網的這篇文章http://developer.android.com/intl/zh-cn/about/versions/ma
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...