代码之家  ›  专栏  ›  技术社区  ›  hannes

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

  •  1
  • hannes  · 技术社区  · 9 年前

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

    谢谢你的帮助, 汉纳斯

    4 回复  |  直到 9 年前
        1
  •  4
  •   Darko    9 年前

    您想要的是“后台获取”,从iOS 7开始提供:

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

        2
  •  3
  •   Max    9 年前

    是的,可以在iOS中启动后台进程。也可以每30分钟启动一次此过程。你需要设置两件事!您需要每隔30分钟向服务器发送一次静默推送

    此静默推送启动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()
    }
    }
    

    当downloadTask成功完成时

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

    将被调用,您可以处理数据

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

    您也可以使用NSURLSessionDataTask执行此操作

        3
  •  0
  •   Alex    9 年前

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

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

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

        4
  •  0
  •   Shaon    5 年前

    对于背景

    在视图中,DidLoad()方法

     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!")
    }