Your background uploads should work across network flakiness. If you get back an error state for one of your uploads in -didCompleteWithError:
, you can just queue the same upload again. It won't matter if you are on the network when you do this, the OS should take care of uploading when it can/wants-to.
Background fetch comes when it comes, though plugged-in and on-wifi are good kick-offs. You'll surely have some connectivity when the fetch callback occurs. You should be able to queue background upload tasks during the fetch callback.
You could also register for the "lite" version of background geofencing, which will background notify you whenever a new network is detected or the cell tower switches. Cf. -[CLLocationManager startMonitoringSignificantLocationChanges]
.