I am making one application in which the location needs to be updated after every 2 hours from background, i have implemented CLLocationManager and it is working absolutely fine and is calling , however if i implement timer from background for certain time interval it didn't work and if i put the app in sleep mode for that few seconds like 300, it awakes twice or thrice not more than that,when the home button is pressed i stopped the location and after sleep it again start the location update and then again stop ,so how it is possible to get the proper location update after 2 hours plz help
You can use UILocalNotification for updating the Location every 2 hours..
Instances of UILocalNotification represent notifications that an application can schedule for presentation to its users at specific dates and times. The operating system is responsible for delivering the notification at the proper time; the application does not have to be running for this to happen.
Related
I am creating an app where it will send you a local notification every 20 minutes. The problem I am having is once the app goes into background mode, the timer which triggers the function to run which executes some code then sends the user a notification won't run. Is there any alternative way of doing this? This timer runs on a loop, reseting its self every 20 minutes and running a function.
Thanks
Sure. Check out the documentation for UILocalNotification. You can set a fireDate to the exact second when you want the notification to go off. It also has parameters you can use to specify a repeat interval.
You cannot force the user to activate the app to run your function. Once the user taps the notification and your app becomes active, you can then perform all the logic you require (perhaps also including dealing with past "missed" notifications) .
I have a timer app, it counts up for an indefinite amount of time (until the user stops the timer). It works much like the default iOS clock stopwatch.
I have read the articles about being a responsible background app. I don't have any UI changes happening and stop the timer when the app goes in the background and resume the timer upon returning to foreground. The app does send a local notification every 30 minutes or so to remind the user to take a break.
Problem: Without fail my app is terminated after a few hours (between 2-6 or so hours) and the current timer and info is lost.
Things I've tried:
-As aforementioned I changed my app to follow the guidelines of being a responsible background app (before I had the timer UI counting up and also the timer running, even while in background). I thought this would solve the problem since my app isn't using up much memory or doing any intensive tasks.
-I also have tried saving out the data of the current timer (to NSUserDefaults) in ApplicationWillTerminate and then restore it on DidFinishLaunchingWithOptions. It doesn't seem to work. It's almost like my app is force quit or something because if ApplicationWillTerminate was being called then it would save the data and restore it upon the app launching again. Mystery.
-Currently I'm saving an NSDate of the start time of the NSTimer on ApplicationDidEnterBackground, invalidating the timer, and starting the timer and restoring the start time upon ApplicationWillEnterForeground. Still no luck.
The thing is this is affecting a very small percentage of my users--so it's not like it's a problem for everyone, which makes it more confusing. I still want to fix it of course because it's a pretty lame bug--and I've encountered it myself (on an iPhone 5), so it's not necessarily an old iPhone low memory somethingorother problem.
This has really boggled me, I've done my research and also scoured fairly well the stack overflow questions and don't seem to find much of anything to help me.
Any help would be appreciated, feel free to ask more questions or tell me to clarify.
applicationWillTerminate is basically never called. It will not be called when your app is in the background and it gets removed from memory. You should expect your app to be removed from memory if it hasn't been used for a while. How long "a while" is depends on what else the device is doing at the time... Best to use applicationDidEnterBackground: or applicationWillResignActive:.
When your app goes into the background, record your timer's elapsed time (eg: in NSUserDefaults or however you prefer). Also record the current time. When the app comes back into the foreground, look at the two values you recorded and update the elapsed time accordingly, ie:
elapsedTime = savedElapsedTime + (currentTime - timeWentIntoBackground)
There's really no reason your app needs to remain active in the background burning the user's battery just to keep track of seconds ticking by.
Also, don't rely on applicationWillTerminate. Use applicationWillEnterBackground.
I m developing an app in which I have to track the LocationUpdate in the Background as well as in the Foreground but after some time interval in the Background the app stops updating the Location. When I take it back to Foreground it starts again and when I put it in background after some time interval it stops again.
I am not able to find the issue please help me if possible.
You have to specify that your app need location updates when in background in plist
Here is apple docs Getting Location Events in the Background
and here is a tutorial for this.
And I would recommend you to read Location Awareness Programming Guide
disable distance filter
set desired Accuracy to best
use - (void)startUpdatingLocation
Now in ios6: there is
locationManager:didUpdateLocations:
in ios5 there is
locationManager:didUpdateToLocation:fromLocation:
the first delivers the locations buffered in the background and keeps your application sleeping and wakes it up with a sequence of fixes, while the ios5 method delivers the location all of the time.
This is a rather general question on what actually happens when an app returns from background. I have a user telling me that on opening my app that he has not used for over a day, he will still be shown the same view that he had before he closed the app (by "closed" I mean he just hit the home button to send it to background, NOT hold and then tap the cross button to kill the app completely).
I was on the impression that if an app is restored from the background after a long time, it will be reloaded completely (showing splash screen and everything), as in the cases when I opened facebook or gmail app after I haven't used it for some time.
So my question is, do I have to implement a check somewhere on the period of time passed since my app was sent to background and reset everything when it goes over a certain threshold, or is that supposed to be handled by iOS itself... and of course if a user sent my app to the background and return after 2 minutes I would not want to refresh
You might have to handle that in your appdelegate methods by setting a timestamp. Since multitasking is enabled in iPhones, it will start from the same screen again. An app can be in background for a long time until user decides to kill the app.
Some of the delegate methods are
- (void)applicationWillResignActive:(UIApplication *)iApplication;
- (void)applicationDidEnterBackground:(UIApplication *)iApplication;
- (void)applicationWillEnterForeground:(UIApplication *)iApplication;
- (void)applicationDidBecomeActive:(UIApplication *)iApplication;
If you want to disable multitasking you can do that by setting a UIApplicationExistsOnSuspend key in application plist. But that will make the app quit immediately when user presses home button.
The decision on whether your app should refresh after some period of time in the background is completely up to you and the needs of your app. An app could sit in the background for weeks without being killed by the OS. Or it could be killed seconds after going into the background. It all depends on resources being needed for other running apps.
If you want logic in your app that makes it restart after 24 hours, for example, then it is up to you to write code to handle this. Save a timestamp when the app goes into the background. When it returns to the foreground, compare the current time to the saved timestamp. If enough time has passed, you need to update your UI to reflect whatever desired state you want to show the user.
My app is crashing because of the auto-lock setting time is 2 min and my web-serevice is taking time more than 2 min.
if time goes over 2 min then my app crashed every time.
but i don't want to set the auto-lock time to 15 min or never from setting.
I want some solution within the app without changing the setting value.
please let me know if any one know the solution to avoid the crash.
Thanks you.
You can turn off auto-lock temporarily until the request is completed, that is set [UIApplication sharedApplication].idleTimerDisabled to YES.
The other option is to set your web service request up as a finite-length task running in background, so even if your device goes to sleep, the request keeps running. Watch out for the 10-minute time limit though.
Either way, when running in foreground, make sure the request is done asynchronously and doesn't block the main thread or your app will always get killed after doing that for too long.
How about detecting when your app goes into background / inactive
- (void)applicationWillResignActive:(UIApplication *)application
and use the task completion mechanism - take a look at this question: How to implement Task completion
As a side note, there is a 10 minutes limit to complete the background task (you get a warning) - otherwise your app will get terminated.
Did you consider splitting the data into smaller chunks and keep track of the progress?