2015-12-02 47 views
1

我有一个程序会记录当前正在播放的歌曲的歌曲标题和艺术家在iTunes应用程序中,但是当我点击主页按钮时,应用程序不再记录标题或艺术家。后台函数的工作原理是因为当我单击测试函数的主页按钮时,但由于某种原因getNowPlayingItem不起作用。我该如何解决?为什么背景中的功能未被调用?

var musicPlayer = MPMusicPlayerController.systemMusicPlayer() 

    func applicationDidEnterBackground(application: UIApplication) { 
    print("entered background") 

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "getNowPlayingItem", name: MPMusicPlayerControllerNowPlayingItemDidChangeNotification, object: nil) 
    musicPlayer.beginGeneratingPlaybackNotifications() 


    test() 
} 

func test(){ 
     print("Background function working") 
     } 

func getNowPlayingItem() { 
    if let nowPlaying = musicPlayer.nowPlayingItem { 
     let title = nowPlaying[MPMediaItemPropertyTitle] as? String 
     let artisttest = nowPlaying[MPMediaItemPropertyTitle] 
     if let artist = nowPlaying[MPMediaItemPropertyArtist] as? String{ 

      let objectPointer = PFObject(className: "Pointer") 
      let object = PFObject(className: "MasterSongs") 

      // print("Artist: " + artist) 


      let query = PFQuery(className: "Pointer") 
      query.findObjectsInBackgroundWithBlock({ 
       (objects: [AnyObject]?, error: NSError?) -> Void in 
       var objectIDs = objects as! [PFObject] 

       for i in 0...objectIDs.count-1{ 
        self.Parsearray.append((objectIDs[i].valueForKey("title") as? String)!) 

        // print(self.Parsearray) 
       } 


       if self.Parsearray.contains(title!){ 
        print("already in db") 
       }else{ 
        objectPointer["title"] = title 
        objectPointer["user"] = PFUser.currentUser() 
        objectPointer["artist"] = artist 
        objectPointer.saveInBackground() 


       } 

      }) 




     }else{ 
      let object = PFObject(className: "MasterSongs") 
      object.setObject(title!, forKey: "title") 
      //object.setObject(artist!, forKey: "artist") 
      object.saveInBackground() 

      let objectPointer = PFObject(className: "Pointer") 


      let query = PFQuery(className: "Pointer") 
      query.findObjectsInBackgroundWithBlock({ 
       (objects: [AnyObject]?, error: NSError?) -> Void in 
       var objectIDs = objects as! [PFObject] 

       for i in 0...objectIDs.count-1{ 
        self.Parsearray.append((objectIDs[i].valueForKey("title") as? String)!) 

        // print(self.Parsearray) 
       } 


       if self.Parsearray.contains(title!){ 
        print("already in db") 
       }else{ 
        objectPointer["title"] = title 
        objectPointer["user"] = PFUser.currentUser() 
        objectPointer["artist"] = "No artist found :(" 
        objectPointer.saveInBackground() 


       } 

      }) 





     } 


    } 


} 
+0

当您的应用程序进入后台时,它仅保留30秒。您必须创建后台任务,这将有助于您的应用继续工作3分钟以上。 –

+0

我该怎么做,我可以让应用程序在后台运行超过3分钟吗? – tman0542

+0

它会消耗太多的电池,这是苹果没有正式允许的原因,除非你像位置服务一样使用框架。 (即使在位置服务运行等服务时,只能让屏幕未锁定时运行您的应用程序) –

回答

1

通过这种方式,您可以运行后台任务并让其保持活跃3分钟。 只有当应用程序转到后台时才启动它。

var backgroundTask:UIBackgroundTaskIdentifier? backgroundTask = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler({() -> Void in UIApplication.sharedApplication().endBackgroundTask(self.backgroundTask!) self.backgroundTask = UIBackgroundTaskInvalid })

+0

我在哪里可以调用我的函数并将'NSNotificationCenter.defaultCenter()。addObserver(self,selector:“getNowPlayingItem”,name :MPMusicPlayerControllerNowPlayingItemDidChangeNotification,object:nil) musicPlayer.beginGeneratingPlaybackNotifications()'方法? – tman0542

+0

只是保持原样并添加后台代码'applicationDidEnterBackground'方法。这段代码让应用程序能够主动运行3分钟。一旦活着,其他过程将继续。 3分钟后,后台任务将失效,应用程序将进入非活动模式。 –

相关问题