即使已配置正确的背景模式,iOS背景提取也不起作用

时间:2015-04-13 01:26:06

标签: ios xcode swift background-process

我的应用程序启用了背景模式,并选中了后台获取功能,并且我验证了plist包含适当的获取模式。

我还按如下方式配置了间隔:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    application.setMinimumBackgroundFetchInterval(UIApplicationBackgroundFetchIntervalMinimum);
    return true;
}

我已经按如下方式添加了处理程序:

func application(application: UIApplication, performFetchWithCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
    // Get some new data here
    completionHandler(UIBackgroundFetchResult.NewData);
}

我尝试过调试 - >模拟背景提取,但无论它从未进入performFetchWithCompletionHandler。我还尝试在一个方案下运行应用程序,该方案选中了“由于后台获取事件而启动”选项。在此方案下运行只需在模拟器中照常启动应用程序,而无需调用performFetchWithCompletionHandler

有什么想法吗?

谢谢!

编辑:这似乎也影响了我的应用的发布版本,因此它可能无法与模拟器隔离。我正在运行Swift 1.2。

编辑2:我的错误报告刚刚关闭,因为它是另一个错误报告的副本,概述了同样的问题。仍然没有确认问题与模拟器隔离的信息。

编辑3:未提及Xcode 6.4 Beta 2发行说明中的​​修复程序。 : - (

5 个答案:

答案 0 :(得分:27)

这是我发现测试后台获取的唯一方法。

  1. 编辑您的计划
  2. 选择运行
  3. 选择选项
  4. 选中“因背景提取事件而启动”选项
  5. 插入iOS设备并在其上运行应用程序。它在iOS模拟器中不起作用。
  6. Visual of Step 2-4

答案 1 :(得分:3)

查看XCode发行说明:https://developer.apple.com/library/ios/releasenotes/DeveloperTools/RN-Xcode/Chapters/Introduction.html

“Xcode菜单命令Simulator Background Fetch不起作用。

使用iOS模拟器中的菜单命令。 (20145602)“

答案 2 :(得分:2)

您可以通过Houston

为您的真实设备创建自己的后台抓取推送通知
  1. 安装休斯顿:打开终端应用并使用sudo gem install houston
  2. 为您的应用Generate .pem file Used to setup Apple PUSH Notification
  3. 创建PEM证书
  4. 获取您的设备令牌

    func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData)

    1. 运行终端并使用
    2. 常用推送通知:apn push "<your_device_token>" -c /path/to/apple_push_notification.pem -m "Hello from the command line!"

      用于后台抓取推送通知:apn push "<your_device_token>" -c /path/to/apple_push_notification.pem -n

      apn app的更多选项:

        c.option '-m', '--alert ALERT', 'Body of the alert to send in the push notification'
        c.option '-b', '--badge NUMBER', 'Badge number to set with the push notification'
        c.option '-s', '--sound SOUND', 'Sound to play with the notification'
        c.option '-y', '--category CATEGORY', 'Category of notification'
        c.option '-n', '--[no]-newsstand', 'Indicates content available for Newsstand'
        c.option '-d', '--data KEY=VALUE', Array, 'Passes custom data to payload (as comma-delimited "key=value" declarations)'
        c.option '-P', '--payload PAYLOAD', 'JSON payload for notifications'
        c.option '-e', '--environment ENV', [:production, :development], 'Environment to send push notification (production or development (default))'
        c.option '-c', '--certificate CERTIFICATE', 'Path to certificate (.pem) file'
        c.option '-p', '--[no]-passphrase', 'Prompt for a certificate passphrase'
      

答案 3 :(得分:2)

调用此方法。

 func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {

}

你忘了在completionHandler

之后写@escaping

答案 4 :(得分:0)

Xcode 8.3.2 中,此问题不存在。 调试 - &gt;模拟后台提取完成其工作。它甚至可以在模拟器上运行。