Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pkpass on Android

There is an android app, Passwallet, that is able to interpret pkpass files intented for the apple app Passbook (https://play.google.com/store/apps/details?id=com.attidomobile.passwallet)

I was wondering how to read pkpass files.

Pkpass files seem to be zip files with all the information inside in json files. Is there a default structure for the pkpass files? If so what is it? And what would be a good way to import that into a android app?


For the people who wonder how read the content of the pkpass file refer to the following code:

I set up this activity with the intent filter for pkpass files

        <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();
    }
}
like image 385
ePeace Avatar asked Jan 28 '13 10:01

ePeace


People also ask

Is Google pay PKPASS compatible?

Google Pay has some great functionality on its own, allowing you to import credit cards and related information, but it lacks native support for pkpass files, a file type used for things like passes in Apple Wallet.

What app opens PKPASS files?

Android users can use Above Mobile Limited PassWallet to open and manage PKPASS files on their Android devices.

What is PKPASS format?

PKPASS is a file format, used for storage and exchange of digital passes, developed by Apple for its Wallet application. It's intended to represent information that "might otherwise be printed on small pieces of paper or plastic" like boarding passes, membership cards, coupons, certificates, etc.


1 Answers

You can download the full specification for the .pkpass bundle from here. The pass content is stored in a JSON file named pass.json. The .pkpass bundle is a zip file containing pass.json, the pass images, optional locale files and a manifest file.

The manifest needs to be signed with an Apple issued Pass ID certificate. However for Android, or any other third party App, everything required to build the pass can be read from pass.json and the bundled images.

like image 112
PassKit Avatar answered Sep 23 '22 20:09

PassKit