iPhone/iPod development/zh TW

From Free Pascal wiki
Revision as of 08:49, 29 February 2020 by Trev (talk | contribs) (OSX -> macOS)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigationJump to search

English (en) | 한국어 (ko) | 中文(中国大陆)‎ (zh_CN) | 中文(台灣)‎ (zh_TW)

第一版為 iPhone SDK 2.x 製作的 FPC 已經可以完成了.

安裝

環境需求:

  • Intel Mac (因為 iPhone SDK 需要使用 Intel Mac, 如果你的 Mac 是使用 PowerPC 處理器的就得升級囉)
  • 請先安裝 iPhone SDK 2.x (目前只在 SDK 2.2 上面測試過) (備註: iPhone SDK 只能裝在 Leopard 10.5.5 或更新的版本上)
  • 需安裝 FPC 2.2.2 或之後更新的 FPC 2.2.x 版本

一些功能介紹:

  • 支援 iPhone 模擬器
  • Xcode 程式模板可以完全支援, 能在同一個專案裡面整合 Pascal 跟 Objective-C 的程式碼.
  • 包含將 SDK 中的 OpenGL ES 1.1 C 標頭檔轉換為 Pascal 的宣告單元檔: gles11 (這部分我們可以散佈, 因為它的授權是沿用 SGI 開放原始碼的授權條款)

在您提出疑問, 尋求我們的支援前, 請先閱讀 iPhone SDK 磁碟影像檔裡面的 ReadMe.rtf, 該檔案裡面包含相當多有幫助的資訊 (尤其是跟 iPhone 模擬器使用上相關的資訊), 以及在加入額外的 Pascal 程式碼檔案時要怎麼變更內建的模版.

請注意, 這一版 FPC 安裝版本跟其他的 FPC 版本不同, 在這一版中會直接安裝 FPC 的原始碼 (被安裝的 FPC 原始碼的版本是 2.3.1, 在 svn 上面的版本號碼是 12531) 與腳本檔 (script), 並且會呼叫這個腳本檔重新編譯 FPC (您必須先回答 iPhone SDK 安裝路徑, 然後這個腳本檔會自動產生 Pascal 版的單元檔, 作用跟 C 的標頭檔一樣). 這個 modus operandi 是為了要遵守 iPhone SDK 使用協議所必須存在的, 因為它不允許直接散佈從 iPhone SDK 衍生出來的檔案. 如果這個 script 檔執行有甚麼問題, 您可以在 /Developer/FreePascalCompiler/iPhoneSnapshot-2.3.1-r12531/InstallScript/finish_fpc_iphone_install.command 這個路徑中找到它, 把它重新執行一次.


安裝磁碟影像可以在此取得: (21MB -- 只散佈下載連結也是有好處的, server 不用放太多大檔案) ftp://ftp.freepascal.org/fpc/snapshot/v23/arm-macosx/fpc-2.3.1v2.arm-iphone.dmg

安裝的時候, 腳本檔會在結束安裝的時候啟動, 如果您發現關於這個腳本檔的問題, 請您提供當時在終端機視窗中執行該腳本檔出錯的的完整資訊, 這樣我們在協助您的時候會比較容易知道狀況.

蘋果的使用協議限制

開發 iPhone/iPod 應用程式

FPC 開發的應用程式, 仍舊需要一個由 Apple 所簽發的認證, 才能在 iPhone/iPod Tocuh 上面執行. 所以您仍舊得申請 Apple 的 iPhone 開發者計畫 (每年 99 塊美金), 以取得這個認證, 才能讓 FPC 所編譯的程式在真正的硬體裝置上面執行 (由 XCode 所編譯出來的程式也一樣)

沒有這個認證 (這認證就是一個 X.509 格式的檔案, 透過 Apple 的簽署程式, 會在我們寫的程式上面附加一些資訊, 意即數位簽章), 我們所製作的程式編譯完以後, 只能在 iPhone 模擬器上面執行. (當然如果您用了所謂的 Jail-break 程式修改了 iPhone/iPod Touch, 不過這也只能在您自己作了 Jail-break 的機器上面執行而已)

如果您需要更多關於 Apple 的 iPhone 開發者計畫, 請瀏覽這個網址: http://developer.apple.com/iphone/program/

