应用程序处于后台时的iOS通知

时间:2016-02-13 16:55:20

标签: ios swift notifications background-process

我想知道是否可以在iOS中启动后台进程。在我的后台进程中,每隔30分钟应该调用一个函数,以便在我的数据库中检查是否有新消息等,以便发送通知。我不想实现推送通知。 我不知道在哪里实现此功能,以及是否存在覆盖功能,例如在AppDelegate中。

感谢您的帮助, 汉纳斯

4 个答案:

答案 0 :(得分:4)

你想要的是"背景提取"并从iOS 7开始提供:

https://www.objc.io/issues/5-ios7/multitasking/

答案 1 :(得分:3)

是的,可以在iOS中启动后台进程。也可以每30分钟启动一次此过程。你需要设置两件事!您需要每30分钟向您的服务器发送一次无声推送(例如,在Parse中使用Cloud Code作业(警告!由于Parse将于2017年1月关闭,因此在此平台上并不聪明)

此静默推送会启动NSURLBackgroundSession,从服务器提取所需数据并对其进行处理。

Your need to activate this in the project settings

1。)在AppDelgate中添加此项以接收推送

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
{
    application.registerForRemoteNotifications()
}

当你从服务器或其它东西推送时,将调用以下委托方法:(所以在你的appDelegate中添加它)

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void)
     {
        NSLog("Silent Push recevied")
        let vc = ViewController()
        vc.pullData() // call your pullData method...
     }

现在调用的方法需要从数据库中提取数据。在这种情况下,您可以使用NSURLSession下载所需的任何内容。

2。)转到处理数据的ViewController并添加: 带有所需委托方法的NSURLSessionDownloadDelegate委托

class vc : ViewController, NSURLSessionDownloadDelegate{
func viewDidLoad()
{
super.viewDidLoad()
}

func pullData()
{
let url = NSURL(string: "http://example.com")!
let urlRequest = NSURLRequest(URL: url, cachePolicy: .UseProtocolCachePolicy, timeoutInterval: 5)
let backgroundSessionConfiguration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier("backgroundSessionIDX")
backgroundSession = NSURLSession(configuration: backgroundSessionConfiguration, delegate: self, delegateQueue: NSOperationQueue.mainQueue())
let task = backgroundSession.downloadTaskWithRequest(urlRequest)
            task.resume()
}
}

下载任务成功完成后

func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didFinishDownloadingToURL location: NSURL)
{
}
将调用

,您可以处理数据

let path = location.path
let data = NSFileManager.defaultManager().contentsAtPath(path!)

您也可以使用NSURLSessionDataTask

执行此操作

答案 2 :(得分:0)

我建议你看一下Apple's documentation on Background Execution。它说明了在后台运行代码的所有可能方法。每种方法都有它的局限性,优点和缺点,还有Apple mentions

  

在iOS中,只允许特定的应用类型在后台运行

如果您的iOS应用程序无法通过某些设备通过蓝牙(BTLE或MFi认证设备)进行通信(您可以将该蓝牙设备配置为每隔30分钟向iOS设备发送一些事件并在发生这种情况时执行您的代码),那么每30分钟运行一些代码的最可靠方法是使用静默推送通知 可以配置静默推送通知,以便它们不会向用户显示,但允许您的代码运行。推送通知的限制是用户需要有效的互联网连接才能接收它们,并且用户需要授予您的应用程序使用推送通知的权限(您可以在应用首次运行时请求此通知)。 我注意到你的问题提到我不想使用推送通知,但不幸的是你在这里没有选择。

答案 3 :(得分:0)

背景

在您的viewDidLoad()方法中

 let notificationCenter = NotificationCenter.default
 notificationCenter.addObserver(self, selector: #selector(appMovedToBackground), name: UIApplication.didEnterBackgroundNotification, object: nil)

在您的ViewController中添加此方法

 @objc func appMovedToBackground() {
   print("App moved to background!")
 }

对于Forground

  override func viewDidLoad() {
    super.viewDidLoad()


    let notificationCenter = NotificationCenter.default
    notificationCenter.addObserver(self, selector: #selector(appMovedToForground), name: UIApplication.willEnterForegroundNotification, object: nil)

 }

@objc func appMovedToForground() {
   print("App moved to forground!")
}