Memo Passbook for iOS7

Passbook 備忘

Goto Developer Member Center

Adding a Pass Type ID

Registering a Pass Type ID

Enable Passbook in Xcode

Creating a Cert

First Creating a Cert Signing Request

Open Keychain Access

Set Cert Info

Upload CSR file

Download your Cert

Checking PassTypeID

Creating the Pass Package

To find your Team ID

Dir Structure

Edit the pass.json

"passTypeIdentifier" : "pass.com.your.id",
"teamIdentifier" : "RCXXXX77XX",

To Sign and Compress the pass raw data.

signpass -p Pass.raw

Now you can get your Pass.pkpass file.

Get a pass from server

Synchronous

NSData *passData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:PASS_URL]];
NSError *error = nil;
PKPass *pass = [[PKPass alloc] initWithData:passData error:&error];
if(error) {
  UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"OK"otherButtonTitles:nil];
  [alertView show];
} else {
  PKAddPassesViewController *pkvc = [[PKAddPassesViewController alloc] initWithPass:pass];
  pkvc.delegate = self;
  [self presentViewController:pkvc
                     animated:YES
                   completion:^{
                     // Do any cleanup here
                   }
   ];
}

Asynchronous - NSURLConnection

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:PASS_URL] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *passData, NSError *err) {
NSError *error = nil;
PKPass *pass = [[PKPass alloc] initWithData:passData error:&error];
if(error) {
  UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
  [alertView show];
  return;
}
PKAddPassesViewController *pkvc = [[PKAddPassesViewController alloc] initWithPass:pass];
pkvc.delegate = self;
[self presentViewController:pkvc
                   animated:YES
                 completion:^{
                   // Do any cleanup here
                 }
 ];
}];

Asynchronous - NSURLSession

NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionTask *task = [session dataTaskWithURL:[NSURL URLWithString:PASS_URL] completionHandler:^(NSData *passData, NSURLResponse *response, NSError *err) {
  NSError *error = nil;
  PKPass *pass = [[PKPass alloc] initWithData:passData error:&error];  
  if(error) {
    dispatch_async(dispatch_get_main_queue(), ^{
      UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
      [alertView show];
    }
    return;
  }
  PKAddPassesViewController *pkvc = [[PKAddPassesViewController alloc] initWithPass:pass];
  pkvc.delegate = self;
  [self presentViewController:pkvc
                     animated:YES
                   completion:^{
                     // Do any cleanup here
                   }
   ];
}];

[task resume];

Example Passes