使用描述文件为iOS添加自定义字体

快速生成“已验证”的字体描述文件

生成含有字体的未签名描述文件


这里使用@linw1995的方法,在此致谢。支持.ttf和.otf字体

Pyhon代码

Github(https://gist.github.com/linw1995/7b1b8e88159f18ed18f46629e35ba423)上下载或者将下方文件粘贴为fonts.py文件

# coding: utf-8
import re
import hashlib
import sys
from base64 import b64encode
from random import choice

items = ['8', '9', 'a', 'b']
names = sys.argv

assert len(names) > 1

def replace(m):
    return "-".join([m.group(1), m.group(2), '5' + m.group(3), choice(items) + m.group(5), m.group(5)])

for name in names[1:]:

    with open(name, "rb") as f:
        font_data = f.read()

    sha1_font_data = hashlib.sha1(font_data).hexdigest()

    UUID = replace(re.search("([a-f0-9]{8})([a-f0-9]{4})([a-f0-9]{3})([a-f0-9]{3})([a-f0-9]{12})", sha1_font_data))

    encoded_font_data = b64encode(font_data)

    xml = f"""<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
        <key>PayloadUUID</key>
        <string>{ UUID }</string>
        <key>PayloadVersion</key>
        <integer>1</integer>
        <key>PayloadIdentifier</key>
        <string>geniuscqy.font-{ UUID }</string>
        <key>PayloadDisplayName</key>
        <string>{ name }</string>
        <key>PayloadOrganization</key>
        <string>Font Profile</string>
        <key>PayloadDescription</key>
        <string>Make the font available to iOS applications.</string>
        <key>PayloadContent</key>
        <array>
            <dict>
                <key>PayloadVersion</key>
                <integer>1</integer>
                <key>PayloadUUID</key>
                <string>{ UUID }</string>
                <key>Font</key>
                <data>{ encoded_font_data.decode() }</data>
                <key>PayloadType</key>
                <string>com.apple.font</string>
                <key>PayloadIdentifier</key>
                <string>LoggingPayload</string>
            </dict>
        </array>
        <key>PayloadType</key>
        <string>Configuration</string>
        <key>PayloadRemovalDisallowed</key>
        <false/>
    </dict>
    </plist>"""

    with open(name+".mobileconfig", "w", encoding="utf-8") as f:
        f.write(xml)

其中 <string>Make the font available to iOS applications.</string>为描述字段,安装时可见

使用方法

python3 packagingfonts.py 1.ttf 2.ttf 3.ttf

如默认python版本为3以上,可直接使用python

这时候会生成形如

1.ttf.mobileconfig

的文件

为描述文件签名


这里使用@GarveyCalvin的方法,在此致谢。

获取iOS信任的证书

首先你需要一个iOS信任的SSL证书。在此忽略此步骤。可以使用CertBot、TrustAsia的免费SSL或其他商业SSL。

这时候你有三个文件

  • ca.crt – SSL证书文件
  • priv.key – 私钥文件
  • ca-bundle.pem – 中间证书

文件名不重要,有时候不需要中间证书。

使用openssl工具签名

在shell里打开,windows下可用powershell

openssl smime -sign -in unsigned.mobileconfig -out signed.mobileconfig -signer ca.crt -inkey priv.key -certfile ca-bundle.pem -outform der -nodetach
openssl rsa -in priv.key -out rsanopass.key
openssl smime -sign -in unsigned.mobileconfig -out signed.mobileconfig -signer ca.crt -inkey rsanopass.key -certfile ca-bundle.pem -outform der -nodetach

没有openssl工具?自行安装。Windows 10 可尝试安装wsl系统后在PowerShell下每行命令前加wsl,注意提前cd切换目录。

注意替换其中的unsigned.mobileconfig,signed.mobileconfig,ca.crt,priv.key,ca-bundle.pem为实际文件名

使用iOS设备中Safari下载描述文件并自行安装

Reference


  1. linw1995.iOS字体安装和使用.[EB/OL].https://www.jianshu.com/p/83b4982f1a73,2017-06-17
  2. GarveyCalvin.iOS开发 – 超级签名实现之描述文件.[EB/OL].https://www.cnblogs.com/GarveyCalvin/p/ios-super-sign.html,2019-10-23

发表评论

发表评论

*

沙发空缺中,还不快抢~