日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOS应用构建小结

發(fā)布時(shí)間:2024/3/24 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS应用构建小结 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

注:本文首發(fā)于我的個(gè)人博客:https://evilpan.com/2019/04/06/ios-basics/

上篇文章介紹了Objective-C的基本概念,本文就來接著看如何創(chuàng)建我們的第一個(gè)簡單iOS應(yīng)用,
本著簡單可復(fù)現(xiàn)的方式,我們會(huì)以盡可能小的成本來構(gòu)建并在真機(jī)運(yùn)行iOS應(yīng)用。 也就是說,
不用越獄, 也無需開發(fā)者賬號。當(dāng)然,一臺iPhone手機(jī)還是需要的,為了方便編譯最好還有macOS環(huán)境。

Xcode

iOS的應(yīng)用必須要用Xcode來創(chuàng)建,步驟很簡單:

  • 下載并打開Xcode
  • 選擇ios -> Single View Application
  • 填寫項(xiàng)目名、開發(fā)組、包名(Identifier)
  • 項(xiàng)目創(chuàng)建成功后,目錄結(jié)構(gòu)如下:

    $ tree HelloWorld/ HelloWorld/ ├── HelloWorld │?? ├── AppDelegate.h │?? ├── AppDelegate.m │?? ├── Assets.xcassets │?? │?? ├── AppIcon.appiconset │?? │?? │?? └── Contents.json │?? │?? └── Contents.json │?? ├── Base.lproj │?? │?? ├── LaunchScreen.storyboard │?? │?? └── Main.storyboard │?? ├── Info.plist │?? ├── ViewController.h │?? ├── ViewController.m │?? └── main.m └── HelloWorld.xcodeproj├── project.pbxproj├── project.xcworkspace│?? ├── contents.xcworkspacedata│?? ├── xcshareddata│?? │?? └── IDEWorkspaceChecks.plist│?? └── xcuserdata│?? └── pan.xcuserdatad│?? └── UserInterfaceState.xcuserstate└── xcuserdata└── pan.xcuserdatad├── xcdebugger│?? └── Breakpoints_v2.xcbkptlist└── xcschemes└── xcschememanagement.plist

    可以看到項(xiàng)目下有兩個(gè)文夾,分別是源代碼文件HelloWorld,以及工程文件HelloWorld.xcodeproj。
    作為示例,我們可以修改ViewController.m文件,如下:

    #import "ViewController.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view, typically from a nib.// 創(chuàng)建控件UILabel* label = [[UILabel alloc]init];label.text = @"Hello World";// 自適應(yīng)大小[label sizeToFit];// 居中l(wèi)abel.center = self.view.center;// 添加控件[self.view addSubview :label]; }@end

    這樣,一個(gè)Hello World小程序就完成了,左上角運(yùn)行按鈕,即可編譯并在模擬器中運(yùn)行,如下:

    [imgSim.jpg][imgSim]

    在源代碼框下方Products區(qū)域也能看到編譯出的HelloWorld.app。
    是不是很簡單?好我們今天的文章就這樣結(jié)束了,... 才怪!

    命令行編譯

    為了更好地了解編譯過程,我們可以脫離Xcode IDE,在命令行編譯該項(xiàng)目:

    首先,在項(xiàng)目目錄中查看Schemes:

    $ xcodebuild -list -project HelloWorld.xcodeproj Information about project "HelloWorld":Targets:HelloWorldBuild Configurations:DebugReleaseIf no build configuration is specified and -scheme is not passed then "Release" is used.Schemes:HelloWorld

    然后,選擇一個(gè)scheme進(jìn)行編譯,這里是HelloWorld:

    $ xcodebuild -scheme HelloWorld build note: Using new build system note: Planning build note: Using build description from disk Build system information error: Signing for "HelloWorld" requires a development team. Select a development team in the project editor. (in target 'HelloWorld')** BUILD FAILED **

    凹,編譯失敗了,簽名出錯(cuò),因?yàn)槿f惡的資本主義壞蘋果要求必須要每年99$或者299$去購買
    Apple Developer Program 會(huì)員資格才能對應(yīng)用進(jìn)行合法簽名,從而發(fā)布并運(yùn)行我們創(chuàng)建的app。

    但是這里寫的這個(gè)簡單APP只需要在我自己的手機(jī)上運(yùn)行,所以并不需要這一步,禁用簽名進(jìn)行編譯即可:

    $ xcodebuild -scheme HelloWorld build CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO Build settings from command line:CODE_SIGN_IDENTITY =CODE_SIGNING_REQUIRED = NOnote: Using new build system note: Planning build note: Constructing build description Build system information warning: HelloWorld isn't code signed but requires entitlements. It is not possible to add entitlements to a binary without signing it. (in target 'HelloWorld') ... Validate /Users/pan/Library/Developer/Xcode/DerivedData/HelloWorld-dnyjqrgxcjjobvfzytzhtzpmjlmx/Build/Products/Debug-iphoneos/HelloWorld.app (in target: HelloWorld) ... Touch /Users/pan/Library/Developer/Xcode/DerivedData/HelloWorld-dnyjqrgxcjjobvfzytzhtzpmjlmx/Build/Products/Debug-iphoneos/HelloWorld.app (in target: HelloWorld) ... ** BUILD SUCCEEDED **

    編譯成功了!中間省略了很多輸出信息,這里就不貼了。值得一提的是,生成的app并不是在當(dāng)前項(xiàng)目目錄下,
    而是在$HOME/Library/Developer/Xcode/DerivedData/$PROJECT-xxxx/{...}/HelloWorld.app中,
    xxxx看起來是一段隨機(jī)數(shù)。HelloWorld.app就是一個(gè)傳統(tǒng)的蘋果應(yīng)用,其目錄結(jié)構(gòu)如下:

    $ tree HelloWorld.app HelloWorld.app ├── Base.lproj │?? ├── LaunchScreen.storyboardc │?? │?? ├── 01J-lp-oVM-view-Ze5-6b-2t3.nib │?? │?? ├── Info.plist │?? │?? └── UIViewController-01J-lp-oVM.nib │?? └── Main.storyboardc │?? ├── BYZ-38-t0r-view-8bC-Xf-vdC.nib │?? ├── Info.plist │?? └── UIViewController-BYZ-38-t0r.nib ├── HelloWorld ├── Info.plist └── PkgInfo

    其中HelloWorld就是ARM64的Mach-O文件:

    $ file HelloWorld.app/HelloWorld HelloWorld.app/HelloWorld: Mach-O 64-bit executable arm64

    模擬器

    iOS模擬器除了可以在Xcode啟動(dòng),也可以通過命令行進(jìn)行管理,如:

    xcrun simctl help

    查看具體幫助:

    $ xcrun simctl help install Install an app on a device. Usage: simctl install <device> <path>

    例如,我們要想在模擬器中啟動(dòng)上節(jié)編譯好的HelloWorld.app,可以用以下命令:

    # 查看當(dāng)前設(shè)備列表,選擇一個(gè)設(shè)備UDID xcrun simctl list devices # 打開并啟動(dòng)設(shè)備 open -a Simulator --args -CurrentDeviceUDID $UDID # 在啟動(dòng)的設(shè)備中安裝我們的應(yīng)用,注意需要app支持x86架構(gòu) xcrun simctl install booted /path/to/HelloWorld.app

    關(guān)于simctl的更多使用示例可以參考這篇文章。

    簽名與ipa

    上節(jié)說到我們可以不簽名來編譯APP,但對于真機(jī)而言,要想運(yùn)行應(yīng)用,簽名是必須的。
    在Xcode7以后,開發(fā)者可以只用自己的Apple ID來在自己的設(shè)備上運(yùn)行iOS應(yīng)用,設(shè)置如下:

    [imgSign.jpg][imgSign]

    這樣就可以通過USB在物理機(jī)上運(yùn)行iOS應(yīng)用了,不過要注意的是第一次啟動(dòng)時(shí)會(huì)提示不可信的開發(fā)者,
    需要到設(shè)置-通用中進(jìn)行信任。

    什么是ipa

    iOS應(yīng)用與Android應(yīng)用類似的一點(diǎn)是,最后安裝到系統(tǒng)中的都是一個(gè)zip壓縮包,對于Android而言后綴是apk,
    而對于iOS而言則是ipa(iPhone Application Archive)。通常ipa會(huì)通過蘋果加密(使用FairPlay DRM技術(shù))。
    所以一般我們想從手機(jī)上已經(jīng)安裝的應(yīng)用還原出ipa需要先解密,也通常稱為砸殼。

    常見的解密方法有如下幾種:

    • Clutch- Fast iOS executable dumper
    • dumpdecrypted - Dumps decrypted mach-o files from encrypted iPhone applications from memory to disk
    • frida-ios-dump

    當(dāng)然這些都是需要越獄的,在非越獄的機(jī)器上可以通過iMazing提取,熱門應(yīng)用可以直接在第三方應(yīng)用商店下載,
    比如AppCake。

    ipa打包

    對于有源碼的應(yīng)用,我們可以使用Xcode進(jìn)行打包,打包流程可以參考stackoverflow中的一個(gè)回答。
    不過這需要有開發(fā)者賬號。由于我們是自己使用,因此要找一種無需開發(fā)者賬號的方法。

    無需開發(fā)者賬號的打包方式有很多,比如:

    • How to create ipa in xcode 6 without Apple Developer account?
    • Export an IPA From Xcode Without an Apple Developer Account

    這里使用命令行方式進(jìn)行打包(archive&export):

    # archive xcodebuild archive -project HelloWorld/HelloWorld.xcodeproj -scheme HelloWorld -configuration Debug -archivePath ./build/HelloWorld# export xcodebuild -exportArchive -archivePath ./build/HelloWorld.xcarchive -exportOptionsPlist exportOptions.plist -exportPath ./build

    這樣就在./build目錄下生成HelloWorld.ipa包了。其中exportOptions.plist如下:

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict><key>method</key><string>development</string> </dict> </plist>

    詳細(xì)exportOptions的key/value值可以通過xcodebuild -help查看。

    ipa安裝

    無需AppStore的ipa的安裝方法有下面幾種(歡迎補(bǔ)充):

    • 使用Apple Configurator 2 工具(只支持MacOS)
    • 使用Xcode安裝
    • 使用OTA部署方式安裝
    • 其他

    使用Apple Configurator 2

    Apple Configurator 2是蘋果公司提供的一個(gè)部署和配置工具,可以直接從AppStore下載。
    USB連接蘋果手機(jī)后打開工具,圖形界面操作,依次選擇:

    Add -> Apps -> Choose from my Mac

    然后點(diǎn)擊生成的ipa文件即可。不是很推薦這個(gè)工具,如果一定要用圖形界面,還不如用下面的Xcode。

    使用Xcode

    同樣是圖形界面操作,USB連接手機(jī)后依次選擇:

    Window -> Devices and Simulators -> Devices

    選擇自己的手機(jī)后,點(diǎn)擊+添加或者直接把ipa文件拖拽進(jìn)來即可。

    OTA部署

    OTA部署支持使用HTTPS的方式部署和分發(fā)你的ipa包,一個(gè)示例OTA鏈接地址如下:

    itms-services://?action=download-manifest&url=https://example.com/ota.plist

    itms-services是蘋果上的自定義協(xié)議,會(huì)根據(jù)action下載并處理目標(biāo)plist文件,
    ota.plist內(nèi)容如下:

    <plist version="1.0"><dict><key>items</key><array><dict><key>assets</key><array><dict><key>kind</key><string>software-package</string><key>url</key><string>https://example.com/app.ipa</string></dict></array><key>metadata</key><dict><key>bundle-identifier</key><string>com.evilpan.helloworld</string><key>bundle-version</key><string>1</string><key>kind</key><string>software</string><key>title</key><string>一個(gè)有趣的APP</string></dict></dict></array></dict> </plist>

    解析后會(huì)從https://example.com/app.ipa下載應(yīng)用,用戶點(diǎn)擊確定即可安裝。
    這里注意不論是ota.plist還是app.ipa的地址都是強(qiáng)制要求為HTTPS的,
    因此若想以這種形式安裝,還必須要去注冊一個(gè)合法的SSL證書,也可以用免費(fèi)的。

    由于AppStore審核很嚴(yán)格,很多私人用的或者不合規(guī)的iOS軟件都是通過OTA部署的形式分發(fā)的,
    并且在會(huì)在安裝說明中指引用戶去設(shè)置->通用->描述文件與設(shè)備管理中手動(dòng)點(diǎn)擊信任該個(gè)人/企業(yè)開發(fā)者。

    其他

    除了上述方式,還有一些開源腳本可以幫助我們安裝部署自己的應(yīng)用,如ios-deploy,
    只要連接USB輸入以下命令即可安裝:

    $ ios-deploy -b HelloWorld.ipa [....] Waiting for iOS device to be connected ------ Install phase ------ ... [ 65%] InstallingEmbeddedProfile [ 70%] VerifyingApplication [ 75%] CreatingContainer [ 80%] InstallingApplication [ 85%] PostflightingApplication [ 90%] SandboxingApplication [ 95%] GeneratingApplicationMap [100%] Installed package HelloWorld.ipa

    有點(diǎn)類似于Android的adb install,相當(dāng)方便。個(gè)人建議直接使用源碼編譯而不是npm安裝。

    后記

    本文從開發(fā)者的角度,介紹了iOS應(yīng)用創(chuàng)建、編譯、打包、測試、部署等方面,
    從零開始構(gòu)建并運(yùn)行我們的第一個(gè)iOS程序。 既介紹了模擬器的安裝測試方式,
    也介紹了物理機(jī)上的打包和部署過程。其中很多地方盡可能的使用命令行去運(yùn)行,
    這有利于后續(xù)自動(dòng)化的操作,也有利于我們理解各個(gè)選項(xiàng)所使用到的參數(shù)作用。

    為了降低工作量,我們特地在沒有越獄以及沒有開發(fā)者賬號的情況下完成上述操作。
    下一篇,我們將嘗試從攻擊者的角度,實(shí)際“破解”一個(gè)iOS應(yīng)用,Stay Tuned!

    參考鏈接

    • iOS builds / ipa creation from the command line
    • Setting up Frida Without Jailbreak on devices running iOS 12.1.4
    • AppCake - Third party ipa download
    • dumpdecrypted - Dumps decrypted mach-o files from encrypted iPhone applications from memory to disk
    • Clutch- Fast iOS executable dumper
    • frida-ios-dump
    • insert_dylib
    • Non-market App Distribution - Monaca Docs

    imgSim: https://img2020.cnblogs.com/blog/676200/202003/676200-20200307215659162-1061114665.png
    imgSign: https://img2020.cnblogs.com/blog/676200/202003/676200-20200307215715098-769151084.png

    總結(jié)

    以上是生活随笔為你收集整理的iOS应用构建小结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。