# PyMobileProvision
parse ".mobileprovision" file in MacOS System;
解析 MacOS 系统里,iOS和Mac开发常用到的".mobileprovision"文件,提取出里面的"plist"格式的内容
仅支持 **Python3**,Python2版本见:[Py2MobileProvision](https://github.com/shede333/Py2MobileProvision)
## Install
```
# 注意:pip要用最新的(version>=21.0),否则,在安装cryptography依赖包时会失败
pip install PyMobileProvision
```
## Example Modules:
```python
from mobileprovision import MobileProvisionModel
mp_file_path = "/Users/shede333/Desktop/test.mobileprovision"
mp_model = MobileProvisionModel(mp_file_path)
# 也支持直接使用mobileprovision文件内容来创建model,AppStore Connect API一般会需要这种情况:
# from pathlib import Path
# file_content = Path(mp_file_path).read_text(encoding="ascii", errors="ignore")
# mp_model = MobileProvisionModel(file_content)
print(mp_model) # 打印mobileprovision文件的详细信息
print(mp_model.app_id_prefix) # appID的前缀
print(mp_model.app_id(is_need_prefix=True)) # app的BundleID,带app_id_prefix前缀
print(mp_model["name"]) # mobileprovision的"Name"属性(属性不区分大小写)
print(mp_model.date_is_valid()) # 现在的是否过期
print(mp_model.creation_timestamp) # 证书创建时间(时间戳,int值)
# ......还有很多其他属性.......
# 将int时间戳 转换为 本地日期时间
from datetime import datetime
local_dt = datetime.fromtimestamp(mp_model.creation_timestamp)
print(local_dt)
# 打印mobileprovision文件里包含的cer公钥证书信息
print(mp_model.developer_certificates)
# mobileprovision文件是否包含(支持)device_id设备
device_id = "00008020-000XXXXXXXXXXXXXX" # 设备的唯一ID
print(mp_model.contain_device_id(device_id))
# 转换为plist格式文件
dst_plist_path = "/Users/shede333/Desktop/test.plist"
mp_model.convert_to_plist_file(dst_plist_path)
# 导出entitlements.plist文件信息
ent_dst_path = "Users/shede333/Desktop/entitlements.plist"
mp_model.export_entitlements_file(ent_dst_path)
```
## Example CLI:
```shell
mobileprovision -h
输出:
usage: OKEx工程里的多语言国际化相关的便捷操作 [-h] {import,parse,convert,entitlements} ...
positional arguments:
{import,parse,convert,entitlements}
支持的命令如下:
import 导入mobileprovision文件到系统默认路径里
parse 解析、打印mobileprovision文件里的内容
convert 转换mobileprovision文件为plist文件
entitlements 打印/导出 mobileprovision文件里 entitlements信息
optional arguments:
-h, --help show this help message and exit
```
## 公司招聘:
欧科云链招募新同学:
可分布式`居家办公`,行业龙头,高薪资,年终奖优越,拒绝加班,**1075工作制**,公司提供团建费每人每周200元,还提供各种福利;
各地同学均可在家办公(**拿北京薪资+社保,在老家工作+生活**),也可在北京公司内(海淀上地)办公;
支持远程 **线上面试**;
**web前端、后端、移动端**均在招人,欢迎加入团队~
**简历**可发送至:<wshw333@gmail.com>
微信搜索“shede333sw”咨询岗位详情;
移动端招聘详情如下:
iOS工程师任职要求:
1.本科以上学历,可使用英文交流者加分;
2.三年以上的iOS平台研发经验,良好的代码编写规范。有已上线App开发经验加分,有跨平台开发经验加分;
3.精通Object-C/Swift语言,熟悉账户Xcode等开发佛能根据,熟练掌握使用iOS SDK,熟悉Go、Python、Ruby语言加分;
4.有高性能客户端编程经验,有性能调优经历加分;
5.熟悉iOS主流开源框架,并学习、研究过实现原理和源码;
Android工程师任职要求:
1.本科以上学历,可使用英文交流者加分;
2.三年以上Android开发经验;
3.熟悉Android常用控件的使用并理解其原理;
4.熟悉Android Framework原理,阅读过Android源代码者优先;
5.对java、Kotlin、基本数据结构、计算机网络有较为深入的了解;
Raw data
{
"_id": null,
"home_page": "https://github.com/shede333/PyMobileProvision",
"name": "PyMobileProvision",
"maintainer": null,
"docs_url": null,
"requires_python": "~=3.6",
"maintainer_email": null,
"keywords": "mobileprovision mobile provision MobileProvision profile profiles",
"author": "shede333",
"author_email": "333wshw@163.com",
"download_url": "https://files.pythonhosted.org/packages/7b/20/608ada31c714a3fc620ffb7ac640cf7569abd662da387f8da15a4cea85f4/PyMobileProvision-1.4.6.tar.gz",
"platform": null,
"description": "# PyMobileProvision\n\n\nparse \".mobileprovision\" file in MacOS System; \n\u89e3\u6790 MacOS \u7cfb\u7edf\u91cc\uff0ciOS\u548cMac\u5f00\u53d1\u5e38\u7528\u5230\u7684\".mobileprovision\"\u6587\u4ef6\uff0c\u63d0\u53d6\u51fa\u91cc\u9762\u7684\"plist\"\u683c\u5f0f\u7684\u5185\u5bb9\n\n\u4ec5\u652f\u6301 **Python3**\uff0cPython2\u7248\u672c\u89c1\uff1a[Py2MobileProvision](https://github.com/shede333/Py2MobileProvision)\n\n\n## Install\n\n```\n\n# \u6ce8\u610f\uff1apip\u8981\u7528\u6700\u65b0\u7684\uff08version>=21.0\uff09\uff0c\u5426\u5219\uff0c\u5728\u5b89\u88c5cryptography\u4f9d\u8d56\u5305\u65f6\u4f1a\u5931\u8d25\npip install PyMobileProvision\n\n```\n\n## Example Modules:\n\n```python\n\nfrom mobileprovision import MobileProvisionModel\n\nmp_file_path = \"/Users/shede333/Desktop/test.mobileprovision\"\nmp_model = MobileProvisionModel(mp_file_path)\n\n# \u4e5f\u652f\u6301\u76f4\u63a5\u4f7f\u7528mobileprovision\u6587\u4ef6\u5185\u5bb9\u6765\u521b\u5efamodel\uff0cAppStore Connect API\u4e00\u822c\u4f1a\u9700\u8981\u8fd9\u79cd\u60c5\u51b5\uff1a\n# from pathlib import Path\n# file_content = Path(mp_file_path).read_text(encoding=\"ascii\", errors=\"ignore\")\n# mp_model = MobileProvisionModel(file_content)\n\nprint(mp_model) # \u6253\u5370mobileprovision\u6587\u4ef6\u7684\u8be6\u7ec6\u4fe1\u606f\nprint(mp_model.app_id_prefix) # appID\u7684\u524d\u7f00\nprint(mp_model.app_id(is_need_prefix=True)) # app\u7684BundleID\uff0c\u5e26app_id_prefix\u524d\u7f00\nprint(mp_model[\"name\"]) # mobileprovision\u7684\"Name\"\u5c5e\u6027\uff08\u5c5e\u6027\u4e0d\u533a\u5206\u5927\u5c0f\u5199\uff09\nprint(mp_model.date_is_valid()) # \u73b0\u5728\u7684\u662f\u5426\u8fc7\u671f\nprint(mp_model.creation_timestamp) # \u8bc1\u4e66\u521b\u5efa\u65f6\u95f4\uff08\u65f6\u95f4\u6233\uff0cint\u503c\uff09\n# ......\u8fd8\u6709\u5f88\u591a\u5176\u4ed6\u5c5e\u6027.......\n\n# \u5c06int\u65f6\u95f4\u6233 \u8f6c\u6362\u4e3a \u672c\u5730\u65e5\u671f\u65f6\u95f4\nfrom datetime import datetime\nlocal_dt = datetime.fromtimestamp(mp_model.creation_timestamp)\nprint(local_dt) \n\n# \u6253\u5370mobileprovision\u6587\u4ef6\u91cc\u5305\u542b\u7684cer\u516c\u94a5\u8bc1\u4e66\u4fe1\u606f\nprint(mp_model.developer_certificates)\n\n# mobileprovision\u6587\u4ef6\u662f\u5426\u5305\u542b\uff08\u652f\u6301\uff09device_id\u8bbe\u5907\ndevice_id = \"00008020-000XXXXXXXXXXXXXX\" # \u8bbe\u5907\u7684\u552f\u4e00ID\nprint(mp_model.contain_device_id(device_id)) \n\n# \u8f6c\u6362\u4e3aplist\u683c\u5f0f\u6587\u4ef6\ndst_plist_path = \"/Users/shede333/Desktop/test.plist\"\nmp_model.convert_to_plist_file(dst_plist_path)\n\n# \u5bfc\u51faentitlements.plist\u6587\u4ef6\u4fe1\u606f\nent_dst_path = \"Users/shede333/Desktop/entitlements.plist\"\nmp_model.export_entitlements_file(ent_dst_path)\n\n```\n\n## Example CLI:\n\n```shell\n\nmobileprovision -h \n\n\u8f93\u51fa\uff1a\n\nusage: OKEx\u5de5\u7a0b\u91cc\u7684\u591a\u8bed\u8a00\u56fd\u9645\u5316\u76f8\u5173\u7684\u4fbf\u6377\u64cd\u4f5c [-h] {import,parse,convert,entitlements} ...\n\npositional arguments:\n {import,parse,convert,entitlements}\n \u652f\u6301\u7684\u547d\u4ee4\u5982\u4e0b\uff1a\n import \u5bfc\u5165mobileprovision\u6587\u4ef6\u5230\u7cfb\u7edf\u9ed8\u8ba4\u8def\u5f84\u91cc\n parse \u89e3\u6790\u3001\u6253\u5370mobileprovision\u6587\u4ef6\u91cc\u7684\u5185\u5bb9\n convert \u8f6c\u6362mobileprovision\u6587\u4ef6\u4e3aplist\u6587\u4ef6\n entitlements \u6253\u5370/\u5bfc\u51fa mobileprovision\u6587\u4ef6\u91cc entitlements\u4fe1\u606f\n\noptional arguments:\n -h, --help show this help message and exit\n\n\n```\n\n\n## \u516c\u53f8\u62db\u8058\uff1a\n\n\u6b27\u79d1\u4e91\u94fe\u62db\u52df\u65b0\u540c\u5b66\uff1a \n\u53ef\u5206\u5e03\u5f0f`\u5c45\u5bb6\u529e\u516c`\uff0c\u884c\u4e1a\u9f99\u5934\uff0c\u9ad8\u85aa\u8d44\uff0c\u5e74\u7ec8\u5956\u4f18\u8d8a\uff0c\u62d2\u7edd\u52a0\u73ed\uff0c**1075\u5de5\u4f5c\u5236**\uff0c\u516c\u53f8\u63d0\u4f9b\u56e2\u5efa\u8d39\u6bcf\u4eba\u6bcf\u5468200\u5143\uff0c\u8fd8\u63d0\u4f9b\u5404\u79cd\u798f\u5229\uff1b \n\u5404\u5730\u540c\u5b66\u5747\u53ef\u5728\u5bb6\u529e\u516c\uff08**\u62ff\u5317\u4eac\u85aa\u8d44+\u793e\u4fdd\uff0c\u5728\u8001\u5bb6\u5de5\u4f5c+\u751f\u6d3b**\uff09\uff0c\u4e5f\u53ef\u5728\u5317\u4eac\u516c\u53f8\u5185\uff08\u6d77\u6dc0\u4e0a\u5730\uff09\u529e\u516c\uff1b \n\u652f\u6301\u8fdc\u7a0b **\u7ebf\u4e0a\u9762\u8bd5**\uff1b \n**web\u524d\u7aef\u3001\u540e\u7aef\u3001\u79fb\u52a8\u7aef**\u5747\u5728\u62db\u4eba\uff0c\u6b22\u8fce\u52a0\u5165\u56e2\u961f~ \n**\u7b80\u5386**\u53ef\u53d1\u9001\u81f3\uff1a<wshw333@gmail.com> \n\u5fae\u4fe1\u641c\u7d22\u201cshede333sw\u201d\u54a8\u8be2\u5c97\u4f4d\u8be6\u60c5\uff1b \n\n\u79fb\u52a8\u7aef\u62db\u8058\u8be6\u60c5\u5982\u4e0b\uff1a \n\niOS\u5de5\u7a0b\u5e08\u4efb\u804c\u8981\u6c42\uff1a \n1.\u672c\u79d1\u4ee5\u4e0a\u5b66\u5386\uff0c\u53ef\u4f7f\u7528\u82f1\u6587\u4ea4\u6d41\u8005\u52a0\u5206\uff1b \n2.\u4e09\u5e74\u4ee5\u4e0a\u7684iOS\u5e73\u53f0\u7814\u53d1\u7ecf\u9a8c\uff0c\u826f\u597d\u7684\u4ee3\u7801\u7f16\u5199\u89c4\u8303\u3002\u6709\u5df2\u4e0a\u7ebfApp\u5f00\u53d1\u7ecf\u9a8c\u52a0\u5206\uff0c\u6709\u8de8\u5e73\u53f0\u5f00\u53d1\u7ecf\u9a8c\u52a0\u5206\uff1b \n3.\u7cbe\u901aObject-C/Swift\u8bed\u8a00\uff0c\u719f\u6089\u8d26\u6237Xcode\u7b49\u5f00\u53d1\u4f5b\u80fd\u6839\u636e\uff0c\u719f\u7ec3\u638c\u63e1\u4f7f\u7528iOS SDK\uff0c\u719f\u6089Go\u3001Python\u3001Ruby\u8bed\u8a00\u52a0\u5206\uff1b \n4.\u6709\u9ad8\u6027\u80fd\u5ba2\u6237\u7aef\u7f16\u7a0b\u7ecf\u9a8c\uff0c\u6709\u6027\u80fd\u8c03\u4f18\u7ecf\u5386\u52a0\u5206\uff1b \n5.\u719f\u6089iOS\u4e3b\u6d41\u5f00\u6e90\u6846\u67b6\uff0c\u5e76\u5b66\u4e60\u3001\u7814\u7a76\u8fc7\u5b9e\u73b0\u539f\u7406\u548c\u6e90\u7801\uff1b \n\nAndroid\u5de5\u7a0b\u5e08\u4efb\u804c\u8981\u6c42\uff1a \n1.\u672c\u79d1\u4ee5\u4e0a\u5b66\u5386\uff0c\u53ef\u4f7f\u7528\u82f1\u6587\u4ea4\u6d41\u8005\u52a0\u5206\uff1b \n2.\u4e09\u5e74\u4ee5\u4e0aAndroid\u5f00\u53d1\u7ecf\u9a8c\uff1b \n3.\u719f\u6089Android\u5e38\u7528\u63a7\u4ef6\u7684\u4f7f\u7528\u5e76\u7406\u89e3\u5176\u539f\u7406\uff1b \n4.\u719f\u6089Android Framework\u539f\u7406\uff0c\u9605\u8bfb\u8fc7Android\u6e90\u4ee3\u7801\u8005\u4f18\u5148\uff1b \n5.\u5bf9java\u3001Kotlin\u3001\u57fa\u672c\u6570\u636e\u7ed3\u6784\u3001\u8ba1\u7b97\u673a\u7f51\u7edc\u6709\u8f83\u4e3a\u6df1\u5165\u7684\u4e86\u89e3\uff1b \n\n\n",
"bugtrack_url": null,
"license": null,
"summary": "Python3, parse \".mobileprovision\" file in MacOS System;",
"version": "1.4.6",
"project_urls": {
"Homepage": "https://github.com/shede333/PyMobileProvision"
},
"split_keywords": [
"mobileprovision",
"mobile",
"provision",
"mobileprovision",
"profile",
"profiles"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "89a9fbc8762f7e585e3e0b420ee5f9038016c147d15cea79c092e463f4b85b7b",
"md5": "10e22013edb921a7bf44e56e080ef59e",
"sha256": "bfeba9d4f26f3ba64dc2c85dfcc1ff61b45d579f808e3433c6c315afdc97d958"
},
"downloads": -1,
"filename": "PyMobileProvision-1.4.6-py3-none-any.whl",
"has_sig": false,
"md5_digest": "10e22013edb921a7bf44e56e080ef59e",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": "~=3.6",
"size": 10507,
"upload_time": "2024-08-12T10:36:10",
"upload_time_iso_8601": "2024-08-12T10:36:10.869803Z",
"url": "https://files.pythonhosted.org/packages/89/a9/fbc8762f7e585e3e0b420ee5f9038016c147d15cea79c092e463f4b85b7b/PyMobileProvision-1.4.6-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "7b20608ada31c714a3fc620ffb7ac640cf7569abd662da387f8da15a4cea85f4",
"md5": "7c893c465bb73606f6b80b3286fb2a8d",
"sha256": "bdba5d00ebc76dce1114801eadf3070834fdc6e22921b162fa5adda955945f5b"
},
"downloads": -1,
"filename": "PyMobileProvision-1.4.6.tar.gz",
"has_sig": false,
"md5_digest": "7c893c465bb73606f6b80b3286fb2a8d",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "~=3.6",
"size": 9188,
"upload_time": "2024-08-12T10:36:12",
"upload_time_iso_8601": "2024-08-12T10:36:12.489544Z",
"url": "https://files.pythonhosted.org/packages/7b/20/608ada31c714a3fc620ffb7ac640cf7569abd662da387f8da15a4cea85f4/PyMobileProvision-1.4.6.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-08-12 10:36:12",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "shede333",
"github_project": "PyMobileProvision",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [],
"lcname": "pymobileprovision"
}