【问题标题】:Notification not occurring for added passes in Passbook在存折中添加通行证时未发生通知
【发布时间】:2013-01-11 01:45:15
【问题描述】:

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

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

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

ViewController.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:我真的希望我在这里缺少一些简单的东西。

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

【问题讨论】:

  • 在我的情况下,没有被调用的唯一原因是因为我没有将 PKPassLibrary@property 包裹起来(在 ARC 下)。

标签: ios xcode passbook


【解决方案1】:

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

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

尼克。

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

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

【讨论】:

  • 谢谢,我已经更新了更完整的代码和信息。使用 GCD 主队列,因为这是 Apple(非常稀疏的)Passbook 文档中推荐的方法。
【解决方案2】:

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

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

同时,在 Xcode..在我的目标的“权利”部分的摘要部分中,我可以刷新 Passes 并查看新的 pass 类型 ID。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-14
    • 1970-01-01
    相关资源
    最近更新 更多