一、为什么要做这件事

在测试过程中,ios app 的安装包(.IPA 文件)不像安卓的 apk 文件那样直接放到手机里点击安装即可,一般来说可以通过一下几种来方式来安装:

上述三种方式,显然第三种更方便一些,这种方式对于任何人安装都没有太大的成本,只要你有 iPhone 即可和网络。我们平时在测试期间也是把打包好的 IPA 包传到蒲公英上面,然后把网址链接发给大家。测试工作中,还是觉得麻烦,一天有的时候要打好几个测试包,每次都要打开蒲公英网页->选择要上传的文件路径 ->选择上传时的参数配置->上传->打开下载页面,就心想能不能把这些比较规范的流程用代码去实现,于是自己就去试了下并把整个过程记录下来。

二、收获了什么

三、Getting Started

3.1 要解决的场景

如下图所示

在文件夹 A 中有某个 app 不同版本所打包的 IPA 文件,我的想法就是当有新的 IPA(即上图中第二个文件夹中的 IPA 文件)生成时,运行某个 python 脚本(puloadIPAtoPGY.py,基于 python2.7),便把最新的 IPA 上传到蒲公英上去,然后自动打开对应的下载页面。下面我们就 step by step 来实现。

3.2 Step1 找到你要上传的 IPA

方法就是判断文件夹 A 中最新创建的文件夹,然后选择该文件夹下面的 IPA。

#!/usr/bin/env python
#coding=utf-8 
import os,time
import requests                          #用于发送http请求到蒲公英,第三方模块,需要pip install requests来下载
import webbrowser                    #用于打开浏览器,并打开某个网址,系统自带模块
def IpaCreatedLastly(dir):         #传入的dir就是文件夹A的路径,如果你的脚本就在当前路径,直接传入“.”即可
    Dirdic={}                            #key=文件夹名称(包含IPA的文件夹路径),value=创建的时间
    for i in os.listdir(dir):          #查找文件夹A中所有的文件
        if os.path.isdir(i):
            print i
            creattime=os.path.getctime(dir+os.sep+i) #算出每个文件夹的创建时间,这里的时间是指距离1970年一月一日的秒数,所以数值越大越说明是最新创建的
            Dirdic[i]=creattime
    Dirdic=sorted(Dirdic.items(),key=lambda item:item[1],reverse=True)            #按value值(创建的时间)从大到小对字典排序
    DirCreatedLastly=Dirdic[0][0]                                                    #字典排列的第一的key值,即最新创建的文件夹
    print '要上传的文件目录是:'+DirCreatedLastly
    IpaPath=""
    for i in os.listdir(dir+os.sep+DirCreatedLastly):                         #找到该文件路径下面的IPA文件
        if(i.find('.ipa')!=(-1)):
            IpaPath=dir+os.sep+DirCreatedLastly+os.sep+i      #得到最新打包的IPA的夹路径
            return IpaPath
    return IpaPath

通过以上我们就得到了我们要上传的 IPA 文件。

3.3 Step2 上传到蒲公英

接下来到了核心的一步了,首先我们看看蒲公英的开发手册是怎说的,如下图所示:

首先上传这个操作需要用一个 post 请求。关于 http 请求最常见的就是 get 和 post 请求,get 是一种无副作用的请求,即对服务器的资源和数据不做改变,主要用来获取服务器的返回信息,当然它也可以传递参数,这些参数会被放在请求行(http 请求有三部分:请求行,请求头,请求正文,其中 get 请求只有前两部分,post 请求有三部分。)的 url 地址中。而当你的请求对服务器的资源或数据有改动时,就需要用到 post 请求格式(请求时的参数放在请求正文中),我们这里要上传一个文件,所以不难理解,肯定是要用 post 请求来实现这一操作。

接下来再看这句:enctype 为 "multipart/form-data",作为小白的我立马就蒙蔽了,赶紧搜了几片博客看了下(博客链接后面会给出),有了些初步的理解。传送文件给服务器,一般是通过传送文件的二进制数据,这里的 enctype 是编码格式的意思,默认是
application/x-www-form-urlencoded,这个是指发送前将字符按照 URL 编码格式(空格被编码为’+’,特殊字符被编码为 ASCII 十六进制字符)来编码,然后再发送。举个例子来进一步说明下,我们有时候会在浏览器中看到网址后面会有一大串由%、数字和英文字母组成的地址,如下图所示:

这是为啥呢,因为传递的参数中有中文,因为采用的是 url 编码格式,这些特殊的中文字符被转成 16 进制字符来显示了。而 multipart/form-data,是不对字符编码,主要用于上传文件等,我个人的理解这样文件的二进制数据就会被原原本本地发送个服务器。或许看到这你会想,这样代码写起来会不会很麻烦?又经过了一番查找,发现 python 的 requests 模块功能很强大,几句话就把上面的事情搞定了。见如下代码:

def uploadIPA(IPAPath):
    if(IPAPath==''):
        print '未找到对应上传的IPA文件!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
        return
    else:
        url='http://www.pgyer.com/apiv1/app/upload'         #上传的url地址
        data={
            'uKey':'你自己的userkey',
            '_api_key':'你自己的apikey',
            'installType':'2',
            'password':'123456',
            'updateDescription':'测试服'
            }                                #发送的参数数据
        files={'file':open(IPAPath,'rb')}       #上传的文件
        r=requests.post(url,data=data,files=files)   # 发送post请求。完事。。。。

3.4 Step3 打开下载页面

这里用到了的 python 的 webbrower 模块,可以比较快速的实现 启动浏览器并打开某个网址,代码如下:

def openDownloadUrl():
    webbrowser.open(r'你自己的蒲公英下载链接',new=1,autoraise=True)

3.5 Step4 实现它

调用上面的函数,实现自动上传到蒲公英,然后浏览器自动打开页面并弹到你的面前。

if __name__ == '__main__':
    dir='.'
    IpaPath=IpaCreatedLastly(dir)
    uploadIPA(IpaPath)
    openDownloadUrl()

四、参考文献


↙↙↙阅读原文可查看相关链接,并与作者交流