system.CachesDirectory is NOT backed up by iCloud. The assumption is that if it's in system.CachesDirectory, it's content that can be re-downloaded from the Internet and there is no guarantee the file will not be deleted by the system.
You can either use a file that exists in system.DocumentsDirectory that your app creates when it runs to detect if the user has already run the app or you can use system.setPreferences() to set a "hasRun = true" flag.
Now the problem is if someone deletes the app. The sandbox files are cleared. The iCloud backups are removed and I'm pretty sure the system.setPreferences() are cleared as well. If someone deletes the app, they will lose any knowledge that they have previously purchased/ran your app.
There isn't much you can do here. One possibility that might work, but will take time and I'm not sure how well Apple would take this, but you could issue an update to your app that has a "Free" in-app purchases and notify the user, they need to get the free IAP since you plan to make the the app free with Ads in the future and by getting this free IAP then they will be assured to be able to keep the app for free in case they delete the app in the future.
Then give them a period of time (say a month or so) when that IAP becomes a paid item, then you can make the app free with paid IAP. Then after that, they can click the required "Restore Purchases" button if they do delete the app and re-install it later to get their purchase/unlock back.
Again, I have no idea if Apple would go for this or not. It might not capture everyone but it seems like it's a way to get your paid people in the IAP system.
The other thing would be recording some information about the user and their device on a remote server that you could check, but then you would have to deal with GDPR data tracking rules if you plan to have your app available to European Union customers.