開發程式所需的 Pascal 單元檔/標頭檔

這可能會違反 iPhone SDK 協議規範, 該規範裡限制散佈從 SDK 中所衍生出來的文件, 這也包含了將該架構的標頭檔轉譯為 Pascal 宣告單元檔. 因此在這個時間點上, 要在 iPhone SDK 之外, 獨立建立與散佈這些純 Pascal 的宣告檔, 並附上一個 GUI 程式的確是相當的挑戰. 您可以閱讀一下 ReadMe.rtf, 裡頭有更多的資訊 (ReadMe.rtf 包含在上述的 .dmg 裡面)


開發限制

目前要怎麼作才能不透過 XCode 把應用程式複製到 iPhone/iPod Touch 上面執行, 仍然是未知的問題. 當然, 使用現有的 IDE (像 Lazarus, Lightweight IDE 等) 來開發應用程式的確是可行的, 而要讓這些 IDE 跟 iPhone 模擬器一起運作應該也不無可能. 然而任何應用程式仍然只能透過 XCode 上傳到裝置裡執行與除錯.


iPhone 模擬器不等於 iPhone

iPhone 模擬器使得我們能在標準的 Mac 應用程式中使用 iPhone OS API, 也連帶的使得我們可以模擬裝置上所提供的環境條件. 因為我們的應用程式能夠在 macOS 上面執行了, 模擬器因而提供了我們一個可以不用實際裝置就可以快速測試應用程式的環境. 然而, 在模擬器上面執行應用程式仍然跟直接在裝置上面執行不盡相同.

模擬器使用了跟 macOS 相同版本的 iPhone OS 架構, 跟 iPhone 機器上使用的版本仍舊不完全相同. 大抵來說, 模擬器是開始測試我們應用程式的好工具, 然而請別忘了, 模擬器並沒有模擬裝置的所有功能, 您最後一定得要在實際的裝置上面測試您的應用程式才行. 最主要的原因, 是因為我們的應用程式仍然可以使用 macOS 作業系統所提供的其他架構與功能, 而這些功能可能在裝置上並不存在.

編譯純 Pascal 應用程式並讓它能在 iPhone/iPod Touch 上面執行

純粹的命令列應用程式在 iPhone/iPod Touch 上面執行是沒有問題的, 只不過輸出的結果只能透過 gdb console 來顯示 (如果是從 XCode 來執行或者偵錯的話, 按下 cmd-shift-r 鍵, 或點選 Run-> Console) 或者記錄在裝置上的 console 記錄檔裡面. (如果您直接從 iPhone 上面執行這個應用程式) 萬一是圖形介面應用程式的話, 您或許會需要一些的標頭檔 (由於授權問題, 這些標頭檔不允許被轉譯與散佈), 這些標頭檔就得由您自己來建立了 (可以透過自動化工具來產生, 但別散佈給別人)


我們只使用 Xcode...

  1. 建立使用模板的專案
  2. 移除專案中所有的檔案, 只保留 *Prefix.pch, Info.plist, Frameworks 跟 Products
  3. 加入您自己的 Pascal 原始碼檔案 (Project->Add 可以作到這個動作...)
  4. 雙擊左上角, Xcode 檔案列表裡專案的圖示, 點選 Build 標籤, 然後把 FPC_MAIN_FILE 設定值修改為這個專案的名字 (設定為所有組態都適用).
  5. 建立應用程式

結合命令列編譯指令與 Xcode

如果您使用命令列 (terminal) 來編譯程式 (編譯給 Darwin/ARM 使用), 然後將編譯好的二進位程式檔複製到 Xcode 專案中, 然後如果您在 Xcode裡面 "Run" 這個程式, 它將會簽署這個二進位檔案, 然後執行它, 而不會執行原來編譯好的程式 (只是為了要確定 XCode 裡面的二進位程式是最新的版本, 不至於被 Xcode 重新編譯與連結), 您可以使用預設模板專案, 別改動該專案的任何內容來達到這個目標.

