博文地址:http://ifujun.com/shi-yong-pythonkai-fa-...python
對,你沒有看錯,就是使用Python開發iOS程序!ios
咱們見過使用JS、Lua、Ruby開發iOS程序的,可是基本沒有見過使用Python開發iOS程序(軟件)的,這是爲何?關於這個問題,我後面會回答。git
那麼,怎麼用Python開發iOS程序呢?其實咱們最主要解決的就是下面幾件事情:github
在iOS App中安裝Python解釋器。xcode
搭建Python和objc通訊的橋樑。cookie
如何配置工程並開發。app
若是不使用UIKit這些,那麼就要使用OpenGL ES這些了,這種方式,主要是用於開發遊戲的,咱們這裏不涉及這些。框架
固然,如下全部內容都是在一臺已經安裝了Xcode的Mac上進行的。iphone
pybee開源了一個能夠嵌入到iOS工程中的Python編譯腳本,具體位置在這:工具
https://github.com/pybee/Python-iOS-supp...
默認是使用Python 3.4.2,編譯x86_6四、i38六、ARMv七、ARMv7s、ARM64共5個版本,而後打成一個臃腫包,可選framework或者.a。
若是真的要用於生產環境的話,只要把Makefile中的
TARGETS-iOS=iphonesimulator.x86_64 iphonesimulator.i386 iphoneos.armv7 iphoneos.armv7s iphoneos.arm64
修改成:
TARGETS-iOS=iphoneos.armv7 iphoneos.arm64
咱們只須要支持ARMv7和ARM64便可,ARMv7s能夠兼容ARMv7,因此可讓包小一些。
做者提供的已經編譯好的包裏面,主要有兩種版本:
Python 3.4.x
Python 3.5.x
按照做者的說法,Python版本是能夠更換的,可是我嘗試過,我將最新版本的Python 2.7.11放進去,是沒法編譯成功的。
有一些人提到了這個問題,可是做者仍是建議使用3.4.x或者3.5.x版本,2.7x版本他已經再也不支持了。
修改Python版本的地方在:
PYTHON_VERSION=3.4.2
替換爲其餘版本便可。
切到Python-iOS-support
目錄,設置編譯參數,直接編譯。咱們這隻須要iOS版本,因此直接make iOS
便可。
編譯成功以後,會在build目錄上生成Python.framework
和OpenSSL.framework
。
若是編譯出問題,或者不想煩這個事情的,能夠直接下載編譯好的版本:
https://github.com/pybee/Python-iOS-supp...
rubicon-objc是一個鏈接Python和objc的橋樑。
首先,咱們須要安裝一下:
pip install rubicon-objc
那麼,它有什麼用呢,這就有意思了,咱們來看一下它是這麼寫的。
這塊的內容,前提條件是你要懂點iOS。
#!/usr/bin/python # -*- coding: utf-8 -*- from ctypes import cdll from ctypes import util from rubicon.objc import ObjCClass, objc_method # 載入Foundation框架 cdll.LoadLibrary(util.find_library('Foundation')) # 獲取NSArray類 NSArray = ObjCClass("NSArray") # 等同於 # NSArray *myArray = [NSArray arrayWithObjects:@"ok", @"ok1", @"ok2", nil] myArray = NSArray.arrayWithObjects_("ok", "ok1", "ok2", None) print myArray.count print myArray.indexOfObject_("ok2")
輸出結果是:
是否是很好玩!
調用objc的方式和之前objc直接的寫法很像,只是有一些須要改變,好比:
方法名不使用:
,而是使用_
。
多參數須要使用Python的方式,好比objc裏面的方法是:
/**objc:** /- (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)atomically; /**Python** /array. writeToURL_atomically_(url, atomically)
不能使用nil
,Python裏面使用None
代替。
等等。
具體用法你們能夠自行探究一下。
Python所須要的工程和直接用Xcode建立的不太同樣,手動改寫的話,還比較麻煩,因此咱們直接用模板工具生成。
cookiecutter是一個能夠在模板中快速建立工程的一個工具,Python-iOS-template是pybee開源的一個使用Python開發iOS工程的模板。
首先,咱們須要安裝cookiecutter,直接使用pip
安裝便可:
pip install cookiecutter
安裝好後,直接使用cookiecutter
命令建立工程:
cookiecutter https://github.com/pybee/Python-iOS-template
建好的工程目錄結構以下:
app
目錄是放置咱們建立的python文件的地方。app_packages
目錄是放三方包的地方,等同於咱們在電腦端的site_packages
文件夾。
工程裏面能夠同時存在objc文件和python文件,二者能夠各自運行,並不衝突。
Talk is cheap, show me the code.
不得不認可,rubicon-objc幾乎沒有文檔。
我在github上找到一個項目,iOS-Python-Project。這是使用rubicon-objc開發的一個Python-iOS工程,可是很惋惜的是,我這邊運行出錯。
我借鑑了iOS-Python-Project,修改了一個能夠運行的工程,有興趣的能夠去下載一下。
https://github.com/Forkong/python-iOS
工程裏面並無集成Python.framework
和OpenSSL.framework
,由於這兩個framework太大了,clone下來的時間會很長,因此不如直接在Github上下載編譯好的framework,地址在這邊:
https://github.com/pybee/Python-iOS-supp...
下好了以後,framework通常放置於根目錄下面,相對於我這個demo,那麼放置的目錄就是python-iOS/
,和apptest.xcodeproj
同級。
這個demo運行起來大概是這個樣子:
demo中只修改了rootViewController的背景,而後在上面添加了一個label。
固然,它還能作不少事情,怎麼作,我也不知道。
它的文檔太少了,我甚至不知道怎麼才能使用CGRect
,由於它不是一個類,我沒法import進來。
開頭我提到爲何不多有人會使用Python去開發iOS程序(軟件),我我的認爲主要有如下幾個緣由:
IDE的支持 - 若是你已經在個人demo上寫了幾行,你會發現,沒有任何objc庫的提示。原本咱們objc這門語言就是寫法很長很詳細的,要想直接手寫出整個方法名,那真是X了?了。
系統庫 - 通常來講,iOS程序通常至少都要有幾個頁面的,那麼UIKit
基本就是咱們必須的,除非你想使用OpenGL ES畫,或者直接HTML等。而要用到UIKit
,確定要寫一堆是Python可是徹底像objc的代碼,由於那方法名就是這麼定義的。這樣寫太累了,不如直接用objc寫。
Python解釋器過大 - 我生成的只有ARMv7和ARM64的Python.framework
就已經有20M+了,再加上好幾M的OpenSSL.framework
,這得多大。即便打到生產包裏面,我相信估計也有10M~20M了,相比較而言,lua的解釋器就只有200k。
技術支持 - 連咱們上面說到的rubicon
都沒有文檔,萬一出事了,找誰解決?社區上也沒幾我的這麼幹,提問的話,又有幾我的能夠幫助你。Ruby能夠用RubyMotion來開發iOS,可是它仍是有一些人用的。
在文章最後,我只想說:
雖然Python不適合開發iOS程序,可是,很好玩啊。
這就夠了。
咱們給App作hotfix的時候,若是不算HTML方案的話,主要有兩種,一種是lua的wax,還有一種是js的JSPatch。
lua寫patch的時候也具備上面的一、2兩個缺點,可是補丁這種東西原本就很短,稍微寫點也無妨。
或許,你能夠試試使用Python給你的App作hotfix。