0

我只是想在将通行证添加到存折时收到通知。

需要注意的一件事是,我还尝试使用我使用与我的应用程序使用的不同的苹果开发帐户生成的通行证。我试图弄清楚这是否是问题的一部分。

这是 3-tab 应用程序中的一个 VC。

视图控制器.m:

@interface ViewController ()
{
    PKPassLibrary *_passLibrary;
    NSArray *_passes;
}
@end

“viewDidLoad”:

- (void)viewDidLoad
{
    //init passbook
    _passLibrary = [[PKPassLibrary alloc] init];

    _passes = [_passLibrary passes];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(passLibraryDidChange:) name:PKPassLibraryDidChangeNotification object:_passLibrary];
}

和我的通知处理程序:

- (void)passLibraryDidChange:(NSNotification *)notification
{
    dispatch_async(dispatch_get_main_queue(), ^{
      NSLog(@"%@", @"passes added");
    });
}

当我在 iOS 模拟器中运行应用程序时,一切都按预期工作,我可以在 Xcode 中看到控制台的日志输出。

当我在设备上运行时,添加 Pass 时不会调用通知。在设备上,我什至无法列出任何通行证。

更奇怪的是,当我从存折中删除通行证,然后重新进入应用程序时,会调用通知。

ps:我真的希望这是我在这里想念的简单的东西。

编辑:更新了更多信息和更完整的代码示例

4

2 回答 2

0

您似乎没有保留 PKPassLibrary 实例的句柄。在你的 UIViewController 子类上创建一个强大的@property。Alloc+Init 属性并配置在 viewDidLoad 中监听的通知(所以它只会完成一次)。

在某处的 UIApplication 上设置它可能更合适,但这取决于应用程序逻辑以及您的 ViewController 如何适合您的 UI(例如,当您仍然需要访问 PassKit 通知时,它是否被替换或释放?)...</ p>

缺口。

PS你有什么理由如此明确地在GCD主队列上进行NSLogging?这只是从一些 UI 反馈中遗留下来的吗?

PPS 在您重新进入应用程序时看到通知非常有意义,因为此时会调用 viewWillAppear 并且新的 PKPassLibrary 实例将立即触发正在等待的通知。不知道为什么它在模拟器中工作 - 一定是偶然的。

于 2013-01-11T16:28:40.203 回答
0

它归结为从供应配置文件的同一来源创建的通行证类型标识符。

然后我必须获取新的通行证并将它们添加到我的钥匙串中,然后使用新的通行证类型标识符重新创建实际通行证。

同时,在 Xcode..在我的目标的摘要部分的权利部分中,我可以刷新通行证并看到新的通行证类型 ID 进来了。

应用程序运行后,我现在会收到任何更改(加法/减法/等)的正确通知。

我还需要确保我的 _passLibrary 被正确保留。

于 2013-01-11T21:00:15.510 回答