2018-11-13 00:03:23 u013158533 阅读数 13211
  • Cocos Creator水果机游戏项目客户端实战教程

    课程目标: 掌握Cocos Creator游戏开发的基本过程,能独立完成游戏项目的设计与开发。适用人群希望学习和了解手机游戏、H5游戏、网络游戏的初学者。想要开发自己的一款小游戏,并且部署到服务器上。 注意:本项目是客户端开发,后续会推出服务端开发的课程。如果大家对课里面的内容有疑问,可以在评论区留言。 为什么选择cocos creater:  Cocos Creator 目前支持发布游戏到 Web、iOS、Android、各类"小游戏"、PC 客户端等平台,真正实现一次开发,全平台运行。其编辑器  完全为引擎定制打造,包含从设计、开发、预览、调试到发布的整个工作流所需的全功能一体化编辑器。很方便。门槛低,学习成本低。 为什么强烈建议推荐本套课程:   1.从0开始一点点敲的代码,由浅入深,深入剖析   2.生产环境Linux部署,减少弯路,一步到位   3. 老师每天上线答疑,让同学少走弯路   4. 实战商业化项目,学习价值很高 项目开发的功能: 本项目具有一定商业化价值。学习本项目我们将开发如下功能: 1.客户端-注册功能,token登录功能 2.客户端大厅功能,包含高分场,低分场 3.客户端好友功能,邮件列表功能,金币转换,排行榜功能 4.小三元动画,小满贯动画,跳远动画,普通开奖动画,旋转动画等 5.Nginx+阿里云部署,H5打包,域名申请 6.客户端http和websocket与后台通信,心跳协议 游戏项目部分截图展示: 后台展示:(本课程只介绍客户端,后续会推出服务端的课程,使用python开发) 免责声明: 素材均是网络搜集,本项目仅用于教学,请勿商用。

    336 人正在学习 去看看 于长海

在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一下子找不到了,如果需要请留言,人数多的话,我再写一个放上来,谅解~_~

博客地址: 冷读空间

2018-11-29 19:01:00 olsQ93038o99S 阅读数 100
  • Cocos Creator水果机游戏项目客户端实战教程

    课程目标: 掌握Cocos Creator游戏开发的基本过程,能独立完成游戏项目的设计与开发。适用人群希望学习和了解手机游戏、H5游戏、网络游戏的初学者。想要开发自己的一款小游戏,并且部署到服务器上。 注意:本项目是客户端开发,后续会推出服务端开发的课程。如果大家对课里面的内容有疑问,可以在评论区留言。 为什么选择cocos creater:  Cocos Creator 目前支持发布游戏到 Web、iOS、Android、各类"小游戏"、PC 客户端等平台,真正实现一次开发,全平台运行。其编辑器  完全为引擎定制打造,包含从设计、开发、预览、调试到发布的整个工作流所需的全功能一体化编辑器。很方便。门槛低,学习成本低。 为什么强烈建议推荐本套课程:   1.从0开始一点点敲的代码,由浅入深,深入剖析   2.生产环境Linux部署,减少弯路,一步到位   3. 老师每天上线答疑,让同学少走弯路   4. 实战商业化项目,学习价值很高 项目开发的功能: 本项目具有一定商业化价值。学习本项目我们将开发如下功能: 1.客户端-注册功能,token登录功能 2.客户端大厅功能,包含高分场,低分场 3.客户端好友功能,邮件列表功能,金币转换,排行榜功能 4.小三元动画,小满贯动画,跳远动画,普通开奖动画,旋转动画等 5.Nginx+阿里云部署,H5打包,域名申请 6.客户端http和websocket与后台通信,心跳协议 游戏项目部分截图展示: 后台展示:(本课程只介绍客户端,后续会推出服务端的课程,使用python开发) 免责声明: 素材均是网络搜集,本项目仅用于教学,请勿商用。

    336 人正在学习 去看看 于长海

640?wx_fmt=gif

640?wx_fmt=png

程序君个人微信和我聊聊编程和创业的事加好友


作者丨lxiaok

https://juejin.im/post/5bed3657518825604e0e4289


640?wx_fmt=gif

前言


