What's new with Passbook/Wallet

Starting with iOS 10, the back of passes no longer look like the back of the pass and are simply a sheet of information.

Pass backs now display the pass's description which was previously only used by accessibility features. For older passes, we defaulted this to the template name, but we now support customizing this just like you do the Organization Name field under the Pass Options.

When sending passes via iMessage, the apple-touch-icon is used as the preview image when links are sent. If you use our whitelabel service, you can now submit your own custom icon to be used instead of the PassSource icon.

Starting with iOS 9, Passbook is being renamed "Wallet". Apple's goal is to solve the problem of overstuffed wallets.

Apple reminds us that passes may look different on different devices (for example,  WATCH supports Passbook, but does not show strip images and only shows the pass front.

The horrible experience with paper loyalty cards has been identified by Apple, and their solution is to transmit loyalty information along with  Pay. Of course this requires the merchant to support  Pay and integrate their loyalty program with their terminal/POS. This uses a proprietary Value Added Services protocol.

Support for Discover cards and additional payment cards is now also supported, however, this requires being an  Pay merchant and will not work for small business gift cards.

The biggest change is that starting with iOS 9, passes support Code 128 1D barcodes! However, this only works in iOS 9 and requires a compatible optical barcode scanner. If you choose to use Code 128 as your barcode format, we will set the format to PDF417 for iOS 6-8. We've already added support for this option though you will only see it if you are running iOS 9 or later.

At the labs, we asked the Passbook engineers about several issues, and this is what we found out:

Is it possible to use Apple Pay from a website? Apple: No

How are payment passes created? Payment passes must be set up via a merchant authentication service through Apple and then created and installed from a native bank app.

Is there a way to quickly delete a bunch of passes? Apple: No

We asked why UIWebView doesn't natively handle Passbook passes (meaning 3rd party apps that have a built-in web browser need to add a couple lines of code to properly handle Passbook passes). If this bothers you, consider filing a bug report (if you're a developer) or sending feedback. If you file a bug report, you can simply say duplicate of radar://21314226. This is a known bug with UIWebView and Apple has no plans to fix it. Their solution is to use SFSafariViewController available starting in iOS 9.

We have developed a workaround that can be used in iOS 6+ but requres the app developer to add some code to handle it manually. If there's an app that should have this support (like Twitter or Google or Pinterest), we suggest contacting them to put pressure on them to add in support. All they need to do is follow these simple instructions: // 1. Add the PassKit framework to the project if it isn't already. #import <PassKit/PassKit.h> // 2. Set up a delegate for the UIWebView (for example the view controller launching the UIWebView) <UIWebViewDelegate> // 3. Add a class variable to cache the UIWebView requests NSURLRequest *_lastRequest; // 4. Set the delegate self.webView.delegate = self; // 5. Add the callback to grab all requests and cache in case of failure - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { _lastRequest = request; return YES; } // 6. Add the failure callback and re-fetch the URL to see if it is a pass and if so, present the pass to the user - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { // try to get headers in case of passbook pass NSOperationQueue *queue = [[NSOperationQueue alloc] init]; [NSURLConnection sendAsynchronousRequest:_lastRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { // check for PKPass if ([response.MIMEType isEqualToString:@"application/vnd.apple.pkpass"]) { NSError *error; PKPass *pass = [[PKPass alloc] initWithData:data error:&error]; if (error) { NSLog(@"Error: %@", error); } else { PKAddPassesViewController *apvc = [[PKAddPassesViewController alloc] initWithPass:pass]; [self presentViewController:apvc animated:YES completion:nil]; } } }]; }