iospython开发工具_使用Python开发iOS程序
們見(jiàn)過(guò)使用JS、Lua、Ruby開(kāi)發(fā)iOS程序的,但是基本沒(méi)有見(jiàn)過(guò)使用Python開(kāi)發(fā)iOS程序(軟件)的,這是為什么?關(guān)于這個(gè)問(wèn)題,我后面會(huì)回答。
那么,怎么用Python開(kāi)發(fā)iOS程序呢?其實(shí)我們最主要解決的就是下面幾件事情:
在iOS App中安裝Python解釋器。
搭建Python和objc通信的橋梁。
如何配置工程并開(kāi)發(fā)。
如果不使用UIKit這些,那么就要使用OpenGL ES這些了,這種方式,主要是用于開(kāi)發(fā)游戲的,我們這里不涉及這些。
當(dāng)然,以下所有內(nèi)容都是在一臺(tái)已經(jīng)安裝了Xcode的Mac上進(jìn)行的。
在iOS App中安裝Python解釋器
Python-iOS-support
pybee開(kāi)源了一個(gè)可以嵌入到iOS工程中的Python編譯腳本,具體位置在這:
默認(rèn)是使用Python 3.4.2,編譯x86_64、i386、ARMv7、ARMv7s、ARM64共5個(gè)版本,然后打成一個(gè)臃腫包,可選framework或者.a。
如果真的要用于生產(chǎn)環(huán)境的話,只要把Makefile中的
TARGETS-iOS=iphonesimulator.x86_64 iphonesimulator.i386 iphoneos.armv7 iphoneos.armv7s iphoneos.arm64
修改為:
TARGETS-iOS=iphoneos.armv7 iphoneos.arm64
我們只需要支持ARMv7和ARM64即可,ARMv7s可以兼容ARMv7,所以可以讓包小一些。
作者提供的已經(jīng)編譯好的包里面,主要有兩種版本:
Python 3.4.x
Python 3.5.x
按照作者的說(shuō)法,Python版本是可以更換的,但是我嘗試過(guò),我將最新版本的Python 2.7.11放進(jìn)去,是無(wú)法編譯成功的。
有一些人提到了這個(gè)問(wèn)題,但是作者還是建議使用3.4.x或者3.5.x版本,2.7x版本他已經(jīng)不再支持了。
修改Python版本的地方在:
PYTHON_VERSION=3.4.2
替換為其他版本即可。
編譯
切到Python-iOS-support目錄,設(shè)置編譯參數(shù),直接編譯。我們這只需要iOS版本,所以直接make iOS即可。
編譯成功之后,會(huì)在build目錄上生成Python.framework和OpenSSL.framework。
如果編譯出問(wèn)題,或者不想煩這個(gè)事情的,可以直接下載編譯好的版本:
搭建Python和objc通信的橋梁
rubicon-objc是一個(gè)連接Python和objc的橋梁。
首先,我們需要安裝一下:
pip install rubicon-objc
那么,它有什么用呢,這就有意思了,我們來(lái)看一下它是這么寫(xiě)的。
這塊的內(nèi)容,前提條件是你要懂點(diǎn)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")
輸出結(jié)果是:
是不是很好玩!
調(diào)用objc的方式和以前objc直接的寫(xiě)法很像,只是有一些需要改變,比如:
方法名不使用:,而是使用_。
多參數(shù)需要使用Python的方式,比如objc里面的方法是:
**objc:**
-(BOOL)writeToURL:(NSURL *)url atomically:(BOOL)atomically;
**Python**
array. writeToURL_atomically_(url, atomically)
不能使用nil,Python里面使用None代替。
等等。
具體用法大家可以自行探究一下。
如何配置工程并開(kāi)發(fā)
創(chuàng)建工程
Python所需要的工程和直接用Xcode創(chuàng)建的不太一樣,手動(dòng)改寫(xiě)的話,還比較麻煩,所以我們直接用模板工具生成。
cookiecutter是一個(gè)可以在模板中快速創(chuàng)建工程的一個(gè)工具,Python-iOS-template是pybee開(kāi)源的一個(gè)使用Python開(kāi)發(fā)iOS工程的模板。
首先,我們需要安裝cookiecutter,直接使用pip安裝即可:
pip install cookiecutter
安裝好后,直接使用cookiecutter命令創(chuàng)建工程:
cookiecutter https://github.com/pybee/Python-iOS-template
建好的工程目錄結(jié)構(gòu)如下:
app目錄是放置我們創(chuàng)建的python文件的地方。 app_packages目錄是放三方包的地方,等同于我們?cè)陔娔X端的site_packages文件夾。
工程里面可以同時(shí)存在objc文件和python文件,兩者可以各自運(yùn)行,并不沖突。
完善工程
Talk is cheap, show me the code.
不得不承認(rèn),rubicon-objc幾乎沒(méi)有文檔。
我在github上找到一個(gè)項(xiàng)目,iOS-Python-Project。這是使用rubicon-objc開(kāi)發(fā)的一個(gè)Python-iOS工程,但是很可惜的是,我這邊運(yùn)行出錯(cuò)。
我借鑒了iOS-Python-Project,修改了一個(gè)可以運(yùn)行的工程,有興趣的可以去下載一下。
工程里面并沒(méi)有集成Python.framework和OpenSSL.framework,因?yàn)檫@兩個(gè)framework太大了,clone下來(lái)的時(shí)間會(huì)很長(zhǎng),所以不如直接在Github上下載編譯好的framework,地址在這邊:
下好了之后,framework一般放置于根目錄下面,相對(duì)于我這個(gè)demo,那么放置的目錄就是python-iOS/,和apptest.xcodeproj同級(jí)。
這個(gè)demo運(yùn)行起來(lái)大概是這個(gè)樣子:
demo中只修改了rootViewController的背景,然后在上面添加了一個(gè)label。
當(dāng)然,它還能做很多事情,怎么做,我也不知道。
它的文檔太少了,我甚至不知道怎么才能使用CGRect,因?yàn)樗皇且粋€(gè)類,我無(wú)法import進(jìn)來(lái)。
總結(jié)
開(kāi)頭我提到為什么很少有人會(huì)使用Python去開(kāi)發(fā)iOS程序(軟件),我個(gè)人認(rèn)為主要有以下幾個(gè)原因:
IDE的支持 – 如果你已經(jīng)在我的demo上寫(xiě)了幾行,你會(huì)發(fā)現(xiàn),沒(méi)有任何objc庫(kù)的提示。本來(lái)我們objc這門(mén)語(yǔ)言就是寫(xiě)法很長(zhǎng)很詳細(xì)的,要想直接手寫(xiě)出整個(gè)方法名,那真是X了🐶了。
系統(tǒng)庫(kù) – 一般來(lái)說(shuō),iOS程序一般至少都要有幾個(gè)頁(yè)面的,那么UIKit基本就是我們必須的,除非你想使用OpenGL ES畫(huà),或者直接HTML等。而要用到UIKit,肯定要寫(xiě)一堆是Python但是完全像objc的代碼,因?yàn)槟欠椒褪沁@么定義的。這樣寫(xiě)太累了,不如直接用objc寫(xiě)。
Python解釋器過(guò)大 – 我生成的只有ARMv7和ARM64的Python.framework就已經(jīng)有20M+了,再加上好幾M的OpenSSL.framework,這得多大。即使打到生產(chǎn)包里面,我相信估計(jì)也有10M~20M了,相比較而言,lua的解釋器就只有200k。
技術(shù)支持 – 連我們上面說(shuō)到的rubicon都沒(méi)有文檔,萬(wàn)一出事了,找誰(shuí)解決?社區(qū)上也沒(méi)幾個(gè)人這么干,提問(wèn)的話,又有幾個(gè)人可以幫助你。Ruby可以用RubyMotion來(lái)開(kāi)發(fā)iOS,但是它還是有一些人用的。
在文章最后,我只想說(shuō):
雖然Python不適合開(kāi)發(fā)iOS程序,但是,很好玩啊。
這就夠了。
我們給App做hotfix的時(shí)候,如果不算HTML方案的話,主要有兩種,一種是lua的wax,還有一種是js的JSPatch。
lua寫(xiě)patch的時(shí)候也具有上面的1、2兩個(gè)缺點(diǎn),但是補(bǔ)丁這種東西本來(lái)就很短,稍微寫(xiě)點(diǎn)也無(wú)妨。
或許,你可以試試使用Python給你的App做hotfix。
與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的iospython开发工具_使用Python开发iOS程序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java mqtt客户端_MQTT消息队
- 下一篇: springboot项目文档源码_基于S