Is it possible to set (Linux) cron like jobs in iOS apps (any version including iOS 8) that run at set times regardless of whether the app is open or in background mode?
For example, I'd like to run a network GET operation from an iPhone at 11:00 and 23:00. If the job doesn't run because the phone is powered down, that's ok.
There is no way to access the underlying cron on an non jailbroken device.
The closest would be UILocalNotification - effectively an alert with a specific fire date, or Background Fetch in iOS 7.
Background fetch lets your device wake on a requested interval to do some network activity. However you're still at the mercy of the system.
http://www.appcoda.com/ios7-background-fetch-programming/
Related
It seems like older versions of iOS allowed your app to run for 10 minutes in the background. Now it seems like iOS only allows your app to run for a maximum of 3 minutes. I haven't found any documentation mentioning when, or in which versions, this changed, or any estimates provided by Apple for how long your app can run in the background.
I need to be able to run in the background, because my app is connected to an external device via TCP. I already know about the hacks you can do with VOIP and playing silent audio (both will get your app rejected).
Is there anything I can do to get my app to keep running in the background longer than 3 minutes?
We haven’t had the old 10 minute window for years so that is simply no longer applicable. That was reduced to 3 minutes in OS 7, and further reduced to 30 seconds in iOS 13. (There is a new concept of background tasks, for running tasks longer than 30 seconds, but the the OS will run these at its own discretion, e.g. at night, when the user is charging their device, so that’s not really applicable here).
The short answer to your question is that you cannot submit apps to the store that run in the background indefinitely unless it’s one of a very limited list of permitted background modes.
If you can go to the “Signing & Capabilities” tab of your target and add “Background Modes” and you can see the list of alternatives:
So, with the caveat that you cannot do precisely what you asked, here are a few observations:
The “External accessory communication” background mode (see ExternalAccessory) seems promising, but that’s for bluetooth or wired connections only. So unless you can refactor/reengineer how your devices communicates, that is likely not a viable solution.
There’s an interesting question of whether just keeping the app running in the foreground might be helpful (e.g. judicious use of idleTimerDisabled). I know this solves a different problem (and should be used only where essential), but perhaps it’s option for you.
If your external device is Internet-enabled and you want it to inform the app of some event, perhaps you can have it communicate its intent to some web service that then triggers an APNS push notification that your device can receive.
Bottom line, you can’t do what you ask, but if you edit your question with more details about the nature of the device and what your iOS app wants to do with that device, we might be able to provide better counsel. But in answer to the general question “can I just keep app running perpetually in the background”, the answer is “no.”
I have a Timer which plays AVAudio at a specific time while the screen is locked (app in foreground when locked and plist setting 'Application does not run in background' set to YES).
When I run my code while my iPhone is connected to Xcode it works as desired, playing audio while locked even when the iPhone has been locked for hours.
Now if I disconnect my iPhone and just open the app by tapping the icon the audio won't be played if it's set for more than a minute.
Is there a difference that causes this problem? If I would publish my App to the AppStore which behaviour would my users get?
That 'Application does not run in background' flag is a very old flag that means your app does not support multitasking and should be terminated when the user presses the home button. There's no good reason I can think of to set that flag on a newly developed application. Unless you understand exactly what it's for and are positive that setting it to yes is the correct thing to do, don't do that.
(That flag was added when iOS 4 was released, to allow apps that could not handle multi-tasking to request the old terminate-on-home-button behavior from iOS 3. Given that we're now 6 major iOS releases from iOS 4, it seems outdated.)
So remove that flag. It probably doesn't have any impact on your question, but remove it or set it to no in any case.
If you want to run a timer while the phone is locked and play sounds at designated times then you will probably need to set your app up as a background sound player, and ask for more background time when you get a message that you are going to the background.
That being said it's likely that Apple will reject your app. Running a timer from the background means that the processor on the phone has to run at full speed all the time, which will DRAMATICALLY reduce battery life.
Apple only allows a very small subset of apps to run in the background, and then only under specific circumstances (like a background sound playing app when the user is actively listening to music, or a navigation app that is actively tracking the user's location and notifying them when it's time to make a turn to follow directions.)
Should be no different. If you'd like to feel what do your users' feel then you can publish it to TestFlight which is the best app beta test environment. Find some testers or try it yourself.
The directions should be to verify the playing logic and the sound file relationship which link to the connection.
I am testing the behavior of my app concerning the enforced timeout of iOS which stops any app at latest 3 minutes after it has been killed by the user. It is very tedious to wait for this timeout whenever I want to check my functionality. Does anybody know if it is possible to reduce this timeout for testing purposes?
[Edit]
To sum up the comments below: I am trying to make my app run forever in background as described here and also be able to be reanimated after the user or iOS has killed it. In order to check this, I actually have to kill the app, let it be reanimated, and then see if it survives the 3-minute time limit of iOS.
My current "test cycle" is:
1) Deploying the app
2) Killing it manually with double-click and swiping it away
3) Activating flight mode
4) Deactivating flight mode (to force a significant location change which restarts the app)
5) Waiting for three minutes to see if the app survives.
How would I shorten the 3-minute timeout of step 5?
We are working on an ios phonegap app where we would like to add an alarm clock. We know that we have to activate the background mode options in the info.plist file and that the background service is restricted to 10 minutes life time in ios 8. We tried to extend the 10 minute range with several plugins but could not get it working. Our app is requesting data asynchronously from a web server and checks them against the data on the mobile device. If the the data is equal a radio stream should start. Do you have any idea how we could get this running?
Greetings
Alex
I built a reminders app, it wont work in background mode, and warns reminders via push notification.
But starting from the moment the User turn off your device (iphone or ipad) and turn on, my app is not this more in background mode, in which case reminders are no longer advised.
In this case, I like to find a way to make my app starts with the device but in background mode (the same happens with windows programs, android apps, and osx programs).
You are focusing on the wrong question. The question you should focus on is, "How do I ensure that my app's reminders will be delivered to my users even after a device restart?"
The answer is to set a Local Notification with a future delivery date, at the point the reminder is created, which of course is while your app is running. There is no need for your app to be running, in either the background or the foreground, for this notification to then be delivered at the specified time.
check project setting in .plist set UIApplicationExitsOnSuspend is YES