【问题标题】:iOS Background Fetch Not Working Even Though Correct Background Mode Configured即使配置了正确的背景模式,iOS 背景提取也不起作用
【发布时间】:2015-06-18 05:59:20
【问题描述】:

我的应用启用了后台模式并选中了 Background Fetch,并且我验证了 plist 包含适当的 fetch 模式。

我还配置了间隔如下:

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);
}

我尝试去 Debug->Simulate Background Fetch,但无论如何它永远不会进入performFetchWithCompletionHandler。我还尝试在选中“由于后台获取事件而启动”选项的方案下运行该应用程序。在此方案下运行只需像往常一样在模拟器中启动应用程序,无需调用performFetchWithCompletionHandler

有什么想法吗?

谢谢!

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

编辑 2: 我的错误报告刚刚关闭,因为它与另一个概述相同问题的错误报告重复。仍然没有任何信息确认该问题与模拟器有关。

编辑 3: Xcode 6.4 Beta 2 发行说明中没有提及修复。 :-(

【问题讨论】:

  • Xcode 刚刚坏了。
  • @Tobias 你的意思是断言这个问题是孤立的 Xcode 而不是发布版本中的问题?或者你只是在做一个一般性的声明,即 Xcode 是……坏了。 :-)
  • 只是肚子疼。目前,我正在尝试在设备上的调试版本中测试 Background Fetch。它所做的只是println("Background Fetch"); completionHandler(UIBackgroundFetchResult.NewData)。到目前为止,我还没有在我的设备日志中看到该声明。
  • 我刚刚确认您可以在设备上使用调试版本测试后台提取,方法是编辑方案、选择运行、选择选项并选中“由于后台提取事件而启动”跨度>
  • 我只是将该信息放在答案中,以便添加视觉效果。希望它会帮助那里的人。

标签: ios xcode swift background-process


【解决方案1】:

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

  1. 编辑您的方案
  2. 选择运行
  3. 选择选项
  4. 选中“由于后台提取事件而启动”选项
  5. 插入您的 iOS 设备并在其上运行应用程序。它在 iOS 模拟器中不起作用。

【讨论】:

  • 感谢托拜厄斯!你拯救了我的一天:)!
  • 很高兴我能帮上忙。我对发送一个构建而没有进行任何测试感到害怕。
  • 当我启用“由于后台提取而启动”时,它不会在设备上启动应用程序,为什么会这样?我需要手动点击应用程序。
  • @AvijitNagare 它正在模拟后台获取事件,当应用程序处于前台时不会发生。
  • @AvijitNagare- 进一步澄清,后台获取的目的是在后台进行工作,例如下载远程内容,而不是将您的应用程序带到前台.这允许您在用户忙于在他的设备上做其他事情时为他做有用的任务。在 iOS 中没有办法强制你的应用程序到前台(如果有的话,用户会在他们第一次这样做的时候删除你的应用程序,而他们正处于重要的事情中间)。而是发布通知 - stackoverflow.com/questions/22930259/…
【解决方案2】:

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

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

请改用 iOS 模拟器中的菜单命令。 (20145602)"

【讨论】:

  • 哇,这看起来很有希望......虽然我似乎无法在模拟器中找到菜单命令。我在模拟器的调试菜单中看到的只是“触发 iCloud 同步”。
  • 实际上这条评论根本没有帮助。我也找不到菜单命令。苹果应该更新他们的参考资料
  • @VinhTran 正确。苹果失败。我向他们提交了错误报告,但谁知道这需要多长时间。 IMO 发布不允许测试核心功能的 IDE/SIM 是完全不可接受的。我认为问题不仅仅是模拟器,因为我开始在我的应用程序中看到一些行为,这表明后台获取在发布版本中也不起作用。
【解决方案3】:

您可以通过Houston创建自己的后台获取推送通知到您的真实设备

  1. 安装休斯顿:打开终端应用程序并使用sudo gem install houston
  2. 为您的应用程序创建 PEM 证书Generate .pem file Used to setup Apple PUSH Notification
  3. 获取您的设备令牌

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

  1. 运行终端并使用

普通推送通知: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 应用的更多选项:

  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'

【讨论】:

  • 使用推送通知不是后台抓取吗?
  • @Tobias 是的,这是推送通知,但是 APN 中有一个选项,表示后台获取标志
  • 感谢您的信息。没有意识到 APN 可以强制进行后台提取。
【解决方案4】:

Xcode 8.3.2 中不存在这个问题。 Debug->Simulate Background Fetch 完成了它的工作。它甚至可以在模拟器上运行。

【讨论】:

    【解决方案5】:

    这个方法被调用了。

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

    }

    你忘了在completionHandler之后写@escaping

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-25
      • 1970-01-01
      • 2013-10-19
      • 2022-01-04
      • 1970-01-01
      • 2011-08-27
      • 2011-07-01
      相关资源
      最近更新 更多