2015-12-02 48 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分鐘後,後臺任務將失效,應用程序將進入非活動模式。 –

相關問題