使用Python開發iOS程序

博文地址:http://ifujun.com/shi-yong-pythonkai-fa-...python

對,你沒有看錯,就是使用Python開發iOS程序!ios

咱們見過使用JS、Lua、Ruby開發iOS程序的,可是基本沒有見過使用Python開發iOS程序(軟件)的,這是爲何?關於這個問題,我後面會回答。git

那麼,怎麼用Python開發iOS程序呢?其實咱們最主要解決的就是下面幾件事情:github

  1. 在iOS App中安裝Python解釋器。xcode

  2. 搭建Python和objc通訊的橋樑。cookie

  3. 如何配置工程並開發。app

若是不使用UIKit這些,那麼就要使用OpenGL ES這些了,這種方式,主要是用於開發遊戲的,咱們這裏不涉及這些。框架

固然,如下全部內容都是在一臺已經安裝了Xcode的Mac上進行的。iphone

在iOS App中安裝Python解釋器

Python-iOS-support

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.frameworkOpenSSL.framework

若是編譯出問題,或者不想煩這個事情的,能夠直接下載編譯好的版本:

https://github.com/pybee/Python-iOS-supp...

搭建Python和objc通訊的橋樑

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-templatepybee開源的一個使用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.frameworkOpenSSL.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程序(軟件),我我的認爲主要有如下幾個緣由:

  1. IDE的支持 - 若是你已經在個人demo上寫了幾行,你會發現,沒有任何objc庫的提示。原本咱們objc這門語言就是寫法很長很詳細的,要想直接手寫出整個方法名,那真是X了?了。

  2. 系統庫 - 通常來講,iOS程序通常至少都要有幾個頁面的,那麼UIKit基本就是咱們必須的,除非你想使用OpenGL ES畫,或者直接HTML等。而要用到UIKit,確定要寫一堆是Python可是徹底像objc的代碼,由於那方法名就是這麼定義的。這樣寫太累了,不如直接用objc寫。

  3. Python解釋器過大 - 我生成的只有ARMv7和ARM64的Python.framework就已經有20M+了,再加上好幾M的OpenSSL.framework,這得多大。即便打到生產包裏面,我相信估計也有10M~20M了,相比較而言,lua的解釋器就只有200k。

  4. 技術支持 - 連咱們上面說到的rubicon都沒有文檔,萬一出事了,找誰解決?社區上也沒幾我的這麼幹,提問的話,又有幾我的能夠幫助你。Ruby能夠用RubyMotion來開發iOS,可是它仍是有一些人用的。

在文章最後,我只想說:

雖然Python不適合開發iOS程序,可是,很好玩啊。

這就夠了。

咱們給App作hotfix的時候,若是不算HTML方案的話,主要有兩種,一種是lua的wax,還有一種是js的JSPatch。

lua寫patch的時候也具備上面的一、2兩個缺點,可是補丁這種東西原本就很短,稍微寫點也無妨。

或許,你能夠試試使用Python給你的App作hotfix。

相關文章
相關標籤/搜索