• Global community
    • Language:
      • Deutsch
      • English
      • Español
      • Français
      • Português
  • 日本語コミュニティ
    Dedicated community for Japanese speakers
  • 한국 커뮤니티
    Dedicated community for Korean speakers
Exit
Locked
0

How to quit/exit an iOS app?

Explorer ,
Jun 28, 2011 Jun 28, 2011

Copy link to clipboard

Copied

NativeApplication.nativeApplication.exit() does not seem to work on iPad!

Using sdk 2.7, it works fine on Flash builder, but once deployed to an iDevice nothing happens, the app does not quit!.

I've already included the extra key in the iPhone InfoAdditions:

<key>UIApplicationExitsOnSuspend</key>

<string>YES</string>

Still no dice... I have to force quit the app via the double-tap-Home trick.
Any ideas/suggestions welcome.
julio

TOPICS
Performance issues

Views

26.4K

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines

correct answers 1 Correct answer

Adobe Employee , Jun 30, 2011 Jun 30, 2011

Hi,

iOS does not provide a way to exit the application. So it is expected that nativeApplication.exit() won't work on iOS and it does on Android.

One question, how are you making sure that you application is not relaunching? The fact that you see it on double-tap Home does not mean that it did not exit. This is because double-tap Home in iOS 4 gives you a list of recently launched applications.

Hope that helps.

Thanks,

Sanika

Votes

Translate

Translate
Adobe Employee ,
Jun 29, 2011 Jun 29, 2011

Copy link to clipboard

Copied

Hi,

Could you try with the following syntax?

<key>UIApplicationExitsOnSuspend</key>

<true/>

Thanks,

Sanika

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Jun 29, 2011 Jun 29, 2011

Copy link to clipboard

Copied

