I'll suggest giving it another shot. It really is a game changer (I can't tell what you're doing wrong, but in a few people I've seen it has been about doing a psychological switch. I wrote about it a bit here - https://mnvr.in/beginners-mind, sharing in case it helps you see how you might approach it differently)
> Anyone else find where they are doing anything iOS specific to enable background uploads when you don't ever open the app?
Search for "SyncService.instance.sync" in the code, that's what gets triggered.
The trigger is us sending periodic silent pushes to wake up the app.
> My guess is that as part of the Ente team, you open the app semi regularly, which is enough for the device to give some budget for your cloud sync process to kick off in the background every now and then.
I know what you think, but that's really not the case :) Many our customers are on iOS, they're satisfied with it. There are areas to improve yes - the initial import is the major pain, esp because it is also the customer's first interaction with the app - but the background sync itself is works seamlessly in practice.
Yes, the app does iOS background sync. Many of us (I'm part of the Ente team) are avid users and have a huge photo libraries, and day-to-day, it works seamlessly. We don't need to reopen for it to sync etc. The only time one needs special care is when doing the initial import - at that time, we sometimes need to keep the app running in the foreground for the initial sync to complete.
As the other commenters are mentioning though, this is all black magic at the mercy of Apple. The way we've evolved with our code works now, but who knows what future updates to iOS bring. One thing we've observed that it takes sometimes like say seven days for Apple's on device ML to pick up that the user really wants to use the app, and convince the OS to allow the app to run in the background to sync. But again, this is not something we've needed to worry about as _users_ - we just use it normally as we'd use Apple Photos, and it just works after the initial sync completes.