Passbook 产生 PKPass 错误

Dra*_*ula 5 objective-c ios ios6 passbook ios7

我在我的应用程序中添加了存折,当系统是iOS6.0时它可以正常工作。当系统是iOS7.1时它出现错误。

在此处输入图片说明

我检查代码发现

PKPass *newPass = [[PKPass alloc] initWithData:passData error:&error];
Run Code Online (Sandbox Code Playgroud)

在iOS6.0中生成PKPass时得到一个正确的PKPass,当系统是iOS7.1时得到一个nil。

错误包含消息是:

错误域=PKPassKitErrorDomain 代码=1“无法读取通行证,因为它无效。” UserInfo=0x175cd2f0 {NSUnderlyingError=0x175c2c10 “不止一个字段有键 'phone'。字段键必须是唯一的。”, NSLocalizedDescription=无法读取通行证,因为它无效。}

存折的数据我从服务器上得到的。代码如下

- (void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
[self.connectionData appendData:data];
}
Run Code Online (Sandbox Code Playgroud)

将数据写入文件后,代码如下:

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask,YES);
NSString* filePath  = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"pk.pkpass"];

if ([self.connectionData writeToFile:filePath atomically:YES]) {

    if (![PKPassLibrary isPassLibraryAvailable]) {

        UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"Error"
                                                     message:@"PassKit not available"
                                                    delegate:nil
                                           cancelButtonTitle:@"Pitty"
                                           otherButtonTitles:nil];
        [alert show];
        [alert release];

        return;
    }
}
Run Code Online (Sandbox Code Playgroud)

写入文件后我想显示它,代码如下:

    NSString* passFile = [[NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask,YES) objectAtIndex:0] stringByAppendingPathComponent:name];

NSString * newPassStr = [[NSString alloc] initWithContentsOfFile:passFile encoding:NSUTF8StringEncoding error:nil];

NSData *passData = [NSData dataWithContentsOfFile:passFile];

NSError* error = nil;
PKPass *newPass = [[PKPass alloc] initWithData:passData error:&error];
Run Code Online (Sandbox Code Playgroud)

然后当我得到 PKPass *newPass 在 iOS7.1 中出现错误。在 iOS6 中没问题。

谁能告诉我原因?非常感谢。

Pas*_*Kit 4

您的错误消息告诉您需要知道的一切。

您的 pass.json 中有重复的键。您的backFields数组和您的auxiliaryFields数组都包含带有 key 的项目phone。根据Passbook Package Format Reference,字段键必须是唯一的。

我注意到这个通行证是使用 Passsource 生成的。您可能想让kudit(Passsource 开发人员)知道,因为他的服务不应允许生成这样的通行证。