Did that, still no dice. (found that tip here at DevGirls http://devgirl.org/2011/06/24/exit-vs-suspend-your-ios-application/)

This is on an iPad 2, running the latest iOS.

I did check the .ipa's Info.plist and the setting is there is a Boolean=Yes!

Using prior syntax the value showed up as String.

So the setting does make it into the ipa, but iOS simply ignores it!

Thanks anyway Sanika.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Enthusiast ,
Jun 29, 2011 Jun 29, 2011

Copy link to clipboard

Copied

Hi,

@Julio

is your application frozen or in supsended state? If no - but you're facing "bad" state in your application you need to handle that state in such way that while supporting multitasking - your application is reset to "proper" state - as there is no support on iOS for programmatic termination (so native application cannot just terminate itself).

http://developer.apple.com/library/ios/#qa/qa1561/_index.html

hth,

regards,

Peter

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Jun 29, 2011 Jun 29, 2011

Copy link to clipboard

Copied

Oh no, the application is not frozen or anything, it just does not close when I execute a "NativeApplication.nativeApplication.exit()", as it should and as the documentation says.

The application just keeps running!

I know that iOS apps do not quit in general, you just hit Home and fire up something else. But this is an internal enterprise kind of app, that taps into the corporate database and should not stay on and connected all the time. Users need to 'quit'...

Anyway, I believe we may have to adapt it to behave like any other app, sign  off and stay on, and ready to sign back in again, much like skype, facebook,viber and others... maybe it is time to switch paradigms from you run-of-the-mill corporate database mentality 😞

cheers,

julio

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Jun 29, 2011 Jun 29, 2011

Copy link to clipboard

Copied

just an addition to this thread, the exact same app installed on Android does quit gracefully, so this is an iOS thing.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Adobe Employee ,
Jun 30, 2011 Jun 30, 2011

Copy link to clipboard

Copied

Hi,

iOS does not provide a way to exit the application. So it is expected that nativeApplication.exit() won't work on iOS and it does on Android.

One question, how are you making sure that you application is not relaunching? The fact that you see it on double-tap Home does not mean that it did not exit. This is because double-tap Home in iOS 4 gives you a list of recently launched applications.

Hope that helps.

Thanks,

Sanika

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Jul 08, 2011 Jul 08, 2011

Copy link to clipboard

Copied

aha! the setting did work.

the problem I was seeing is an iOS thing, because nativeApplication.exit() does not take you to Home automatically, as it does on Android.

but my app does quit when you hit Home, it does not go into suspended mode.

I modified my UI to identify when I'm starting from scratch, or coming back from suspended mode. Now I can clearly see that with that UIApplicationExitsOnSuspend=true, the app does close.

Definitely a new paradigm. Need to stop thinking about apps running on the desktop or browser.

Thanks you.

julio

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Sep 19, 2011 Sep 19, 2011

Copy link to clipboard

Copied

julio

I've been playing with this same problem for ages - just found your post. and the link to devgirls.

What code have you put in to identify when starting from scratch? if I may ask please.

I am strongly suspecting that this latest ios4 on my iPhone is still not doing it properly?

although this discussion really cleared up a lot of mystery for me

thanks

Robert

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Sep 19, 2011 Sep 19, 2011

Copy link to clipboard

Copied

Robert,

I don't know what you mean by 'starting from scratch', but I'll take a shot.

Just to make it clear, with the UIApplicationExitOnSuspend set to true, apps will always exit when you hit the Home button. Thus when you run your app again with will "start from scratch", if that is what you mean.

In my case I save some preferences/configuration data to a SharedObject. Upon startup, on my app's creationComplete event, I look for that SharedObject and if not available I can presume this to be the first run.

ON a first run I switch to the prefs/config view. (where user needs to set up the host address/IP and some other stuff).

Next time the SharedObject will be there and I know I can present my initial view, which in my case is a login view.

hth

julio

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Sep 19, 2011 Sep 19, 2011

Copy link to clipboard

Copied

Julio,

Thanks. Excellent.

That’s exactly what I mean.

I have put in an option to [Reset] my app, that clears the SharedObjects, but of course with the thing in suspended state, it pretty much gets lost after that.

So, in theory, I should

Clear SharedObjects

Exit

Press home button ( to completely shut down the app)

I need to be able to allow users to log into a different login, other than one currently stored in SharedObject, so I needed to clear those, and do a reload as well as restart. Seems like a lot of footwork just to get the thing to … begin at the beginning..

Hmmm.

This is an interesting 'feature' for sure.


Thanks Julio.

Robert

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Sep 20, 2011 Sep 20, 2011

Copy link to clipboard

Copied

Robert,

I have a similar situation on one of my apps, where I need to allow users to log into different back end systems.

Thru a 'logout' button up on the control bar users can choose a new host and re-login. That avoids a trip to Home to reset the app, I reset it myself.

julio

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
New Here ,
Jan 16, 2012 Jan 16, 2012

Copy link to clipboard

Copied

Awesome! Nice to know that 2 days of testing means I am not crazy and it just doesn't work. Excellent. Truly, now I can move on with a solution.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Participant ,
Jun 16, 2012 Jun 16, 2012

Copy link to clipboard

Copied

Hi there,
I have iPad 2 and iOS version is 5.1.
I have added the following code under application initialize:

protected function application1_initializeHandler(event:FlexEvent):void
{
// TODO Auto-generated method stub
NativeApplication.nativeApplication.addEventListener(Event.DEACTIVATE, onDeactivateApp);

}

protected function onDeactivateApp(event:Event):void
{

NativeApplication.nativeApplication.exit();
}

And added ‘UIApplicationExitsOnSuspend’ key under InfoAdditions of iPhone, under app descriptor xml file (I set, 'UIApplicationExitsOnSuspend' key to  'true' under iPhone's 'InfoAdditions' 😞

"

<iPhone>

        <InfoAdditions><![CDATA[

            <key>UIDeviceFamily</key>

            <array>

                <string>1</string>

                <string>2</string>

            </array>

            <key>UIApplicationExitsOnSuspend</key>

            <true/>

        ]]></InfoAdditions>

        <requestedDisplayResolution>high</requestedDisplayResolution>

    </iPhone> "

This worked perfectly fine for me. Application completely exits on hitting the ‘exit\home’ key of ipad. Next time I tap on the app, it initializes from beginning! Thanks for the post. Hope this helps others too.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Beginner ,
Sep 27, 2012 Sep 27, 2012

Copy link to clipboard

Copied

Hello megharajdeepak,


Thanks for the information.

Is there any chance that you could post the whole XML document for me as I am getting errors when I compile?

pic 2012-09-27 at 10.49.35.jpg

Here is the error attached.

Thanks

Steve



Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Guest
Sep 27, 2012 Sep 27, 2012

Copy link to clipboard

Copied

You probably have 2 iPhone tags in your application descriptor. Please get rid of 1 of those, for compilation to succeed.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Beginner ,
Sep 27, 2012 Sep 27, 2012

Copy link to clipboard

Copied

LATEST

Many thanks neh@adobe ! You have solved my problem!


I did have 2 iPhone tags in my application descriptor.

Removing the duplicate tag did allow compilation.

So to recap >>>>>>>

If you want your AS3 AIR Packaged for iOS application to quit when the user presses the Home button, or switches to another app ( eg if you were following a web link or navigation link )

You need this code in your application;

( please note that the bold parts are the important parts )

import flash.desktop.NativeApplication;

public function ConstructorForApp()

{

                                        NativeApplication.nativeApplication.addEventListener(Event.DEACTIVATE , onDeactivateApp);

                              init();  // or addedToStage >> init

}

 

protected function onDeactivateApp(event:Event):void

{

                              NativeApplication.nativeApplication.exit();

}

private function init():void

{

      // etc

}

You need to have this in your Application descriptor XML - and ensure that you only have one iPhone node;

( I am showing you what I had by default generated by Flash Builder

using Flex 4.6 for a Mobile Actionscript Only Air for iOS application,

although a Flex application is probably identical )

  <iPhone>

  <!-- A list of plist key/value pairs to be added to the application Info.plist -->

  <InfoAdditions><![CDATA[

                <key>UIDeviceFamily</key>

                <array>

                    <string>1</string>

                    <string>2</string>

                </array>

                <key>UIApplicationExitsOnSuspend</key>

                      <true/>

              

            ]]></InfoAdditions>

  <!-- A list of plist key/value pairs to be added to the application Entitlements.plist -->

  <!-- <Entitlements>

            <![CDATA[

                <key>keychain-access-groups</key>

                <array>

                    <string></string>

                    <string></string>

                </array>

            ]]>

        </Entitlements> -->

  <!-- Display Resolution for the app (either "standard" or "high"). Optional. Default "standard" -->

  <requestedDisplayResolution>high</requestedDisplayResolution>

  </iPhone>

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Participant ,
Sep 27, 2012 Sep 27, 2012

Copy link to clipboard

Copied

Steve,

Here's my app descriptor xml file content:

<?xml version="1.0" encoding="utf-8" standalone="no"?>

<application xmlns="http://ns.adobe.com/air/application/3.1">

<!-- Adobe AIR Application Descriptor File Template.

    Specifies parameters for identifying, installing, and launching AIR applications.

    xmlns - The Adobe AIR namespace: http://ns.adobe.com/air/application/3.1

            The last segment of the namespace specifies the version

            of the AIR runtime required for this application to run.

           

    minimumPatchLevel - The minimum patch level of the AIR runtime required to run

            the application. Optional.

-->

    <!-- A universally unique application identifier. Must be unique across all AIR applications.

    Using a reverse DNS-style name as the id is recommended. (Eg. com.example.ExampleApplication.) Required. -->

    <id>com.mobileapps.SFE</id>

    <!-- Used as the filename for the application. Required. -->

    <filename>SFE</filename>

    <!-- The name that is displayed in the AIR application installer.

    May have multiple values for each language. See samples or xsd schema file. Optional. -->

    <name>SFE</name>

   

    <!-- A string value of the format <0-999>.<0-999>.<0-999> that represents application version which can be used to check for application upgrade.

    Values can also be 1-part or 2-part. It is not necessary to have a 3-part value.

    An updated version of application must have a versionNumber value higher than the previous version. Required for namespace >= 2.5 . -->

    <versionNumber>0.0.0</versionNumber>

                

    <!-- A string value (such as "v1", "2.5", or "Alpha 1") that represents the version of the application, as it should be shown to users. Optional. -->

    <!-- <versionLabel></versionLabel> -->

    <!-- Description, displayed in the AIR application installer.

    May have multiple values for each language. See samples or xsd schema file. Optional. -->

    <!-- <description></description> -->

    <!-- Copyright information. Optional -->

    <!-- <copyright></copyright> -->

    <!-- Publisher ID. Used if you're updating an application created prior to 1.5.3 -->

    <!-- <publisherID></publisherID> -->

    <!-- Settings for the application's initial window. Required. -->

    <initialWindow>

        <!-- The main SWF or HTML file of the application. Required. -->

        <!-- Note: In Flash Builder, the SWF reference is set automatically. -->

        <content>[This value will be overwritten by Flash Builder in the output app.xml]</content>

       

        <!-- The title of the main window. Optional. -->

        <!-- <title></title> -->

        <!-- The type of system chrome to use (either "standard" or "none"). Optional. Default standard. -->

        <!-- <systemChrome></systemChrome> -->

        <!-- Whether the window is transparent. Only applicable when systemChrome is none. Optional. Default false. -->

        <!-- <transparent></transparent> -->

        <!-- Whether the window is initially visible. Optional. Default false. -->

        <!-- <visible></visible> -->

        <!-- Whether the user can minimize the window. Optional. Default true. -->

        <!-- <minimizable></minimizable> -->

        <!-- Whether the user can maximize the window. Optional. Default true. -->

        <!-- <maximizable></maximizable> -->

        <!-- Whether the user can resize the window. Optional. Default true. -->

        <!-- <resizable></resizable> -->

        <!-- The window's initial width in pixels. Optional. -->

        <!-- <width></width> -->

        <!-- The window's initial height in pixels. Optional. -->

        <!-- <height></height> -->

        <!-- The window's initial x position. Optional. -->

        <!-- <x></x> -->

        <!-- The window's initial y position. Optional. -->

        <!-- <y></y> -->

        <!-- The window's minimum size, specified as a width/height pair in pixels, such as "400 200". Optional. -->

        <!-- <minSize></minSize> -->

        <!-- The window's initial maximum size, specified as a width/height pair in pixels, such as "1600 1200". Optional. -->

        <!-- <maxSize></maxSize> -->

        <!-- The initial aspect ratio of the app when launched (either "portrait" or "landscape"). Optional. Mobile only. Default is the natural orientation of the device -->

        <!-- <aspectRatio></aspectRatio> -->

        <!-- Whether the app will begin auto-orienting on launch. Optional. Mobile only. Default false -->

        <!-- <autoOrients></autoOrients> -->

        <!-- Whether the app launches in full screen. Optional. Mobile only. Default false -->

        <!-- <fullScreen></fullScreen> -->

        <!-- The render mode for the app (either auto, cpu, gpu, or direct). Optional. Default auto -->

        <!-- <renderMode></renderMode> -->

        <!-- Whether or not to pan when a soft keyboard is raised or lowered (either "pan" or "none").  Optional.  Defaults "pan." -->

        <!-- <softKeyboardBehavior></softKeyboardBehavior> -->

    <autoOrients>true</autoOrients>

        <fullScreen>false</fullScreen>

        <visible>true</visible>

        <softKeyboardBehavior>none</softKeyboardBehavior>

    </initialWindow>

    <!-- We recommend omitting the supportedProfiles element, -->

    <!-- which in turn permits your application to be deployed to all -->

    <!-- devices supported by AIR. If you wish to restrict deployment -->

    <!-- (i.e., to only mobile devices) then add this element and list -->

    <!-- only the profiles which your application does support. -->

    <!-- <supportedProfiles>desktop extendedDesktop mobileDevice extendedMobileDevice</supportedProfiles> -->

    <!-- The subpath of the standard default installation location to use. Optional. -->

    <!-- <installFolder></installFolder> -->

    <!-- The subpath of the Programs menu to use. (Ignored on operating systems without a Programs menu.) Optional. -->

    <!-- <programMenuFolder></programMenuFolder> -->

    <!-- The icon the system uses for the application. For at least one resolution,

    specify the path to a PNG file included in the AIR package. Optional. -->

    <icon>

<!--         <image16x16></image16x16> -->

<!--         <image32x32></image32x32> -->

<!--         <image36x36></image36x36> -->

<!--         <image48x48></image48x48> -->

<!--         <image57x57></image57x57> -->

<!--         <image72x72></image72x72> -->

        <image114x114>assets/icons/icon_114.png</image114x114>

<!--         <image128x128></image128x128> -->

    </icon>

    <!-- Whether the application handles the update when a user double-clicks an update version

    of the AIR file (true), or the default AIR application installer handles the update (false).

    Optional. Default false. -->

    <!-- <customUpdateUI></customUpdateUI> -->

   

    <!-- Whether the application can be launched when the user clicks a link in a web browser.

    Optional. Default false. -->

    <!-- <allowBrowserInvocation></allowBrowserInvocation> -->

    <!-- Listing of file types for which the application can register. Optional. -->

    <!-- <fileTypes> -->

        <!-- Defines one file type. Optional. -->

        <!-- <fileType> -->

            <!-- The name that the system displays for the registered file type. Required. -->

            <!-- <name></name> -->

            <!-- The extension to register. Required. -->

            <!-- <extension></extension> -->

           

            <!-- The description of the file type. Optional. -->

            <!-- <description></description> -->

           

            <!-- The MIME content type. -->

            <!-- <contentType></contentType> -->

           

            <!-- The icon to display for the file type. Optional. -->

            <!-- <icon>

                <image16x16></image16x16>

                <image32x32></image32x32>

                <image48x48></image48x48>

                <image128x128></image128x128>

            </icon> -->

           

        <!-- </fileType> -->

    <!-- </fileTypes> -->

    <!-- iOS specific capabilities -->

    <!-- <iPhone> -->

        <!-- A list of plist key/value pairs to be added to the application Info.plist -->

        <!-- <InfoAdditions>

            <![CDATA[

                <key>UIDeviceFamily</key>

                <array>

                    <string>1</string>

                    <string>2</string>

                </array>

                <key>UIStatusBarStyle</key>

                <string>UIStatusBarStyleBlackOpaque</string>

                <key>UIRequiresPersistentWiFi</key>

                <string>YES</string>

            ]]>

        </InfoAdditions> -->

        <!-- A list of plist key/value pairs to be added to the application Entitlements.plist -->

        <!-- <Entitlements>

            <![CDATA[

                <key>keychain-access-groups</key>

                <array>

                    <string></string>

                    <string></string>

                </array>

            ]]>

        </Entitlements> -->

    <!-- Display Resolution for the app (either "standard" or "high"). Optional. Default "standard" -->

    <!-- <requestedDisplayResolution></requestedDisplayResolution> -->

    <!-- </iPhone> -->

    <!-- Specify Android specific tags that get passed to AndroidManifest.xml file. -->

    <!--<android> -->

    <!--    <manifestAdditions>

        <![CDATA[

            <manifest android:installLocation="auto">

                <uses-permission android:name="android.permission.INTERNET"/>

                <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

                <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

                <uses-feature android:required="true" android:name="android.hardware.touchscreen.multitouch"/>

                <application android:enabled="true">

                    <activity android:excludeFromRecents="false">

                        <intent-filter>

                            <action android:name="android.intent.action.MAIN"/>

                            <category android:name="android.intent.category.LAUNCHER"/>

                        </intent-filter>

                    </activity>

                </application>

            </manifest>

        ]]>

        </manifestAdditions> -->

        <!-- Color depth for the app (either "32bit" or "16bit"). Optional. Default 16bit before namespace 3.0, 32bit after -->

        <!-- <colorDepth></colorDepth> -->

    <!-- </android> -->

    <!-- End of the schema for adding the android specific tags in AndroidManifest.xml file -->

<android>

        <colorDepth>16bit</colorDepth>

        <manifestAdditions><![CDATA[

            <manifest android:installLocation="auto">

                <!--See the Adobe AIR documentation for more information about setting Google Android permissions-->

                <!--Removing the permission android.permission.INTERNET will have the side effect

        of preventing you from debugging your application on your device-->

                <uses-permission android:name="android.permission.INTERNET"/>

                <!--<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>-->

                <!--<uses-permission android:name="android.permission.READ_PHONE_STATE"/>-->

                <!--<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>-->

                <!--The DISABLE_KEYGUARD and WAKE_LOCK permissions should be toggled together

        in order to access AIR's SystemIdleMode APIs-->

                <!--<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>-->

                <!--<uses-permission android:name="android.permission.WAKE_LOCK"/>-->

                <!--<uses-permission android:name="android.permission.CAMERA"/>-->

                <!--<uses-permission android:name="android.permission.RECORD_AUDIO"/>-->

                <!--The ACCESS_NETWORK_STATE and ACCESS_WIFI_STATE permissions should be toggled

        together in order to use AIR's NetworkInfo APIs-->

                <!--<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>-->

                <!--<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>-->

            </manifest>

           

        ]]></manifestAdditions>

    </android>

    <iPhone>

        <InfoAdditions><![CDATA[

            <key>UIDeviceFamily</key>

            <array>

                <string>1</string>

                <string>2</string>

            </array>

            <key>UIApplicationExitsOnSuspend</key>

            <true/>

        ]]></InfoAdditions>

        <requestedDisplayResolution>high</requestedDisplayResolution>

    </iPhone>

</application>

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines