How to know how much time has a user spent in my iOS App?


#1

I want to know how much time does a user spend in my app, i.e. how active is a user in my App.

Please do let me know if someone has implemented the same in your app and how you guys have leveraged CleverTap for its analytics.


How to track Session time in CleverTap?
#2

Hey,

You can write the below snippet code in your App Delegate file :

  • import UIKit
    import CleverTapSDK

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?
var lastAppLaunchedTime: TimeInterval?
var minSessionMinutes: NSInteger = 20

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    CleverTap.autoIntegrate()
    CleverTap.setDebugLevel(CleverTapLogLevel.debug.rawValue)
    return true
}

func applicationWillResignActive(_ application: UIApplication) {
    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
    // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
}

func applicationDidEnterBackground(_ application: UIApplication) {
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
    
    let currentTS = NSDate().timeIntervalSince1970 // current time stamp
    var sessionTime = Int(currentTS - lastAppLaunchedTime!) // The difference between current time and last time app launched returns the time spent by user
    
    if sessionTime > self.minSessionMinutes*60 {
        sessionTime = 0
    } else {
        CleverTap.sharedInstance().recordEvent("Session Stopped", withProps: ["Session Time":Int(sessionTime/60)])
        sessionTime = 0
    }
}

func applicationWillEnterForeground(_ application: UIApplication) {
    // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
}

func applicationDidBecomeActive(_ application: UIApplication) {
    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
    lastAppLaunchedTime = NSDate().timeIntervalSince1970 
}

func applicationWillTerminate(_ application: UIApplication) {
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}

}

  • In the Dashboard, search event “Session Stopped” with the event property as the Session Time to get the total time the user has spent on the app. You can also search for the Activity name and get the time spent by the user on each Activity as well.

Thanks!


#3

Adding further details to my earlier answer:

  1. The above code snippet only captures the time spent by the user in the foreground mode.

  2. There may be the scenario where you see the Session Stopped as “0, 0.01, 0.55” indicating that the user has spent a few seconds on the Application(in the foreground).

  3. As a best practice and to avoid recording an event Session Stopped with value “0.00”, I would suggest putting a check before making a call to CleverTap, as follows:

.

      // if sending minutes as unit 
       if Int(sessionTime/60) > 0 {
            CleverTap.sharedInstance().recordEvent("Session Stopped", withProps: ["Session Time":Int(sessionTime/60)])
         }
        
        // if sending second as unit
        if Int(sessionTime) > 1 {
            CleverTap.sharedInstance().recordEvent("Session Stopped", withProps: ["Session Time":Int(sessionTime)])
        }

Thanks!