page contents

如何用python开发iOS程序?对你也许有帮助

对,你没有看错,就是使用Python开发iOS程序!我们见过使用JS、Lua、Ruby开发iOS程序的,但是基本没有见过使用Python开发iOS程序(软件)的,这是为什么?关于这个问题,我后面会回答。那么,怎么用Python开发iOS程序呢?其实我们最主要解决的就是下面几件事情:

attachments-2021-04-QkWSXDIg60890d56d59e0.png

对,你没有看错,就是使用Python开发iOS程序!

我们见过使用JS、Lua、Ruby开发iOS程序的,但是基本没有见过使用Python开发iOS程序(软件)的,这是为什么?关于这个问题,我后面会回答。

那么,怎么用Python开发iOS程序呢?其实我们最主要解决的就是下面几件事情:

在iOS App中安装Python解释器。

搭建Python和objc通信的桥梁。

如何配置工程并开发。

如果不使用UIKit这些,那么就要使用OpenGL ES这些了,这种方式,主要是用于开发游戏的,我们这里不涉及这些。

当然,以下所有内容都是在一台已经安装了Xcode的Mac上进行的。

在iOS App中安装Python解释器

Python-iOS-support

pybee开源了一个可以嵌入到iOS工程中的Python编译脚本,具体位置在这:

默认是使用Python 3.4.2,编译x86_64、i386、ARMv7、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。

如果编译出问题,或者不想烦这个事情的,可以直接下载编译好的版本:

搭建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-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,修改了一个可以运行的工程,有兴趣的可以去下载一下。

工程里面并没有集成Python.framework和OpenSSL.framework,因为这两个framework太大了,clone下来的时间会很长,所以不如直接在Github上下载编译好的framework。

下好了之后,framework一般放置于根目录下面,相对于我这个demo,那么放置的目录就是python-iOS/,和apptest.xcodeproj同级。

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的时候也具有上面的1、2两个缺点,但是补丁这种东西本来就很短,稍微写点也无妨。

或许,你可以试试使用Python给你的App做hotfix。

相关文章:

iOS开发语言是什么意思?这篇文章带你了解它!

Python self用法详解

Python 工具链让你写的代码更规范

更多技术资讯,请继续关注六星教育社区-程序员编程技术分享交流学习高端论坛

如果你想用Python开辟副业赚钱,但不熟悉爬虫与反爬虫技术,没有接单途径,也缺乏兼职经验
关注下方微信公众号:Python编程学习圈,获取价值999元全套Python入门到进阶的学习资料以及教程,还有Python技术交流群一起交流学习哦。

attachments-2022-06-mwTVAx7d62abef2abbbc9.jpeg

  • 发表于 2021-04-28 15:24
  • 阅读 ( 771 )
  • 分类:Python开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
轩辕小不懂
轩辕小不懂

2403 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1478 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章