• 小白一枚,最近网上比较火的微信“跳一跳”小程序,刷爆了朋友圈,之后怀着好奇心在网上看到有大神自己写了一个python脚本,于是打算借来玩一下,倒腾了半天,各种配置,下面记录一下出现的问题:

    小白一枚,最近网上比较火的微信“跳一跳”小程序,刷爆了朋友圈,之后怀着好奇心在网上看到有大神自己写了一个python脚本,于是打算借来玩一下,倒腾了半天,各种配置,下面记录一下出现的问题:
    这里先贴一下源码:致敬Python大神
    (Github地址:https://github.com/wangshub/wechat_jump_game

    1.首先是python的环境配置
    因为之前装过python3.3.2,所以心里暗自窃喜,应该不会太难吧,然后这才是第一步,但是后面的插件,却找不到3.3版本的插件,只看到3.4+各种,【微笑脸】然后不得不找最新版的Python
    最后在官网下载了3.6版本的(https://www.python.org/downloads/windows/)下载之后就是安装了,结果安装失败????这是什么鬼。。。。

    这里写图片描述

    然后就各种百度,我的是win7纯净版,没有这个Pack1补丁,怎么加这个补丁,找了半天是因为Windows更新没有打开,之前装系统见别人在帖子里说补丁没必要打,就想着别瞎折腾了,就没有装,现在用到了却又纠结了,最后更新之后,还是这样,于是果断放弃。。。。不玩了!!!
    今天又打开微信,看了一眼跳一跳排名,最高分305,于是又想到这个脚本了,就再次尝试。。。。。
    既然安装Python3.6不行,我就安装低版本的,于是试了一下3.4的,结果顺利安装,一路默认就好了,我改了安装目录,然后配置环境变量,环境变量不会配置的就去百度一下吧,很简单的。

    2、安装numpy(不知道这是啥?反正装上就对了)
    注意因为scipy依赖numpy和MKL,所以下载的时候要下载带mkl的版本,见链接:https://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy
    我的是3.4所以要下载对应的,这个链接要下载好几个插件,后面还要用
    把刚下载的安装包复制到python安装目录下的scripts文件夹,在当前目录下通过pip install +绝对路径+版本名字,可直接安装numpy
    这里写图片描述

    3、安装scipy,下载相应版本的scipy(我现在的是scipy-1.0.0-cp34-cp36m-win64.whl),同样放在scripts文件夹中

    通过pip install +绝对路径+版本名字安装,安装好后可以通过impor命令测试是否安装成功。

    4.安装 matplotlib ,下载相应版本的matplotlib,放在scripts文件夹中,直接使用pip install matplotlib命令安装

    5.安装Pillow,直接使用pip install pillow来安装

    6.安装adb安装包
    我的是OPPO手机,刚开始没找到门道,就有点费劲了,按照网上的下载了adb工具包,解压之后,加入环境变量之后,插上手机,打开usb调试,然后在命令窗口里输入:adb devices,结果显示 List of devices attached,在设备管理器里面看到一个黄色感叹号的ADB Interface,然后意识到是驱动的问题,好吧,要想接着玩,那就接着百度。。。。

    插拔USB还是不行,这时注意到弹出的窗口
    这个才是关键有木有!!!

    这个才是关键有木有!!!这么明显的提示安装驱动我竟然没看到。。。。然后安装之后再次尝试:adb devices,结果还是不显示。。。。但是这一步为后面打下了基础

    最后试了一下有人建议直接全盘搜索一下.android文件夹,于是我搜了一下之后,确实看到了一个
    这里写图片描述

    然后进去下面那个Google文件夹里的Android文件夹,看到几个文件跟adb开发工具包里的文件一样,于是就试着将当前路径加入到环境变量里,然后再次尝试adb devices,此时手机会弹出是否允许此电脑调试,确认即可,然后竟然神奇的可以看到显示设备信息了。

    问号脸????:为什么直接单独建一个adb工具包的文件夹加入环境变量就不行呢?

    7、下面是如何运行Python代码

    手机上打开微信小程序,进入跳一跳。
    切换到源代码所在目录,我是放在桌面。例如:
    cd C:\Users\Administrator\Desktop\wechat_jump_game-master
    然后运行程序 python wechat_jump_auto.py

    如果是iOS用户,运行wechat_jump_autoiOS.py
    (iOS用户可以自行尝试一下,应该没问题的)

    然后会有提示是否打开微信跳一跳小程序和手机的USB调试[y/n]
    输入y回车即可
    然后你就会看到手机里面的程序开始自己运行起来了,等到它跳到你满意的分数你就可以停止啦,否则它会无止境的跳下去,分数太高容易被清零哦。不要玩的太嗨了,分数高了就很明显在作弊了。

    展开全文
  • iOS设备中运行python脚本?那不就意味着可以在手机上跑爬虫,可以使用各种牛逼哄哄的python库了吗。...当然我想要的不是像这篇文章说的用python编写一整个iOS程序,而只是在iOS应用中嵌入pyth...

    在iOS设备中运行python脚本?那不就意味着可以在手机上跑爬虫,可以使用各种牛逼哄哄的python库了吗。

    这个标题对我很有吸引力,曾经就有见到过在iOS平台上的python编译器(很多iOS上python的IDE,如Python3IDE),可以执行输入的python语和本地的python文件。

    当然我想要的不是像这篇文章说的用python编写一整个iOS程序,而只是在iOS应用中嵌入python文件执行非UI的逻辑,也就是说只需要在项目中嵌入一个python的编译环境。

    面对市场上这么多的iOS版python编译器,首先可以确定的是,针对iOS端的python编译库是存在的。我关心的问题是,能否支持python项目化的编译,能否导入丰富的三方库。那就动手一试咯


    小目标

    七牛的iOS平台SDK有这样一个特点,上传文件的时候需要生成token,但是生成token的逻辑在客户端的SDK中不存在,只能通过调用服务端的SDK才能获得。
    于是我们的小目标就诞生了:在iOS端上调用七牛python服务端SDK来生成token给客户端的七牛SDK使用。


    iOS的Python解释器

    针对iOS、MacOS平台,pybee开源了python支持库Python-Apple-support,这个是老版本的库Python-iOS-support.

    准备编译环境

    我这次使用的是老库中的Python3.4.2-b5版本,下载下来有两个framework,分别是OpenSSLPython。将这个两个framework拖入项目中,添加必要的lib库如图:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i677eEv4-1571197613226)(http://ojam5z7vg.bkt.clouddn.com/15359053297417.jpg)]

    在项目中创建PythonEnvironment.bundlePython.framework中的Restources文件夹内容复制进去,在初始化Python环境之前将bundle中的文件复制到指定目录作为Home路径

    设置Home路径、初始化

    设置上面准备home路径,并初始化编译环境。

    const char * frameworkPath = [[NSString stringWithFormat:@"%@/Resources",[self p_pythonFrameworkPath]] UTF8String];
    wchar_t  *pythonHome = _Py_char2wchar(frameworkPath, NULL);
    Py_SetPythonHome(pythonHome);
    
    Py_Initialize();
    PyEval_InitThreads();
    
    //在释放的时候调用
    Py_Finalize();
    

    执行Python代码、文件

    编译环境设置好之后,使用PyRun_SimpleString(python_code)便可以简单执行Python代码

    PyRun_SimpleString("print('hello world')");
    

    便可以输出hello world

    执行Python文件
    NSString *scriptPath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"py"];
        
    FILE *mainFile = fopen([scriptPath UTF8String], "r");
       
    PyRun_SimpleFile(mainFile, (char *)[[scriptPath lastPathComponent] UTF8String]);
    

    上面是执行main bundle中的Python文件方式,这种方式暂时没有找到如何调用文件中的某各类具体方法和传参。

    另外一种方式可以做到上面描述的需求,将在下一节中说明


    准备七牛Python库

    下载好的七牛SDK文件源码解压,在Xcode中创建一个bundle加入项目中,bundle中放七牛SDK的核心文件,如图:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3gkKeCdO-1571197613227)(http://ojam5z7vg.bkt.clouddn.com/15359397140219.jpg)]

    在需要使用七牛SDK之前,将此bundle中的文件拷贝到Python运行环境的home目录下

    编写token生成Python文件

    查看七牛的文档了解到生成token需要用到auth.py这个文件中的Auth类, 我们需要想办法创建一个Auth实例并传入需要的参数,再将生成的token导出来。

    首先自己创建一个iostoken.py文件,Python的文件名和方法名需要小写,类名需要大写。在iostoken.py中创建TokenForiOS

    import json
    from qiniu import Auth
    
    class TokenForiOS(object):
        
        def create_token(jsonParams):
            print(str(jsonParams))
            values = json.loads(jsonParams)
            access_key = values.get('access_key')
            secret_key = values.get('secret_key')
            #要上传的空间
            bucket_name = values.get('bucket_name')
            #上传到七牛后保存的文件名
            file_name = values.get('file_name')
            #构建鉴权对象
            q = Auth(access_key, secret_key)
            #生成上传 Token,可以指定过期时间等
            token = q.upload_token(bucket_name, file_name, 3600)
            return token
    

    上面是我使用七牛SDK中的Auth生成token的代码,类名为TokenForiOS方法名为create_token,现在需要找到合适的地方调用。

    不过在想要使用TokenForiOS类之前,需要将其加入qiniu模块的初始化__init__.py中:

    from .iostoken import TokenForiOS
    

    接下来就可以愉快地调用了

    Python.framework中有一套宏可以导入Python模块,生成实例,传参调用方法,具体使用例子见下代码块

    
    PyObject *pModule = PyImport_ImportModule([@"qiniu.iostoken" UTF8String]);//导入模块
        
    PyObject *pyClass = PyObject_GetAttrString(pModule, [@"TokenForiOS" UTF8String]);//获取类
        
    PyObject *pyInstance = PyInstanceMethod_New(pyClass); //创建实例
        
    NSMutableDictionary *params = [NSMutableDictionary new];
    [params setObject:@"123" forKey:@"access_key"];
    [params setObject:@"456" forKey:@"secret_key"];
    [params setObject:@"jake" forKey:@"bucket_name"];
    [params setObject:@"pic" forKey:@"file_name"];
        
    NSError *error = nil;
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:params options:NSJSONWritingPrettyPrinted error:&error];
    NSString *paramterJsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
        
    PyObject *result = NULL;
    result = PyObject_CallMethod(pyInstance, [@"create_token" UTF8String], "(s)", [paramterJsonString UTF8String] );
    
    char * resultCString = NULL;
    PyArg_Parse(result, "s", &resultCString); //将python类型的返回值转换为c
        
    NSLog(@"%s", resultCString);
    

    至此,我的小目标就完成啦。后面还有很多事情可以做,比如跑个爬虫试试,毕竟还没有尝试过网络请求。当然也还有很多坑要踩。


    总结

    使用过程中有下面几点体会

    • Python-Apple-support库的缺少文档 其实就是Python的API库
    • 设置Home目录导入模块的过程中踩了很多坑
    • 编译器对Python语法提示并不支持,难以排查写错的地方
    • framework的体积是在过大,对项目总体积影响大

    PS:在查询过程中发现了PyObjc这个项目,能够使用python通过bridge调用OC的方法从而使用Cocoa框架,实现使用python编写Cocoa GUI应用。

    PyObjC is a bridge between Python and Objective-C. It allows Python scripts to use and extend existing Objective-C class libraries; most importantly the Cocoa libraries by Apple.

    This document describes how to use Objective-C class libraries from Python scripts and how to interpret the documentation of those libraries from the point of view of a Python programmer.


    Reference

    在iOS app中运行Python文件(Swift+Objective C+Python) 带Demo

    iOS 工程中调用Python方法(带Demo)

    Embedding Python in an iPhone app

    PyObjc


    遇到图片加载不出来,请移步博客查看

    demo一下子找不到了,如果需要请留言,人数多的话,我再写一个放上来,谅解~_~

    博客地址: 冷读空间

    展开全文
  • 最近一直在看Python,也很喜欢Python的灵活性;今天主要想说的是iOS的代码混淆,为什么想做代码混淆?为了APP的安全,为了防止别人破壳轻易破解我们代码;还有就是做马甲包了,我们知道马甲包的市场需求很大,但是不...

    前言

    最近一直在看Python,也很喜欢Python的灵活性;今天主要想说的是iOS的代码混淆,为什么想做代码混淆?为了APP的安全,为了防止别人破壳轻易破解我们代码;还有就是做 马甲包 了,我们知道马甲包的市场需求很大,但是不能花费过多的精力在开发上,毕竟只是个马甲,没必要花费太多的成本!

    混淆工具

    网上搜了一下,开源免费的混淆都在转载 念茜大姐大 的 sh脚本 的混淆方法,或者在念茜的脚本基础上二次开发,大家去看过就知道念茜的这篇博客是在14年写的,那时我刚做iOS没多久 ,而且那时候中国区审核还没有那么严格,若果你现在还使用那种方法进行混淆,你肯定会收到苹果的 2.3.1 大礼包 ,所以我们还是探索别的混淆方法吧,不要再挖坟了!

    我这里主要是通过Python写的混淆工具,具体功能有方法混淆、属性混淆、类名混淆、添加垃圾代码、删除注释、修改资源文件Hash值、 加密字符串 、翻新资源名、 模拟人工混淆 、混淆文件名、混淆文件目录、混淆词库、混淆日志、映射列表、图片压缩、爬虫服务,具体的如下:

    软件界面

    1.下载地址:

    链接: pan.baidu.com/s/1esdfDdjO… 密码:2lbr

    :clap::clap::clap:进群免费拿邀请码:clap::clap::clap:365152048:clap::clap::clap:

    2.教学视频:

    链接: pan.baidu.com/s/1pqUkgU8Y… 密码:9sll

    开始混淆

    import addRubbishCode    as addCode
    import cunfusionObjName  as conObjN
    import confusionFun      as conFunc
    import cunfusionProperty as conPro
    import confusionLog      as conLog
    import deleteNotes       as delNot
    import updateSourceHash  as updHash
    import encryptString     as encStr
    import sourceName        as soName
    import missFolder
    from singletonModel import ZFJPersoninfo
    
    def start_fun(file_dir, funMap = {}):
    	personinfo = ZFJPersoninfo()
    	personinfo.isMissing = True
    	if len(file_dir) == 0:
    		return
    	if int(funMap['property']) > 0:
    		# 混淆属性
    		conLog.tips('*' * 30 + 'Fun:开始混淆属性' + '*' * 30)
    		conPro.startConfusionPro(file_dir)
    
    	if int(funMap['funName']) > 0:
    		# 混淆方法
    		conLog.tips('*' * 30 + 'Fun:开始混淆方法' + '*' * 30)
    		conFunc.startConfusionFun(file_dir)
    
    	if int(funMap['objName']) > 0:
    		# 混淆类名
    		conLog.tips('*' * 30 + 'Fun:开始混淆类名' + '*' * 30)
    		prefix = funMap['funNamePrefix'].replace('0', '')  #-添加类名前缀
    		personinfo.prefix = prefix #前缀存到单利里面
    		fixObjName = funMap['fixObjName'] #-自动修复过滤文件夹中引用的类名
    		conObjN.startObfuscatedObjName(file_dir, prefix)
    
    	if int(funMap['souHashKey']) > 0:
    		# 修改资源文件的hash值 
    		conLog.tips('*' * 30 + 'Fun:修改资源HASH值' + '*' * 30)
    		updHash.startUpdateSourceHash(file_dir)
    
    	if int(funMap['upSouName']) > 0:
    		# 翻新资源文件名
    		conLog.tips('*' * 30 + 'Fun:翻新资源文件名' + '*' * 30)
    		soName.startSourceName(file_dir)
    
    	if int(funMap['encryStr']) > 0:
    		# 加密明文字符串
    		conLog.tips('*' * 30 + 'Fun:加密明文字符串' + '*' * 30)
    		encStr.startEncryptStr(file_dir)
    
    	if int(funMap['rubbishCode']) > 0:
    		# 垃圾代码
    		conLog.tips('*' * 30 + 'Fun:添加垃圾代码' + '*' * 30)
    		amount = int(funMap['rubbishLine']) # -添加行数
    		addCode.startAddRubbishCode(file_dir, amount)
    
    	if int(funMap['deleteNotes']) > 0:
    		# 混淆或者删除注释
    		conLog.tips('*' * 30 + 'Fun:开始删除注释' + '*' * 30)
    		delNot.startDeleteNotes(file_dir)
    
    	if int(funMap['missFolder']) > 0:
    		# 混淆文件夹名
    		conLog.tips('*' * 30 + 'Fun:开始混淆文件夹名' + '*' * 30)
    		missFolder.startMissFolder(file_dir)
    
    	conLog.tips('*' * 30 + 'End:混淆结束' + '*' * 30)
    	personinfo.isMissing = False
    Python资源分享qun 881982657 ,内有安装包,PDF,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎
    
    复制代码

    混淆日志

    混淆的部分日志,混淆的时候回通过import logging自动生成混淆日志《 ZFJ混淆日志.log 》,便于开发者修改部分报错:

    忽略路径

    我们在混淆的时候,没必要全部进行混淆,特别是第三方库,或者Pods管理的第三方库;毕竟混淆的越多问题也就越多,所以我添加了混淆忽略文件:open_file_folder:,如下图:

    import confusionLog as conLog
     
    ignore_Files = ['/Pods/', '/Vendor/', '/LIB/', '/Util/']
    conLog.tips('已忽略的路径 === ' + str(ignore_Files))
     
    # 判断是否是忽略的文件夹
    def isIgnoreFiles(tmp_path):
    	# if '+' in tmp_path:
    	# 	return True
    	for item in ignore_Files:
    		if item in tmp_path:
    			return True
    	return False
    Python资源分享qun 881982657 ,内有安装包,PDF,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎
    
    
    复制代码

    特别说明

    混淆以后肯定会有或多或少的报错,所以要求使用者必须会iOS开发技能,一般报错都是因为一下两点:

    1.方法名相同,被多次混淆覆盖;

    2.忽略的文件夹中包含了已被混淆的类或者方法;

    3.图片如果不显示,可能原因是代码中图片名采用的是拼接的,手动替换一下就可以了;

    4.如果发现文本丢失,一般是在文本中有<*** 注释 *>类型的注释了,找到原项目替换一下;

    5.如果使用混淆工程目录因为PCH和Infor.plist报错,需要手动到project.pbxproj修改路径(详见路径混淆部分);

    6.如果出现项目路径修改了,但是本地实体路径没有修改,自己手动把本地路径修改一下;

    7.utf-8编码错误和[Errno 13] Permission denied权限错误不用管;

    以上错误都可以在日志文件中找到对应的混淆字段,然后手动替换上去就行!

    还有就是,该混淆工具目前只适用于OC项目工程,不支持swift项目,但是我打算等OC混淆工具全部OK以后(包括图形界面),会把swift的混淆加进去的!

    混淆结果

    1.函数混淆

    2.属性混淆

    3.类名混淆

    4.添加垃圾代码

    垃圾代码的调用与实现

    5.去除注释

    6.修改Hash值

    针对项目中的资源文件,我们可以通过修改Hash的方式来进行混淆,运行如下:

    :high_brightness:Tips:已忽略的路径 === ['/Pods/', '/Vendor/', '/LIB/', '/Util/']
    :tada:Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/MainWeb_Back_Icon.imageset/fanhui-4.png
    :tada:Infor:[UPdHash Meg] Old:dd03889c2e8647b9377d08775333557ff11425dd<->New:4a72c7b640882ae436b18868aa021331169db3fa
    :tada:Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/60.png
    :tada:Infor:[UPdHash Meg] Old:2d73347848d7168c09c48efe28a7ac5a9ec7411b<->New:551483123b5cc2c4c5ff2f5bf876db0d075261a1
    :tada:Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/58.png
    :tada:Infor:[UPdHash Meg] Old:c0c671fe3707bca8c5accdcadd8aa9f4f1f2726c<->New:d022db1c1f99c263b69bc09c09bc52dd1fa97fb5
    :tada:Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/120-1.png
    :tada:Infor:[UPdHash Meg] Old:5a6a7ec42d7489be18888828c1a9caba0da688ca<->New:8bbddfbbbed9023e4537e9e6caeed79c88ef8955
    :tada:Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/120.png
    :tada:Infor:[UPdHash Meg] Old:5a6a7ec42d7489be18888828c1a9caba0da688ca<->New:dcc4b47092bca1d6a6bb6d7bd671a0ef7ce2f4da
    :tada:Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/180.png
    :tada:Infor:[UPdHash Meg] Old:fee9220dbba52040517a0f77ffe8335e9300a64b<->New:d28a9118e1cf4a2ce9fc2805184ad42e20500c95
    :tada:Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/GUEG_ICON.png
    :tada:Infor:[UPdHash Meg] Old:07ed6c66ec7d5550bfa1e32b4848687417027c90<->New:fb780d87591cc86dd0fd24cdfa41e76a091ad657
    :tada:Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/80.png
    :tada:Infor:[UPdHash Meg] Old:ca3b3f61fc4c391515fe895d81360d15ec598049<->New:769ebf182fbb3a3fd69c46c3a595c1669c505f63
    :tada:Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/40.png
    :tada:Infor:[UPdHash Meg] Old:1bb7908a2ba1295fa69ad476a81003f2f413a3a8<->New:10793e67b27cdf5ad1ee4b9d37aecc62074b8ffc
    :tada:Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/87.png
    ......等等......
    Python资源分享qun 881982657 ,内有安装包,PDF,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎

    6.加密字符串

    编译前的代码如下:

    - (void)uiConfig{
        ZFJView *zfjView = [[ZFJView alloc] initWithZFJ:@"ZFJ1128"];
        zfjView.backgroundColor = [UIColor yellowColor];
        zfjView.frame = CGRectMake(100, 100, 150, 150);
        [zfjView setZFJViewTitleLab];
        [zfjView setZFJViewTitleLab:@"aaaaaa"];
        [zfjView setZFJViewTitleLab:@"aaa" efg:@"dscvdscsd"];
        [zfjView setZFJViewTitleLab:@"ddscvsdv" efg:@"cdsvdfbdf" hijk:@"cdvsvbdsbdfgnfdhnhdg"];
        [self.view addSubview:zfjView];
        
        [ZFJView svdsvfdsvfdvbzdfb];
    }
    复制代码
    编译后的代码如下:
    
    - (void)uiConfig{
        ZFJView *zfjView = [[ZFJView alloc] initWithZFJ:ZFJ_NSSTRING(((char []) {240, 236, 224, 155, 155, 152, 146, 0}))];
        zfjView.backgroundColor = [UIColor yellowColor];
        zfjView.frame = CGRectMake(100, 100, 150, 150);
        [zfjView setZFJViewTitleLab];
        [zfjView setZFJViewTitleLab:ZFJ_NSSTRING(((char []) {203, 203, 203, 203, 203, 203, 0}))];
        [zfjView setZFJViewTitleLab:ZFJ_NSSTRING(((char []) {203, 203, 203, 0})) efg:ZFJ_NSSTRING(((char []) {206, 217, 201, 220, 206, 217, 201, 217, 206, 0}))];
        [zfjView setZFJViewTitleLab:ZFJ_NSSTRING(((char []) {206, 206, 217, 201, 220, 217, 206, 220, 0})) efg:ZFJ_NSSTRING(((char []) {201, 206, 217, 220, 206, 204, 200, 206, 204, 0})) hijk:ZFJ_NSSTRING(((char []) {201, 206, 220, 217, 220, 200, 206, 217, 200, 206, 204, 205, 196, 204, 206, 194, 196, 194, 206, 205, 0}))];
        [self.view addSubview:zfjView];
        
        [ZFJView svdsvfdsvfdvbzdfb];
    }
    Python资源分享qun 881982657 ,内有安装包,PDF,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎

    加密混淆反编译前后Hopper对比如下:

    我们可以看到再通过Hopper看不到硬编码了!:+1::+1::+1:

    8.翻新资源名

    找到工程中的图片资源并翻新,然后自动替换代码中的引用。

    9.混淆工程目录

    说明:如果你的项目包含PCH,还有自带的Info.plist,需要你手动到project.pbxproj修改路径;

    10.图片压缩工具

    ZFJObsLib集成图片压缩工具,支持一键生成iOS开发三套图标,也支持自定义压缩尺寸,还可以移除Alpha通道,转成RGB图片模式;实现逻辑可参考: zfj1128.blog.csdn.net/article/det…具体如下图:

    展开全文
  • Python编写IOS工程的自动编译脚本

        折腾了一周,终于用Python语言写好了项目工程的自动编译脚本,虽然最终脚本只有200多行代码,但中间遇到的一些问题还是折磨了我一番, 好了, 现在把过程记录下来, 以便加深自己的印象, 也可供需要的人参考.

        一.目标

        我写这个脚本是要做到下面几个目标:

        1.每次编译都从服务器更新最新代码;

        2.每次编译要自动修改info.plist里的bundle version;

        3.每次编译都要编译出debug版和可供发布的distribution版, debug供测试人员使用, 测试通过后直接使用对应的distribution版本提交到App Store;

        4.编译出的包上传到服务器, 并通过邮件通知相关人员, 邮件内容是安装包的地址, 如果编译失败, 邮件内容是失败信息.

        二. 开发环境

        我是在Mac下用Python开发的, 其实直接用shell脚本也行, 我是为了操作一些文件更方便, 编辑器用的Sublime text 2.

        三. 前提条件

        开发证书和发布证书请先安装好, 工程配置里添加Distribution项(复制Release), 并配置好对应的发布证书.

        四. check out工程代码.

        代码管理我用的是svn, 下载代码其实就是用Python执行shell命令, 代码如下:

    def svnCheckout(self):
    	print "svn checkout start"
    	os.system('rm -frd %s'%codeDir)
    	os.system('mkdir %s'%codeDir)
    	os.system('svn checkout %s --username %s --password %s --non-interactive %s'\
    		%(svnPath,svnUserName,svnPassword,codeDir))
    	if os.path.exists('%s/YourProject'%codeDir) == False:
    		msg = 'checkout code failed'
    		print msg
    		self.buildSucceed = False
    		self.buildErrorDescription.append(msg)
    		return False
    	else:
    		os.chdir(LifeSearchBuild.codeDir)
    		return True
        需要导入os模块, os.system()方法是执行shell命令的, 代码中, codeDir变量是check out代码后存放的本地目录, buildErrorDescription是我定义的一个列表, 用来记录错误的信息的, 供后面发送邮件使用(编译失败时).

        五. 修改bundle version

        其实这一步是为了Distribution版, 因为提交到App Store的包, bundle version必须是递增的一个数, bundle version在工程的info.plist文件里, 操作plist, 可以直接用Mac自带的PlistBuddy, 代码如下:

    def modifyBundleVersion(self,newBundleVersion):
    	os.system('/usr/libexec/PlistBuddy -c "Set:CFBundleVersion %s" %s'%(newBundleVersion,infoPlistFilePath))
        其中infoPlistFilePath是你check out代码后工程里info.plist文件的路径. newBundleVersion需要你自己定义一个规则, 保证和上次编译的包的version是递增的就行, 编译完成后也需要持久化到本地, 以便下次做递增计算.

        六. 编译工程

        有了代码后, 就开始用xcodebuild命令来编译工程, 编译debug版的代码如下:

    def build_debug(self):
    	print "build debug start"
    	os.system('rm -frd build')
    	os.system('xcodebuild clean -configuration Debug')
    	os.system('xcodebuild -configuration Debug')
    	if os.path.exists('build/Debug-iphoneos/YourProject.app'):
    		debugIpaName = 'debug_%s_%s.ipa'%(currAppVersion,self.buildVersion)
    		os.system('mkdir Payload')
    		os.system('cp -r ./build/Debug-iphoneos/YourProject.app ./Payload/')
    		os.system('zip -r %s Payload'%debugIpaName)
    		os.system('rm -frd build')
    		os.system('rm -frd Payload')
    		self.ipaNameList.append(debugIpaName)
    	else:
    		self.buildSucceed = False
    		self.buildErrorDescription.append('build debug ipa failed')
        说明:app生成后需要放进一个Payload文件夹, 然后压缩成zip, 然后改后缀为ipa, Distribution的不用, 发布时直接用zip包提交.

        代码中ipaNameList是我定义的一个列表, 用来保存编好的包名字的, 以便后续上传服务器时使用.

        七. 上传到服务器

        我用到了ftp命令, 代码如下:

    def uploadToFTP(self):
    	if len(self.ipaNameList) == 0:
    		self.buildSucceed = False
    		print "no ipas to upload"
    		return
    		
    	os.system('''
    		ftp -niv %s << EOF
    		user %s %s
    		bin
    		mkdir %s/%s
    		cd %s/%s
    		lcd %s
    		mput %s
    		bye
    		EOF'''%(ftpAddress,
    			ftpUserName, 
    			ftpPassword, 
    			currAppVersion, 
    			self.buildVersion,
    			currAppVersion, 
    			self.buildVersion,
    			codeDir,
    			' '.join(self.ipaNameList)))
        其实大家不用细看这段代码, 这是我项目里直接拷贝过来的, 只要大家能用ftp命令上传到自己的服务器就行了.

        八. 邮件通知

        发邮件用到了smtplib, 我的邮件内容需是html格式的, 我就不直接拷贝我项目里的代码了, 写个例子代码如下:

    smtp = smtplib.SMTP('mail.yourcompany.com')
    smtp.login(emailSenderUserName, emailSenderPassword)
    msg = MIMEMultipart()
    msg['To'] = ";".join(emailAddressList)
    msg['From'] = emailSender
    msg['Subject']= "test mail"
    text = "<p>build successful</p>"
    body = MIMEText("%s"%text,_subtype='html',_charset='utf-8')
    msg.attach(body)
    smtp.sendmail(msg['From'], emailAddressList, msg.as_string())
    smtp.quit()

        九. dailybuild

        编译脚本弄好后, 可以手动运行编译, 也可以添加计划任务来每日定时编译, 这就用到了crontab, 如果你想每天早上8点运行自动编译脚本, 则编辑crontab如下:

    0 8 * * * python build.py >buildLog.txt
        buildLog.txt文件用来记录日志.

        注意!!用crontab的时候, 证书的问题折磨了我整整一天, 因为在crontab, 证书无法读取到, 导致签名失败, 上网查了大量的文章, 好像跟crontab无法读取到用户化境变量有关, 不过, 最终我的解决办法倒是很简单, 就是打开钥匙串, 把证书从"登录"里拷贝到"系统"里就可以了.

        ok, 完了, 希望对大家有帮助.

    展开全文
  • 如何使用python 编写脚本测试iOS APP1.下载python-client https://github.com/appium/python-client 2.在终端 打开到已经下载的文件目录下执行 python setup.py install 3. 打开apppium 桌面版。点击 st

    环境:Mac,Xcode, appium python
    本文基于appium 环境搭建成功后。如何使用python 编写脚本测试iOS APP

    1.下载python-client https://github.com/appium/python-client
    2.在终端 打开到已经下载的文件目录下执行 python setup.py install
    3. 打开apppium 桌面版。点击 start session (host,port 不变,默认host 0.0.0.0 port: 4723)
    4. 创建一个demo.py 文件
    5. 代码如下:
    ‘import unittest
    from appium import webdriver
    from appium.webdriver.common.touch_action import TouchAction
    desired_caps = {}
    desired_caps[‘platformName’] = ‘iOS’
    desired_caps[‘platformVersion’] = ‘10.3’
    desired_caps[‘deviceName’] = ‘设备名’
    desired_caps[‘bundleId’] = ‘项目的bundleId’
    desired_caps[‘udid’] = ‘测试手机的udid’
    desired_caps[‘app’] = ‘/Users/xiaoMing/Desktop/testDemoipa/testDemo.ipa’ // 必须先将项目打包ipa,此处传入ipa 路径
    driver = webdriver.Remote(‘http://localhost:4723/wd/hub‘, desired_caps)
    el = driver.find_element_by_accessibility_id(‘Button’) // Button 是通过appium 采集到的对应按钮的id
    action = TouchAction(driver)
    action.tap(el).perform() // 执行点击事件

    展开全文
  • 2019独角兽企业重金招聘Python工程师标准>>> ...
  • 使用Python开发IOS程序

    2019-06-17 18:13:56
    2019独角兽企业重金招聘Python工程师标准>>> ...
  • 基于Android的Appium+Python自动化脚本编写 1.Appium Appium是一个开源测试自动化框架,可用于原生,混合和移动Web应用程序测试, 它使用WebDriver协议驱动iOS,Android和Windows应用程序。 通过Appium,我们可以...
  • 导言:前面写了Appium环境的搭建,想必木有太大的问题,现在整理下如何编写Python + appium + iOS自动化脚本 121.官方文档必须得看熟悉了,不懂的可以看官方文档,或者...122.Python利用Appium编写iOS自动化脚本步...
  • Appium+Python+IOS之入门

    2019-02-13 21:28:12
    编写Python脚本 启动Appium和Python脚本开始自动化测试 1. 环境搭建 详见:https://testerhome.com/topics/8375 2. 准备一个简单的APP在IOS上:https://jingyan.baidu.com/article/a17d5285c9afc48099...
  • 前言 公司的项目,需要对项目中事件上报进行重新处理和封装,方便调用和自动上报!自己花了半天时间全部封装搞好,如下图: 其中ASLogsEventName类是...这里我使用Python脚本,自动读取Excel表格,然后生成iOS...
  • 我们使用kivy开发安卓APP,Kivy是一套专门用于跨平台快速应用开发的开源框架,使用Python和Cython编写,对于多点触控有着非常良好的支持,不仅能让开发者快速完成简洁的交互原型设计,还支持代码重用和部署,绝对是...
  • python代码写入ios

    2017-12-05 16:32:19
    一种Xcode工程内执行python脚本的方法,详见下文。 使用方法:  1.下载解压Python-iOS.zip文件,打开python-ios.xcworkspace。 2.Command+R运行,此时在模拟器上会有app生成;并且Xcode的console中会有log打印 ...
  • 用Lua编写iOS程序

    2012-10-08 11:39:04
    包括用Lua创建完整的应用(Corona)一直到用Lua作为app中的脚本元素(通过Wax或diy)。在此之前,我们需要问自己两个问题:1、为什么要使用Lua?2、苹果允许使用Lua吗?这两个问题是紧密相关的。如果你在此之前对Lua...
  • 捕捉参数录制脚本 Airtest提供了两个插件库让我们方便进行自动化测试: 1:AirTest库,主要通过对GUI图片进行定位来操作实现自动化 2:POCO库,类似appuim,通过形成UI树Xpath,对多层次控件进行操作来实现自动化 ...
  • Python编写hello world程序1.1. 修改python链接,指向python21.2. 创建main.py文件1.3. 添加第一行指定是python21.4. 编写两行代码1.5. 解释1.6. 运行1 用Python编写hello world程序1.1 修改python链接,指向...
  • 如下内容段是关于python编写自动更换ip工具的内容,希望能对大家也有用。 #!/usr/bin/env python Filename: IP.py import sitecustomize import _winreg import ConfigParser print ‘正在进行网络适配器检测,请...
  • 支持模拟器(iOS、Android)和真实设备(iOS,Android,Windows,Mac)。 推荐大家先阅读以下几篇文章 iOS自动化测试详细介绍 基于KIF的iOS UI 自动化测试和持续集成 准备工具 Xcode PyCharm Command Line Tool ...
  • 安全行业小工具收集项目,此项目内容来自:https://www.t00ls.net/pytools.htm(这里会更最新的),这里只是作为个人备份,如有问题可邮件通知
1 2 3 4 5 ... 20
收藏数 8,607
精华内容 3,442