iosavplayerios-background-mode

How to track the time a user listens an specific podcast


I have an iOS app that is about podcasts and I want to track how long a user listens every podcast. I have tried the basic - when a user plays I save the timestamp and when stops it sends an event with the timestamp difference but it obviously doens't work because there's many edge cases.

I have issues to know when a user has the app in background and stops listening at some point through the the system controls. Also when the user or the system kills the app without tapping on "pause" or "stop". I think these 2 cases are my main non-tracked cases so far.

Any idea how can I build a working solution? I don't want/can't pay an external service - I am merely relying on Firebase.

Thanks!


Solution

  • You can override applicationWillTerminate method in your app, and save a current user progress to UserDefaults.

    As docs say, you have few seconds to do it:

    This method lets your app know that it is about to be terminated and purged from memory entirely. You should use this method to perform any final clean-up tasks for your app, such as freeing shared resources, saving user data, and invalidating timers. Your implementation of this method has approximately five seconds to perform any tasks and return.

    Your code can look like this:

    var player: AVPlayer!
    
    func applicationWillTerminate(_ application: UIApplication) {
        UserDefaults.standard.setValue(player.currentTime().seconds, forKey: "curPlayerTime")
    }
    

    Then, on application launch, you can restore it:

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    
        if let lastPlayerTime = UserDefaults.standard.value(forKey: "curPlayerTime") as? Double {
              // update your player
        }
    
        return true
    }