15

Apple アプリ Passbook 用の pkpass ファイルを解釈できる Android アプリ Passwallet があります ( https://play.google.com/store/apps/details?id=com.attidomobile.passwallet )

pkpass ファイルの読み方を知りたいと思っていました。

Pkpass ファイルは、json ファイル内のすべての情報を含む zip ファイルのようです。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バンドルは、pass.json、パスイメージ、オプションのロケールファイル、およびマニフェストファイルを含むzipファイルです。

マニフェストは、Appleが発行したパスID証明書で署名する必要があります。ただし、Androidまたはその他のサードパーティ製アプリの場合、パスの作成に必要なすべてのものをpass.jsonとバンドルされたイメージから読み取ることができます。

于 2013-01-28T10:48:09.140 に答える