15

有一个 Android 应用程序 Passwallet,它能够解释用于苹果应用程序 Passbook 的 pkpass 文件(https://play.google.com/store/apps/details?id=com.attidomobile.passwallet

我想知道如何读取 pkpass 文件。

Pkpass 文件似乎是 zip 文件,其中包含 json 文件中的所有信息。pkpass 文件是否有默认结构?如果是这样,那是什么?将其导入android应用程序的好方法是什么?


对于想知道如何读取 pkpass 文件内容的人,请参考以下代码:

我使用 pkpass 文件的意图过滤器设置了此活动

        <intent-filter>
            <action android:name="android.intent.action.VIEW" />

            <category android:name="android.intent.category.DEFAULT" />

            <data
                android:mimeType="application/vnd-com.apple.pkpass"
                android:scheme="content" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />

            <category android:name="android.intent.category.DEFAULT" />

            <data
                android:mimeType="application/vnd.apple.pkpass"
                android:scheme="content" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />

            <category android:name="android.intent.category.DEFAULT" />

            <data
                android:mimeType="application/vnd-com.apple.pkpass"
                android:scheme="file" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />

            <category android:name="android.intent.category.DEFAULT" />

            <data
                android:mimeType="application/vnd.apple.pkpass"
                android:scheme="file" />
        </intent-filter>

@Override
protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
Intent intent = getIntent();
Uri uri = intent.getData();
String scheme = uri.getScheme();

if(ContentResolver.SCHEME_CONTENT.equals(scheme)) {
    try {
        InputStream attachment = getContentResolver().openInputStream(uri);
        handleZipInput(attachment);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
}
else {
    String path = uri.getEncodedPath();
    try {
        FileInputStream fis = new FileInputStream(path);
        handleZipInput(fis);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
}
}

private void handleZipInput(InputStream in) {
    try {
        ZipInputStream zis = new ZipInputStream(in);
        ZipEntry entry;
        while((entry = zis.getNextEntry()) != null) {
            String filename = entry.getName();
            if(filename.equals("pass.json")) {
                StringBuilder s = new StringBuilder();
                int read = 0;
                byte[] buffer = new byte[1024];
                while((read = zis.read(buffer, 0, 1024)) >= 0)
                    s.append(new String(buffer, 0, read));

                JSONObject pass = new JSONObject(s.toString());
                break;
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}
4

1 回答 1

28

您可以从此处下载 .pkpass 包的完整规范。通行证内容存储在名为 pass.json 的 JSON 文件中。.pkpass 包是一个 zip 文件,其中包含 pass.json、pass 图像、可选的语言环境文件和一个清单文件。

清单需要使用 Apple 颁发的 Pass ID 证书进行签名。但是对于 Android 或任何其他第三方应用程序,构建通行证所需的所有内容都可以从 pass.json 和捆绑的图像中读取。

于 2013-01-28T10:48:09.140 回答