<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          教你實現(xiàn)一個 iOS 重簽名工具

          共 4730字,需瀏覽 10分鐘

           ·

          2022-06-15 09:04

          ????關(guān)注后回復(fù) “進群” ,拉你進程序員交流群????

          一. 前言

          對于 iOS 開發(fā)者來說,重簽名技術(shù)應(yīng)該說是比較熟悉的,而且重簽名的實現(xiàn)腳本網(wǎng)上已經(jīng)有很多,實現(xiàn)邏輯上基本也差不多,其中不乏像 iOS App Signer[1] 這樣優(yōu)秀的重簽名工具。

          但是,由于不同的業(yè)務(wù)場景下,不同證書和不同包體的重簽名目的都不一樣,很難一個工具滿足所有開發(fā)者的需求。目前團隊的測試流程是對游戲包重簽名后,再安裝到測試設(shè)備上進行測試,在日常的重簽打包工作下,發(fā)現(xiàn)部分游戲包在重簽名后存在一些問題(安裝不上,某些權(quán)限功能不能用等),而用 Xcode 進行 Archive 操作后在 Xcode Organizer 中導(dǎo)出的包體不會出現(xiàn)異常。

          所以采用 Xcode 的 xcodebuild  命令的 -exportArchive 指令來進行重簽名,發(fā)現(xiàn)重簽名的成功率和包體穩(wěn)定性提高了很多。

          二. iOS 簽名機制

          在了解重簽名之前,我們先來了解一下 ipa 包的簽名機制

          1. 開發(fā)者 Mac 系統(tǒng)中生成一對非對稱加密算法的公私鑰 M,將公鑰和開發(fā)者信息生成 CSR 文件給到蘋果服務(wù)器
          2. 蘋果有自己的公私鑰 K,其中公鑰 K 存在每一臺的 iPhone 設(shè)備上,私鑰 K 則保存在蘋果服務(wù)器。根據(jù) CSR 內(nèi)容利用私鑰 K 進行簽名并生成證書,同時也根據(jù)在開發(fā)者后臺填寫的信息(Bundle ID,權(quán)限等)和證書生成描述文件(mobileprovision)
          3. 在開發(fā)者設(shè)備上打包時,會把描述文件一并打包到 ipa 中,并利用私鑰 M 對包的內(nèi)容進行簽名
          4. 在安裝到設(shè)備上時,會進行兩次驗證:
            1. 利用設(shè)備上的公鑰 K 校驗 ipa 包內(nèi)的證書文件(證書是通過蘋果私鑰 K 簽名),校驗證書是否有效
            2. 上一步證書校驗通過后,會拿出證書內(nèi)的公鑰 M 來校驗 ipa 包(ipa 包是通過開發(fā)者私鑰 M簽名),校驗 ipa 包是否可安裝

          蘋果通過以上的雙重驗證機制,來確保在開發(fā)階段 App 的安裝行為的合法性。當(dāng)將 App 提交到 App Store 后,蘋果會對 App 重新加密簽名,安裝時就只需驗證蘋果的簽名。

          三. 重簽名腳本

          重簽名的流程大致可以分成以下 5 個步驟,下面列出其中的關(guān)鍵命令:

          #!/bin/sh
          set -e

          #
           這里只列出重簽名腳本的大致流程
          # 基本可以分為以下 5 個步驟


          #
           1. 解壓游戲包,刪除包內(nèi)無用內(nèi)容(.DS_Store,__MACOSX等),如需要,修改Info.plist參數(shù)和圖標(biāo)等資源
          unzip "ipa路徑" -d "目標(biāo)路徑"
          find -d "解壓后的路徑" -name .DS_Store -o -name __MACOSX | xargs rm -rf


          #
           2. 對需要重簽的內(nèi)容并重簽名
          find -d "包體路徑" \
          -name "*.app" -o \
          -name "*.appex" -o \
          -name "*.framework" \
          -o -name "*.dylib" \
          | xargs -I {} /usr/bin/codesign --continue -f -s "證書名稱" {}


          #
           3. 找出 appex 里面的 bundle id
          find -d "包體路徑" -name "*.appex" \
          | xargs -I {} /usr/libexec/PlistBuddy -c "Print :'CFBundleIdentifier'" {}/Info.plist


          #
           4. 修改 xcarchive 模板信息
          #    復(fù)制 .app 文件到 xcarchive 的 Products/Applications 目錄下
          #    修改 xcarchive 內(nèi)的 Info.plist 和 ExportOptions.plist 包名,證書名稱,描述文件名稱等信息


          #
           5. 導(dǎo)出ipa包
          xcodebuild -exportArchive \
          -archivePath "xcarchive路徑" \
          -exportOptionsPlist "ExportOptions.plist路徑" \
          -exportPath "導(dǎo)出路徑"

          1. 解壓 ipa 并修改包內(nèi)容

          • 刪除包體內(nèi)無用文件(.DS_Store,__MACOSX 等系統(tǒng)文件)
          • 讀取并修改 Info.plist 參數(shù)(Bundle ID,版本號,應(yīng)用名稱等信息)
          • 如需要,可修改包內(nèi) icon 等資源文件

          2. codesign 命令重簽名

          這一步與其他的重簽?zāi)_本有點不一樣,以 iOS App Signer 的邏輯為例,需要先將 mobileprovision 復(fù)制到包內(nèi)改名為 embedded.mobileprovision,并從中提取 Entitlements 相關(guān)參數(shù)作為 codesign 的參數(shù)來重簽的。

          現(xiàn)在的流程是:不需要手動去替換包內(nèi)的 embedded.mobileprovision 文件,因為后續(xù)的 xcodebuild -exportArchive 命令執(zhí)行時會自動完成替換,所以 codesign 命令也是不需要 --entitlements 參數(shù)的。

          3. 讀取 appex 的 Bundle ID

          appex 是什么?appex 其實就是 Plugins 目錄下的內(nèi)容,是 App 的插件(Extension),像 VPN、通知等功能的包就需要插件來實現(xiàn)。

          一個 appex 其實可以理解為一個小型 App(只是需要依賴 App 才能運行),所以如果有開發(fā)過 Extension 功能的同學(xué)就會知道,Appex 也是會有獨立的證書、描述文件和 Info.plist。所以這一步需要讀取所有 Appex 的 Bundle ID,因為后續(xù)的簽名需要用到。

          4. 修改 xcarchive 內(nèi)容

          根據(jù)最后一步的 xcodebuild -exportArchive 命令,我們需要傳一個 xcarchive 路徑和 ExportOptions.plist 路徑。( xcarchive 就是我們在 Xcode -> Product -> Archive 的產(chǎn)物。)

          xcarchive 路徑下的內(nèi)容:

          • BCSymbolMaps:符號文件 ,Xcode 對 BitCode 符號表進行混淆(Symbol Hiding)后生成的對照表,和 dSYM 文件會一一對應(yīng)。
          • dSYMs:存儲此次編譯的符號表(debug symbols),用來符號化解析崩潰堆棧。
          • Info.plist:xcarchive 的信息
          • Products:存儲此次編譯生成的的 App 包(.app)。
          • SCMBlueprint:如果 Xcode 打開了版本管理(Preferences -> Source Control -> Enable Source Control),SCMBlueprint 文件夾會存儲此次編譯的版本控制信息,包括使用的 git 版本、倉庫、分支等。
          • SwiftSupport:如果你在 Target 的 Build Settings 中打開了 ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES,此次編譯使用的 Swift 版本對應(yīng)的標(biāo)準(zhǔn)庫文件(.dylib)會被放到這個文件夾中。

          首先,我們需要替修改目錄下 Info.plist 的參數(shù),并且把 Products/Applications 下的 app 文件替換為需要重簽名的 App。

          另一個 ExportOptions.plist 文件是我們導(dǎo)出 ipa 包的所需要參數(shù),也是使用 Xcode 導(dǎo)出 ipa 包時的產(chǎn)物之一。

          ExportOptions.plist 文件內(nèi)容需要修改以下字段:

          5. 重簽名并導(dǎo)出 ipa

          最后,只需要把 xcarchive 目錄和 ExportOptions.plis 的內(nèi)容修改成需要重簽名包的內(nèi)容,就可以利用 xcodebuild -exportArchive 命令來重簽名和導(dǎo)出包體。

          四、總結(jié)

          其實現(xiàn)在網(wǎng)上已經(jīng)有非常多優(yōu)秀 iOS 重簽名腳本,基本能滿足大多數(shù)開發(fā)者使用。但是如果希望保證重試的成功率,與 Xcode 打包一樣準(zhǔn)確的話,使用 xcodebuild -exportArchive 構(gòu)建 ipa 包顯然是目前最優(yōu)的解決方案。

          以上就是我們內(nèi)部現(xiàn)在使用的重簽?zāi)_本的實現(xiàn)思路,為了方便大家了解詳細的實現(xiàn)思路,小編也根據(jù)這個邏輯寫了一個 Mac 版的重簽工具,方便學(xué)習(xí)同時也能直接使用。最后,歡迎大家來使用和提出建議~~

          • 37iOS/Easy-Signer: iOS App 的 Mac 重簽名工具[2]

          五、參考

          • DanTheMan827/ios-app-signer[3]
          • iOS應(yīng)用安全3 -- APP重簽名 - 掘金[4]
          • iOS自動化打包之重簽名導(dǎo)出不同證書ipa探索 - 簡書[5]

          參考資料

          [1]

          iOS App Signer: https://github.com/DanTheMan827/ios-app-signer

          [2]

          37iOS/Easy-Signer: iOS App 的 Mac 重簽名工具: https://github.com/37iOS/Easy-Signer

          [3]

          DanTheMan827/ios-app-signer: https://github.com/DanTheMan827/ios-app-signer

          [4]

          iOS應(yīng)用安全3 -- APP重簽名 - 掘金: https://juejin.cn/post/6844904098030944264#heading-18

          [5]

          iOS自動化打包之重簽名導(dǎo)出不同證書ipa探索 - 簡書:https://www.jianshu.com/p/927aee0d1275

          作者:crazyball

          https://juejin.cn/post/7049696230309363725

          -End-
          最近有一些小伙伴,讓我?guī)兔φ乙恍?nbsp;面試題 資料,于是我翻遍了收藏的 5T 資料后,匯總整理出來,可以說是程序員面試必備!所有資料都整理到網(wǎng)盤了,歡迎下載!
          點擊??卡片,關(guān)注后回復(fù)【面試題】即可獲取
          在看點這里好文分享給更多人↓↓
          瀏覽 21
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  牛牛AV | 环亚无码 | 五月天综合网站 | qyle成人在线视频 | 看免费中国黄色视频 |