您可以在專案視窗中開啟 Products 資料夾, 裡面就有 Xcode 的二進位檔的位置: 用滑鼠右鍵點擊 (或按住 Ctrl 後點擊) .app 檔案, 然後選擇 "Reveal in Finder". 二進位檔案的位置就在 program.app/Contents/MacOS (program.app則是您實際在 finder 裡面點選的資料夾名稱. 直接以您編譯出來的所有程式覆蓋掉 MacOS 資料夾裡面的所有檔案即可 (例如命令列程式 cp)

要編譯 Darwin/ARM 程式的指令: (請把指令中的 "iphone2.1" 改成您安裝的 SDK 目錄名稱

ppcarm -FD/iphone2.1/Platforms/iPhoneOS.platform/Developer/usr/bin -XR/iphone2.1/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.0.sdk program.pas

要編譯模擬器上面可執行的程式的話, 則將 "ppcarm" 換成 "/usr/local/lib/fpc/2.3.1/ppc386", 而把透過 -XR 這個參數把模擬器 SDK 的路徑傳遞進去 (例如: -XR/iphone2.1/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator2.0.sdk). (寫給進階使用者) 而萬一您建立了自己的 fpc.cfg, 使用了不同的單元檔路徑, 沒有使用預設的路徑 /usr/local/lib/fpc/2.3.1/units/*, 請您要額外使用此參數: -Fu/usr/local/lib/fpc/2.3.1/units/*


編譯純 Pascal 應用程式, 並在 iPhone 模擬器上執行

編譯與連結的動作都需要一個傳統的 ppc386 編譯程式, iPhone 模擬器跟一般的 macOS 應用程式有些不同, 編譯給 iPhone 模擬器的應用程式需要與不同的框架連結.

這些框架包含有 iPhone 專屬的 (UIKit), 其他的框架則是在 macOS 跟 iPhone 作業系統上都共有的 (CoreFoundation, CoreGraphics 等等) iPhone 模擬器 SDK 提供了這些框架的特殊版本. 為了確保這些 SDK 所使用的框架有被使用到, 您必須告知編譯程式使用適當的 SDK (當要編譯放到實際裝置上執行的程式時也一樣):

 fpc simtest.pas -XR/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator2.0.sdk

上述的 /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator2.0.sdk 是 iPhone 模擬器 SDK 的起始目錄.這個目錄取決於您把 iPhone SDK 裝在哪裡.

目前可以使用的 iPhone SDK 有好幾個, 隨著您使用的 SDK 版本不同, 路徑也會隨之有些不同:

  • SDK version 2.0: /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator2.0.sdk
  • SDK version 2.1: /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator2.1.sdk

等等

建立 ARM 交互編譯程式

已開放下載的 FPC/iPhone 包裝中, 包含一個名為 ppcarm 的交互編譯程式, 可以用來建立 iPhone 應用程式. 您可能會想要編譯一個新版的交互編譯程式, 來使用從 svn 上面下載來的最新版的單元檔, 如果您有此需求, 請依下列步驟進行:


1) 把 /Developer/FreePascalCompiler/iPhoneSnapshot-2.3.1-r12531/Source/rtl/darwin/arm/sig_cpu.inc 複製到您從 svn 取得的 rtl/darwin/arm 目錄 (這個檔案是在您安裝了 FPC iPhone SDK 整合安裝包時建立的)

2) 在 fpc 目錄的最上層目錄中, 執行下列指令 (請把第一行中的 "iphone2.1" 換成您安裝 iPhone SDK 的目錄)

 export IPHONEPLATFORMBASEDIR=/iphone2.1/Platforms/iPhoneOS.platform/Developer
 make FPC=your_ppc386_2.3.1 CPU_TARGET=arm CROSSOPT="-FD${IPHONEPLATFORMBASEDIR}/usr/bin -XR${IPHONEPLATFORMBASEDIR}/SDKs/iPhoneOS2.0.sdk/ -ap" all

3) 完成後將之安裝到適當的目錄中:

 make FPC=`pwd`/compiler/ppcrossarm OPT="-ap" CPU_TARGET=arm CROSSOPT="-FD${IPHONEPLATFORMBASEDIR}/usr/bin -XR${IPHONEPLATFORMBASEDIR}/SDKs/iPhoneOS2.0.sdk/ -ap" install CROSSINSTALL=1

(或許您會在指令的最後部分使用 INSTALL_PREFIX=xyz 參數, 將編譯好的交互編譯程式安裝到 "xyz" 程式, 這樣就不會安裝到預設的 /usr/local 目錄中了)

本網頁的更新記錄