这段时间刚刚学习了一段时间的Python,加上自己是做iOS开发的,就想着用Python来做一个自动化打包,可以自动完成打包,上传到蒲公英,并且发送邮箱给测试人员.


一是可以减少打包功夫,二来可以练练手,结合自己的工作来输出一点东西.废话不多说,直接上代码...


640?wx_fmt=gif

原理


就是使用xcodebuild来控制Xcode进行一系列的操作,从而完成打包的操作.


640?wx_fmt=jpeg


640?wx_fmt=gif为什么要做这个?


在我们日常开发的时候,特别是在内部测试的时间,有可能需要频繁的打包,打包的工作比较繁琐,需要等待点击下一步,选择之类,影响了开发的节奏.(开玩笑,我能有啥节奏...), 为什么不能直接运行,然后完成所有的操作呢?


640?wx_fmt=gif思路:


从网上查找了一些关于xcodebuild来打包的资料,从而得到:


  1. 找到对应的项目

  2. clean项目

  3. archive项目

  4. export IPA

  5. 上传蒲公英

  6. 发送邮件

  7. 收工


思路有了,动手起来.


640?wx_fmt=gif运行环境


Python, Xcode


这些需要大家直接去搭建好环境...


640?wx_fmt=gif准备工作


  1. 下载安装pycharm(这只是我开发Python的工具而已,大家可以根据自己喜欢的来选择)

  2. 注册并认证蒲公英(不认证的话,是不能上传的)

  3. 邮箱开启POP3/SMTP服务(我使用的是QQ邮箱),记录下16位授权码

  4. 一个ExportOptions.plist文件, 这个下面会解释为什么需要还有怎么生成!

  5. 一份iOS项目代码→_→


640?wx_fmt=gif完整代码


#!/usr/bin/env python3
# -*- coding: utf-8 -*-
@Time    : 2018/11/14 11:04 AM
@Author  : liangk
@Site    :
@File    : auto_archive_ios.py
@Software: PyCharm


import os
import requests
import webbrowser
import subprocess
import time
import smtplib
from email.mime.text import MIMEText
from email import encoders
from email.header import Header
from email.utils import parseaddr, formataddr

project_name = 'TestArchive'    # 项目名称
archive_workspace_path = '/Users/用户/Desktop/TestArchive'    # 项目路径
export_directory = 'archive'    # 输出的文件夹
ipa_download_url = 'https://www.pgyer.com/XXX' #蒲公英的APP地址

# 蒲公英账号USER_KEY、API_KEY
USER_KEY = 'XXXXXXXXXXXXXXXXXXXX'
API_KEY = 'XXXXXXXXXXXXXXXXXXXX'

from_address = 'XXXXXXXXXXXXXXXXXXXX@qq.com'    # 发送人的地址
password = 'XXXXXXXXXXXXXXXXXXXX'  # 邮箱密码换成他提供的16位授权码
to_address = 'XXXXXXXXXXXXXXXXXXXX@qq.com'    # 收件人地址,可以是多个的
smtp_server = 'smtp.qq.com'    # 因为我是使用QQ邮箱..


