製作 Swift 和 Objective-C Mixed 的 Pod

發表於2017-01-23
  • 知識背景
    1. What is CocoaPods
    2. What did CocoaPods do?

      In Xcode, with references directly from the ruby source, it:

      1. Creates or updates a workspace.
      2. Adds your project to the workspace if needed.
      3. Adds the CocoaPods static library project to the workspace if needed.
      4. Adds libPods.a to: targets => build phases => link with libraries.
      5. Adds the CocoaPods Xcode configuration file to your app’s project.
      6. Changes your app’s target configurations to be based on CocoaPods’s.
      7. Adds a build phase to copy resources from any pods you installed to your app bundle. i.e. a ‘Script build phase’ after all other build phases with the following:
        • Shell: /bin/sh
        • Script: ${SRCROOT}/Pods/PodsResources.sh

大意是,CocoaPods是一個依賴管理工具,使用CocoaPods可以自動的去分析依賴,然後通過指令碼去將第三方依賴複製編譯為靜態庫然後連結進專案。~~~等。

  • 製作Pod

有時候我們有把程式碼做成一個輪子給別人用情況,我們需要按照官方的教程Making CocoaPods去製作。

教程分為2類 :

  1. 釋出公共Pod給所有開發者使用。
  2. 製作私有Pod。 方法較為簡單。自行查閱資料即可。這裡不再贅述。

  • Swift和Objective-C Mixed

參考官方的文件(文末指出),混編裡面包含有2種呼叫情況:

Question1. Swift呼叫Objective-C
Question2. Objective-C呼叫Swift

這裡我新建一個專案 命名為Mixed(Single View Application), 建立一個資料夾Classes用於存放原始碼
建立一個Objective-C Class O 繼承自NSObject 建立一個Swift Class S 繼承自NSObject

  • Answer1: 為Swift原始碼新增一個 XXX.h標頭檔案這裡為Mixed-Bridging-Header 在這個檔案中匯入需要訪問的Objective-C 原始碼的標頭檔案。

11239184-ba2903eb5c703c52

headerConfig

有時候Xcode反應會稍微延遲一點。手動編譯一下即可。做完這個配置,Swift即可訪問Objective-C 原始碼。
程式碼如圖:

12239184-1f13564ff56abf01

swiftAccessObjc
  • Answer2: Objective-C 訪問Swift原始碼 需要匯入系統為專案生成的標頭檔案,預設為Module+Swift.h 當然自己也是可以修改的, 匯入之後,編譯一下(Xcode有時候有快取,沒事就應該編譯一下?)
    具體程式碼配置如圖

    13239184-3cd5672da56810f4

    ObjcAccessSwift

至此混編專案測試完成。

  • 製作Pod 建立Mixed.podspec檔案 鍵入如下內容

接下來可使用Cocoapods提高的命令列工具 pod spec lint Mixed.podspec 去校驗,但是這個方法需要完整的去編譯所有專案去檢測,在我的電腦需要編譯很久,我一般都習慣直接安裝測試。

按照如下資料夾格式存放 並提交到私有倉庫

14239184-0b9184016b88828d

podSpecSource

接下來新建一個測試工程MixedTest 在Podfile裡面輸入

然後進行pod install,完成之後編譯然後不出意外的編譯出錯(????)

15239184-05e1803bfc57d270

compile Error

接下來進行分析錯誤,由於Swift只支援動態庫(並非完全意義的動態庫),所以我們的程式碼在Pod之後實際上是一個動態的Framework,在這個名為Mixed的FrameWork裡面,Objectice-C原始碼是存放在Mixed的名稱空間,所以不需要Mixed-Bridging-Header.h也是可以的。而且也能正常的訪問。所以問題出現在Objective-C呼叫Swift的部分。 由於Swift是有名稱空間的概念的。製作之後的Mixed-Bridging-Header位於Mixed的名稱空間內。由於CocoaPods對原始碼做的操作只是簡單的複製。並不能修改原始碼。我們就需要在源頭做手腳。 修改源工程的設定

16239184-d114bddd19adf133

newSetting

編譯通過,然後更新Mixed.podspec檔案然後重新提交 重新安裝 這時候編譯MixedTest專案,發現雖然檔案找到了但是還報錯。

17239184-e67ec915dcbacf7a

undefineIdtntify

進入Mixed-Swift.h檔案後發現除了一些系統的定義,並沒有找到我們定義的Swift程式碼。 經查詢資料得知,Swift的預設訪問許可權是internal,這個訪問許可權是無法被外部訪問的,所以需要修改被Objective-C訪問到的Swift原始碼相關的訪問許可權為Public(Swift2.3) 或者open/public(Swift3.x)。 至此提交,安裝,編譯通過。

相關文章