How to manage multitask in iPhone - ios

When I click the home button on the device. This is a part of my delegate:
- (void)applicationWillResignActive:(UIApplication *)application
{
NSLog(#"resign active");
//[[NSThread mainThread] cancel];
}
- (void)applicationDidEnterBackground:(UIApplication *)application
{
NSLog(#"enter background");
//[[NSThread mainThread] cancel];
}
- (void)applicationWillEnterForeground:(UIApplication *)application
{
NSLog(#"enter foreground");
//[[NSThread mainThread] cancel];
}
- (void)applicationWillTerminate:(UIApplication *)application
{
NSLog(#"terminate");
//[[NSThread mainThread] cancel];
}
I uses NSLog to understand which method are called when I click the Home Button. This is output in console.
2012-01-20 15:55:55.853 MyApp[5955:11f03] enter background
2012-01-20 15:55:55.855 MyApp[5955:11f03] terminate
Program ended with exit code: 0
So, when I click on app in background (clicking two time the home button), it launchs again showing the first image and then my first uiviewcontroller.
In which way I can resolve it, and resume app from uiviewcontroller that was on the top when user clicks home button?

Check your info.plist file and make sure that "Application does not run in background" is not checked.
The image below shows the option in state "on", so that when the user press the home button, the app is effectively finalized.
This is how Apple describes that option:
UIApplicationExitsOnSuspend
UIApplicationExitsOnSuspend (Boolean - iOS) specifies that the application should be terminated rather than moved to the background when it is quit. Applications linked against iOS SDK 4.0 or later can include this key and set its value to YES to prevent being automatically opted-in to background execution and application suspension. When the value of this key is YES, the application is terminated and purged from memory instead of moved to the background. If this key is not present, or is set to NO, the application moves to the background as usual.
This key is supported in iOS 4.0 and later.

Related

What exactly happens with app when user presses home button?

What exactly happens with an app when the user presses the home button? Does iOS make a snapshot of current app's state?
If I'm right, how to "slip in" another snapshot? I need it for showing the main iOS screen after user presses home button twice.
In order to achieve that, you could add a subview (i.e. ImageView with an image of your main screen) to your window in - (void)applicationDidEnterBackground:(UIApplication *)application.
When coming back (in - (void)applicationWillEnterForeground:(UIApplication *)application) you have to remove the subview.
However, Apple recommends to always show the latest state of the app (best user experience).
Example of AppDelegate implementation:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
/* other code */
self.overlayView = [[UIImageView alloc] initWithFrame:self.window.bounds];
self.overlayView.image = [UIImage imageNamed:#"mainscreen_screenshot.png"];
/* other code */
}
- (void)applicationDidEnterBackground:(UIApplication *)application
{
[self.window addSubview:self.overlayView];
}
- (void)applicationWillEnterForeground:(UIApplication *)application
{
[self.overlayView removeFromSuperview];
}
iOS takes screenshot before your application goes to background.
I got it from Apple's official documentation.
Remove sensitive information from views before moving to the background: When an app transitions to the background, the system takes a snapshot of the app’s main window, which it then presents briefly when transitioning your app back to the foreground. Before returning from your applicationDidEnterBackground: method, you should hide or obscure passwords and other sensitive personal information that might be captured as part of the snapshot.
So, Here We can hide our "sensitive personal information" and the system takes a snapshot of the app’s main window and we are not able to change its feature.
# sensitive personal information
Set a blurry screen overlay before the app goes in the background and once the app becomes active remove this overlay (check #cweinberger's answer).
If it is iOS 7 or later you can use the function ignoreSnapshotOnNextApplicationLaunch
Also, allowScreenShot flag can be explored in Restrictions Payload.
For deeply read about it Then this is the best documentation.

Every time my app launches (whether from cold launch or background) I want to have it do something, how do I accomplish this?

I want to check every time the app launches whether or not there's a URL in the clipboard, and if so, do something with it. Which method fires that I can override whenever the app launches, whether from a cold launch (it was killed in the background for instance) or if I just press the home button, copy a URL and jump back in.
Is it one of these?
- (void)applicationDidBecomeActive:(UIApplication *)application
- (void)applicationWillEnterForeground:(UIApplication *)application
- (void)applicationDidBecomeActive
- (void)applicationDidFinishLaunching:(UIApplication *)application
Confused.
As #rmaddy says, the correct method to use once the app launched is applicationWillEnterForeground: from your app delegate.
This method will be called when the user jump backs in, but NOT in other circumstances you don't need to respond to (such as the user receiving a text message and dismissing it).
However, from my testing, applicationWillEnterForeground: is not called when an app is launched from cold; you should catch that in applicationDidFinishLaunchingWithOptions:.
So, basically, your app delegate should include code like this:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[self checkForURL];
...
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
[self checkForURL];
...
}
- (void)checkForURL{
//code for checking for URL goes here
}
Hope that helps.
- (void)applicationDidBecomeActive is called when the app is launched or becomes active from the background.
This doc explains everything pretty well: http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html
With reference to the UIApplicationDelegate Protocol, the handling of app launches can be handled in 2 methods:
application:willFinishLaunchingWithOptions:
application:didFinishLaunchingWithOptions:
And the handling of app launches from background can be handled with the help of method:
applicationDidBecomeActive:
Based on the above call, you can handle your application.
In your app delegate add it to the methods that the other answers have suggested (applicationDidFinishLaunchingWithOptions:). In your root view controller register for the following notification. This will always be called when your application launches once it has already started running.
[[NSNotificationCenter defaultCenter] addObserver:self selector:#selector(bringingItBack) name:UIApplicationWillEnterForegroundNotification object:nil];
This will cover both the instances when the app launches and when you are just bringing it back from the background.

How to make iPhone application go to pause menu when home button is clicked?

I am making an iPhone application that is fairly simple. All I need to do is set the bool "paused" to true to pause the game. How can I make my application do that when the home button is hit?
Thanks guys, that was exactly what I wanted. Since it is in the appDelegate, though, I can't access the boolean "paused" to change it. How can I make it global so that I can access it from the appDelegate?
The Appdelegate.m of your app provides functions you can use to track if the Application will be entering the background;
User pressed the button;
- (void)applicationWillResignActive:(UIApplication *)application
Application is in the background;
- (void)applicationDidEnterBackground:(UIApplication *)application
Within any of these functions you could set the BOOL to True/YES. -> See the comments provided by Apple within the functions for their exact usage.
When the application becomes active again, the appdelegate will (again) fire a function;
- (void)applicationDidBecomeActive:(UIApplication *)application
In your AppDelegate there are two method which is called when the button is called
You can pause the game here:
- (void)applicationDidEnterBackground:(UIApplication *)application
{
//Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
}
or here:
- (void)applicationWillResignActive:(UIApplication *)application{
//Sent when the application is about to move from active to inactive state.
}
In your app delegate, implement applicationWillResignActive:. Set paused = YES; there.
Reset it in applicationDidBecomeActive:.
- (void)applicationWillResignActive:(UIApplication *)application
implement your pause method and it will be called when your app is going to become inactive.

iOS - detect when application exits

How can I detect when a user exits the application? (hitting the home button)
And how can I detect when the relaunch it? (clicking the icon)
*I'm not talking about users manually quitting the app by holding the home button and then making the icons wiggle and deleting the app instance from the sub-dock. i'm talking about just temporarily exiting the app buy clicking the home button.. maybe sending a text or whatnot then coming back to the app.
Thanks!
- (void)applicationDidEnterBackground:(UIApplication *)application
and
- (void)applicationDidBecomeActive:(UIApplication *)application
In your AppDelegate.m
- (void)applicationWillTerminate:(UIApplication *)application
There's a notification UIApplicationDidGoToBackground that fires when the home button is pressed. A similar notification tells you about going back to foreground.

ios load first page every time the app is opened

is there anyway to make the app load the first page every time it's opened?
It would be nice if some one can help,
Thanks
You can do this with the AppDelegate
Just add code that reloads to the first page.
- (void)applicationWillEnterForeground:(UIApplication *)application
{
/*
Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
*/
}
enter in info.plist app key "Application does not run in background" and put for it value YES
In you app delegate, connect your tabBar to an iVar, and do this:
- (void)applicationWillEnterForeground:(UIApplication *)application
{
self.mayTabBar.selectedIndex=0;
}
This will switch to the first (leftmost) item in the tabBar.

Resources