class AutoArchive(object):
    """自动打包并上传到蒲公英,发邮件通知"""

    def __init__(self):
        pass

    def clean(self):
        print("\n\n===========开始clean操作===========")
        start = time.time()
        clean_command = 'xcodebuild clean -workspace %s/%s.xcworkspace -scheme %s -configuration Release' % (
            archive_workspace_path, project_name, project_name)
        clean_command_run = subprocess.Popen(clean_command, shell=True)
        clean_command_run.wait()
        end = time.time()
        # Code码
        clean_result_code = clean_command_run.returncode
        if clean_result_code != 0:
            print("=======clean失败,用时:%.2f秒=======" % (end - start))
        else:
            print("=======clean成功,用时:%.2f秒=======" % (end - start))
            self.archive()

    def archive(self):
        print("\n\n===========开始archive操作===========")

        # 删除之前的文件
        subprocess.call(['rm''-rf''%s/%s' % (archive_workspace_path, export_directory)])
        time.sleep(1)
        # 创建文件夹存放打包文件
        subprocess.call(['mkdir''-p''%s/%s' % (archive_workspace_path, export_directory)])
        time.sleep(1)

        start = time.time()
        archive_command = 'xcodebuild archive -workspace %s/%s.xcworkspace -scheme %s -configuration Release -archivePath %s/%s' % (
            archive_workspace_path, project_name, project_name, archive_workspace_path, export_directory)
        archive_command_run = subprocess.Popen(archive_command, shell=True)
        archive_command_run.wait()
        end = time.time()
        # Code码
        archive_result_code = archive_command_run.returncode
        if archive_result_code != 0:
            print("=======archive失败,用时:%.2f秒=======" % (end - start))
        else:
            print("=======archive成功,用时:%.2f秒=======" % (end - start))
            # 导出IPA
            self.export()

    def export(self):
        print("\n\n===========开始export操作===========")
        print("\n\n==========请你耐心等待一会~===========")
        start = time.time()
        # export_command = 'xcodebuild -exportArchive -archivePath /Users/liangk/Desktop/TestArchive/myArchivePath.xcarchive -exportPath /Users/liangk/Desktop/TestArchive/out -exportOptionsPlist /Users/liangk/Desktop/TestArchive/ExportOptions.plist'
        export_command = 'xcodebuild -exportArchive -archivePath %s/%s.xcarchive -exportPath %s/%s -exportOptionsPlist %s/ExportOptions.plist' % (
            archive_workspace_path, export_directory, archive_workspace_path, export_directory, archive_workspace_path)
        export_command_run = subprocess.Popen(export_command, shell=True)
        export_command_run.wait()
        end = time.time()
        # Code码
        export_result_code = export_command_run.returncode
        if export_result_code != 0:
            print("=======导出IPA失败,用时:%.2f秒=======" % (end - start))
        else:
            print("=======导出IPA成功,用时:%.2f秒=======" % (end - start))
            # 删除archive.xcarchive文件
            subprocess.call(['rm''-rf''%s/%s.xcarchive' % (archive_workspace_path, export_directory)])
            self.upload('%s/%s/%s.ipa' % (archive_workspace_path, export_directory, project_name))

    def upload(self, ipa_path):
        print("\n\n===========开始上传蒲公英操作===========")
        if ipa_path:
            # https://www.pgyer.com/doc/api 具体参数大家可以进去里面查看,
            url = 'http://www.pgyer.com/apiv1/app/upload'
            data = {
                'uKey': USER_KEY,
                '_api_key': API_KEY,
                'installType''1',
                'updateDescription': description
            }
            files = {'file': open(ipa_path, 'rb')}
            r = requests.post(url, data=data, files=files)
            if r.status_code == 200:
                # 是否需要打开浏览器
                # self.open_browser(self)
                self.send_email()
        else:
            print("\n\n===========没有找到对应的ipa===========")
            return

    @staticmethod
    def open_browser(self):
        webbrowser.open(ipa_download_url, new=1, autoraise=True)

    @staticmethod
    def _format_address(self, s):
        name, address = parseaddr(s)
        return formataddr((Header(name, 'utf-8').encode(), address))

    def send_email(self):
        # https://www.pgyer.com/XXX app地址
        # 只是单纯的发了一个文本邮箱,具体的发附件和图片大家可以自己去补充
        msg = MIMEText('
Hello
'
 +
                       '
╮(╯_╰)╭应用已更新,请下载测试╮(╯_╰)╭

'
 +
                       '
蒲公英的更新会有延迟,具体版本时间以邮件时间为准

'
 +
                       '''html''utf-8')
        msg['From'] = self._format_address(self'iOS开发团队 <%s>' % from_address)
        msg['Subject'] = Header('来自iOS开发团队的问候……''utf-8').encode()
        server = smtplib.SMTP(smtp_server, 25)  # SMTP协议默认端口是25
        server.set_debuglevel(1)
        server.login(from_address, password)
        server.sendmail(from_address, [to_address], msg.as_string())
        server.quit()
        print("===========邮件发送成功===========")


if __name__ == '__main__':
    description = input("请输入内容:")
    archive = AutoArchive()
    archive.clean()


640?wx_fmt=gif关于ExportOptions.plist文件


因为 Xcode 9+ 默认不允许访问钥匙串的内容,必须要设置 

allowProvisioningUpdates 才会允许,Python的Xcode插件目前无法支持此项完成打包流程。


640?wx_fmt=gif解决步骤如下:


1.手动Xcode10打包,导出ExportOptions.plist文件;

2.编辑ExportOptions.plist文件,配置 provisioningProfiles 对应填入Bundle identifier及证书关联配置文件(打包时自动匹配或手动填入证书,provisioningProfiles需配置的必填信息可自动生成);

3.提供ExportOptions.plist文件路径供Python脚本调用(详请参看Python脚本代码)。


640?wx_fmt=gif具体的内容


<plist version="1.0">
<dict>
    <key>compileBitcodekey>//是否编译bitcode
    <true/>
    <key>methodkey>
    <string>ad-hocstring>/
    <key>provisioningProfileskey>
    <dict>
        <key>文件bundle idkey>
        <string>Adhoc_IDstring>
    dict>
    <key>signingCertificatekey>//证书签名
    <string>这里填证书签名string>
    <key>signingStylekey>
    <string>manualstring>
    <key>stripSwiftSymbolskey>
    <true/>
    <key>teamIDkey>
    <string>AANCCUK4M3string>//TeamID
    <key>thinningkey>
    <string>string>
dict>
plist>


640?wx_fmt=gif分析


xcodebuild archive -workspace XXX.xcworkspace -scheme XXX -configuration Release -archivePath XXX CONFIGURATION_BUILD_DIR ./dir ODE_SIGN_IDENTITY=证书 PROVISIONING_PROFILE=描述文件UUID


640?wx_fmt=png

640?wx_fmt=gif问题一


640?wx_fmt=jpeg


配置一下compileBicode=NO即可


640?wx_fmt=jpeg

 推荐↓↓↓ 

640?wx_fmt=png

?16个技术公众号】都在这里!

涵盖:程序员大咖、源码共读、程序员共读、数据结构与算法、黑客技术和网络安全、大数据科技、编程前端、Java、Python、Web编程开发、Android、iOS开发、Linux、数据库研发、幽默程序员等。

2017-08-04 16:10:55 henni_719 阅读数 1081
  • Cocos Creator水果机游戏项目客户端实战教程

    课程目标: 掌握Cocos Creator游戏开发的基本过程,能独立完成游戏项目的设计与开发。适用人群希望学习和了解手机游戏、H5游戏、网络游戏的初学者。想要开发自己的一款小游戏,并且部署到服务器上。 注意:本项目是客户端开发,后续会推出服务端开发的课程。如果大家对课里面的内容有疑问,可以在评论区留言。 为什么选择cocos creater:  Cocos Creator 目前支持发布游戏到 Web、iOS、Android、各类"小游戏"、PC 客户端等平台,真正实现一次开发,全平台运行。其编辑器  完全为引擎定制打造,包含从设计、开发、预览、调试到发布的整个工作流所需的全功能一体化编辑器。很方便。门槛低,学习成本低。 为什么强烈建议推荐本套课程:   1.从0开始一点点敲的代码,由浅入深,深入剖析   2.生产环境Linux部署,减少弯路,一步到位   3. 老师每天上线答疑,让同学少走弯路   4. 实战商业化项目,学习价值很高 项目开发的功能: 本项目具有一定商业化价值。学习本项目我们将开发如下功能: 1.客户端-注册功能,token登录功能 2.客户端大厅功能,包含高分场,低分场 3.客户端好友功能,邮件列表功能,金币转换,排行榜功能 4.小三元动画,小满贯动画,跳远动画,普通开奖动画,旋转动画等 5.Nginx+阿里云部署,H5打包,域名申请 6.客户端http和websocket与后台通信,心跳协议 游戏项目部分截图展示: 后台展示:(本课程只介绍客户端,后续会推出服务端的课程,使用python开发) 免责声明: 素材均是网络搜集,本项目仅用于教学,请勿商用。

    336 人正在学习 去看看 于长海
#coding=utf8
import csv
import os
import sys
reload(sys)
sys.setdefaultencoding("utf8")
'''
Author:ewang
Data:2017/07/18
该模块的主要功能函数:
读取csv中的数据到内存中
readDataToList():把csv中的数据,数据项以字典类型存储在列表中。
printIOSCodeData(dataList):参数类型是以字典类型作为单个数据项的列表
'''
PATH=lambda p:os.path.abspath(os.path.join(
    os.path.dirname(__file__), p))

class DataList(object):
    def __init__(self,filePah=PATH("./20170803162912.csv")):
        try:
            #存放csv中读取的数据
            self.mdbuffer=[]
            #打开csv文件,设置读的权限
            csvHand=open(filePah,"r")
            #创建读取csv文件句柄
            readcsv=csv.reader(csvHand)
            #把csv的数据读取到mdbuffer中
            for row in readcsv:
                    self.mdbuffer.append(row)  
            #把数据穿件为为字典类型的
        except Exception,e:
            print "Read Excel  error:",e
        finally:
            #关闭csv文件
            csvHand.close()
            
    def readDataToList(self):
        try:
            #在数组最后添加一个空白行
            #该行的作用是为了成功获取最后一条json数据
            #在数组endLine添加空白字符
            endLine=[" " for num in range(len(self.mdbuffer[1])) if num>=0] 
            #把以空字符的endLine添加到末尾
            self.mdbuffer.append(endLine)
            #获取mdbuffer中的元素个数
            rowNumber=len(self.mdbuffer)
            #设置当前行号
            currentrow=1
            #设置json数据的属性值
            propertyJson={}
            #读取列表中的元素   
            dataList=[]  
            try: 
                for row in range(1,rowNumber):
                    #创建一个临时变量用来存取一次循环的属性键值
                    temp={}
                    #获取列表中一个元素
                    item=self.mdbuffer[row]
                    #获取当前元素,当前元素代表的是每个
                    #事件起始的位置
                    currentItem=self.mdbuffer[currentrow]
                    #获取serviceId并进行解码
                    mdEvent=currentItem[0].decode("gbk")
                    serviceId= currentItem[2].decode("gbk")
                    #获取属性并进行解码,把解码的值存入propertyName
                    propertyName=item[3].decode("gbk")
                    #获取属性值并进行解码,把解码的值存入propertyValue
                    propertyValue=item[4].decode("gbk")
                    try:
                        #判断埋点事件与serviceId是否相等
                        if item[0]==currentItem[0] and item[2]==currentItem[2]:
                            #用来保存埋点事件
                            propertyJson["mdEvent"]=mdEvent 
                            #把serviceId方式字典propertyJson中
                            propertyJson["serviceId"]=serviceId 
                            #把属性/值对放入temp字典中                                                 
                            temp[propertyName]=propertyValue
                            #调用字典的update函数,把temp中的键值对
                            #添加到 propertyJson字典中
                            propertyJson.update(temp)
                            #使用continue,如果为if条件为true则循环执行if语句模块
                            continue  
                        else:
                            #把行号设置为当前行
                            currentrow=row  
                            #把当前的属性解码放入propertyName                    
                            propertyName=currentItem[3].decode("gbk")
                            #把当前的属性值解码放入propertyName
                            propertyValue=currentItem[4].decode("gbk")
                            #用来保存埋点事件
                            mdEvent=currentItem[0].decode("gbk")
                            #把serviceId方式字典propertyJson中 
                            propertyJson["serviceId"]=serviceId    
                            #把属性/值对放入propertyJson字典中  
                            propertyJson[propertyName]=propertyValue
                            #propertyJsonList.append(propertyJson) 
                            dataList.append(propertyJson)
                            propertyJson={}
                    except Exception,e:
                        print "Get Property Json Error:" ,e
                        #print "Get Property Json Error:",e
            except Exception,e:
                print "Get Date Error:",e
                #print "Get Date Error:",e
            #返回dataList
            return  dataList     
        except Exception,e:
            #把信息写入日志中
            print "Reading Data TO Dic Error:",e
            
    def printIOSCodeData(self,dataList):
        try:
            if len(dataList)>0:
                #对列表中的数据执行for循环
                #并输出类似与json样式的数据
                for item in dataList:
                        print u"埋点事件:",item["mdEvent"]                                              
                        #输出键值对
                        print "[XMBehaviorMgr postStaticWithAppName:@\"event\""   
                        print  "\t\t\t serviceId:@\"%s\"" %item["serviceId"]
                        item.pop("serviceId")
                        item.pop("mdEvent")
                        print   "\t\t\t  otherProps:@{"
                        for key,val in item.items():                           
                            print "\t\t\t\t","@\""+key+"\"",":","@\""+val+"\"",","
                        print "\t\t\t }"
                        print " \t\t\t trackDic:nil];"
                        #设置以#格式的分隔符
                        print "#"*50
                        print
        except Exception,e:
            print "OutPut IOS Data Error:" ,e  
            
def test():
    baseData=DataList()
    baseData.printIOSCodeData(baseData.readDataToList())
    
if __name__=="__main__":
    baseData=DataList(sys.argv[1])
    baseData.printIOSCodeData(baseData.readDataToList())

2018-12-14 16:06:31 u011636207 阅读数 83
  • Cocos Creator水果机游戏项目客户端实战教程

    课程目标: 掌握Cocos Creator游戏开发的基本过程,能独立完成游戏项目的设计与开发。适用人群希望学习和了解手机游戏、H5游戏、网络游戏的初学者。想要开发自己的一款小游戏,并且部署到服务器上。 注意:本项目是客户端开发,后续会推出服务端开发的课程。如果大家对课里面的内容有疑问,可以在评论区留言。 为什么选择cocos creater:  Cocos Creator 目前支持发布游戏到 Web、iOS、Android、各类"小游戏"、PC 客户端等平台,真正实现一次开发,全平台运行。其编辑器  完全为引擎定制打造,包含从设计、开发、预览、调试到发布的整个工作流所需的全功能一体化编辑器。很方便。门槛低,学习成本低。 为什么强烈建议推荐本套课程:   1.从0开始一点点敲的代码,由浅入深,深入剖析   2.生产环境Linux部署,减少弯路,一步到位   3. 老师每天上线答疑,让同学少走弯路   4. 实战商业化项目,学习价值很高 项目开发的功能: 本项目具有一定商业化价值。学习本项目我们将开发如下功能: 1.客户端-注册功能,token登录功能 2.客户端大厅功能,包含高分场,低分场 3.客户端好友功能,邮件列表功能,金币转换,排行榜功能 4.小三元动画,小满贯动画,跳远动画,普通开奖动画,旋转动画等 5.Nginx+阿里云部署,H5打包,域名申请 6.客户端http和websocket与后台通信,心跳协议 游戏项目部分截图展示: 后台展示:(本课程只介绍客户端,后续会推出服务端的课程,使用python开发) 免责声明: 素材均是网络搜集,本项目仅用于教学,请勿商用。

    336 人正在学习 去看看 于长海

#!/usr/bin/python

#!/usr/bin/env python
# -*- coding:utf-8 -*-

from tempfile import TemporaryFile
from xlwt import Workbook
import re,sys,os
 
dir = sys.path[0]
print dir
 
book = Workbook(encoding='utf-8')
pattern = re.compile(r'".+?"') 
pattern3 = re.compile(r'') 
 
for file in os.listdir(dir): 
    fileName = os.path.splitext(file)[0]
    print "filename",fileName
    fileExt = os.path.splitext(file)[1]
    print "fileExt",fileExt
 
    if os.path.isfile(file) and fileExt == '.strings':
#        print 'processing file: ', file
        sheet = book.add_sheet(fileName)
        f = open(file, "r")
        print("filename",fileName)
        if fileName == 'InfoPlist':
            row_index = 0
            for line in f:
                match = re.match(r'\w+=', line) 
                if match:
                    sheet.write(row_index,0,match.group()[:-1])
                match2 = pattern.search(line)
                if match2:
                    sheet.write(row_index,1,match2.group()[1:-1])
            row_index = row_index + 1
        else:
            row_index = 0
            for line in f:
#                if line.startswith(''):
#                    print("start")
                    col_index = 0
                    print "line --","\""+line 
                    line = "\""+line 
                    a = line.replace('=','"=')
#                    print "a --",a 
                    for m in pattern.finditer(a):
#                        print "m --",m
                        sheet.write(row_index,col_index,m.group()[1:-1].rstrip())
#                        print "row_index",row_index
#                        print "col_index",col_index
#                        print "key",m.group()[1:-1]
                        col_index = col_index + 1
                    row_index = row_index + 1
                
            pass
        f.close()
 
book.save('string/text.xls')
book.save(TemporaryFile())

 

string数据如下

name ="zhangsan";

age ="30";

 

2018-04-13 16:38:38 lvchenqiang_ 阅读数 1178
  • Cocos Creator水果机游戏项目客户端实战教程

    课程目标: 掌握Cocos Creator游戏开发的基本过程,能独立完成游戏项目的设计与开发。适用人群希望学习和了解手机游戏、H5游戏、网络游戏的初学者。想要开发自己的一款小游戏,并且部署到服务器上。 注意:本项目是客户端开发,后续会推出服务端开发的课程。如果大家对课里面的内容有疑问,可以在评论区留言。 为什么选择cocos creater:  Cocos Creator 目前支持发布游戏到 Web、iOS、Android、各类"小游戏"、PC 客户端等平台,真正实现一次开发,全平台运行。其编辑器  完全为引擎定制打造,包含从设计、开发、预览、调试到发布的整个工作流所需的全功能一体化编辑器。很方便。门槛低,学习成本低。 为什么强烈建议推荐本套课程:   1.从0开始一点点敲的代码,由浅入深,深入剖析   2.生产环境Linux部署,减少弯路,一步到位   3. 老师每天上线答疑,让同学少走弯路   4. 实战商业化项目,学习价值很高 项目开发的功能: 本项目具有一定商业化价值。学习本项目我们将开发如下功能: 1.客户端-注册功能,token登录功能 2.客户端大厅功能,包含高分场,低分场 3.客户端好友功能,邮件列表功能,金币转换,排行榜功能 4.小三元动画,小满贯动画,跳远动画,普通开奖动画,旋转动画等 5.Nginx+阿里云部署,H5打包,域名申请 6.客户端http和websocket与后台通信,心跳协议 游戏项目部分截图展示: 后台展示:(本课程只介绍客户端,后续会推出服务端的课程,使用python开发) 免责声明: 素材均是网络搜集,本项目仅用于教学,请勿商用。

    336 人正在学习 去看看 于长海

前言

在用python做脚本的时候,需要操作到iOS打包出来的ipa文件的plist文件。

解决方案

第三方库:plistlib 插件

1、先写入本地再读取

  # 读写文件
  fp = open("1.plist", 'w')
  # 直接写入字符串
  fp.write(str(uploadresult))
  fp.close()

  #  通过文件名路径读取文件     
  plistlib.readPlist({文件路径以及文件名})

2、直接读取

 /// 直接读取内容
  pl = plistlib.readPlistFromBytes(str(uploadresult).encode())
  /// 输出相关结果
  print(pl[key])

附注

plist文件内容格式:

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>$PATH</key>
    <string>/Users/Demo/Python/PythonCollection/venv/bin:/Users/lvchenqiang/.rvm/gems/ruby-2.4.0/bin:/Users/.rvm/gems/ruby-2.4.0@global/bin:/Users//.rvm/rubies/ruby-2.4.0/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/lvchenqiang/.rvm/bin:/Users/Work/SourceTree/venv/bin</string>
    <key>dev-tools-info</key>
    <dict>
        <key>search-method</key>
        <integer>-1</integer>
    </dict>
    <key>os-version</key>
    <string>10.13.3</string>
    <key>product-errors</key>
    <array>
        <dict>
            <key>code</key>
            <integer>-22910</integer>
            <key>message</key>
            <string>Please sign in with an app-specific password. You can create one at appleid.apple.com.</string>
            <key>userInfo</key>
            <dict>
                <key>NSLocalizedDescription</key>
                <string>Please sign in with an app-specific password. You can create one at appleid.apple.com.</string>
                <key>NSLocalizedFailureReason</key>
                <string>Unable to validate your application.</string>
            </dict>
        </dict>
    </array>
    <key>tool-path</key>
    <string>/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Frameworks/ITunesSoftwareService.framework</string>
    <key>tool-version</key>
    <string>1.13.810</string>
</dict>
</plist>
没有更多推荐了,返回首页