Proper way to exit iPhone application?

前端 未结 25 2686
难免孤独
难免孤独 2020-11-22 01:54

I am programming an iPhone app, and I need to force it to exit due to certain user actions. After cleaning up memory the app allocated, what\'s the appropriate method to ca

相关标签:
25条回答
  • 2020-11-22 02:56

    Check the Q&A here: https://developer.apple.com/library/content/qa/qa1561/_index.html

    Q: How do I programmatically quit my iOS application?

    There is no API provided for gracefully terminating an iOS application.

    In iOS, the user presses the Home button to close applications. Should your application have conditions in which it cannot provide its intended function, the recommended approach is to display an alert for the user that indicates the nature of the problem and possible actions the user could take — turning on WiFi, enabling Location Services, etc. Allow the user to terminate the application at their own discretion.

    WARNING: Do not call the exit function. Applications calling exit will appear to the user to have crashed, rather than performing a graceful termination and animating back to the Home screen.

    Additionally, data may not be saved, because -applicationWillTerminate: and similar UIApplicationDelegate methods will not be invoked if you call exit.

    If during development or testing it is necessary to terminate your application, the abort function, or assert macro is recommended

    0 讨论(0)
  • 2020-11-22 02:58

    On the iPhone there is no concept of quitting an app. The only action that should cause an app to quit is touching the Home button on the phone, and that's not something developers have access to.

    According to Apple, your app should not terminate on its own. Since the user did not hit the Home button, any return to the Home screen gives the user the impression that your app crashed. This is confusing, non-standard behavior and should be avoided.

    0 讨论(0)
  • 2020-11-22 02:58

    I used the [[NSMutableArray new] addObject:nil] approach mentioned above to force-quit (crash) the app without making a tell-tale exit(0) function call.

    Why? Because my app uses certificate pinning on all network API calls to prevent man-in-the-middle attacks. These include the initialization calls my financial app makes on startup.

    If certificate authentication fails, all of my initialization calls error out and leave my app in an indeterminate state. Letting the user go home and then back into the app doesn't help, as unless the app has been purged by the OS it's still uninitialized and untrustworthy.

    So, in this one case, we deemed it best to pop an alert informing the user that the app is operating in an insecure environment and then, when they hit "Close", force quit the app using the aforementioned method.

    0 讨论(0)
  • 2020-11-22 02:58

    Swift 4.2 (or older)

    Library called Darvin can be used.

    import Darwin
    
    exit(0) // Here you go
    

    NB: This is not recomanded in iOS applications.

    Doing this will get you crash log.

    0 讨论(0)
  • 2020-11-22 02:58

    In iPadOS 13 you can now close all scene sessions like this:

    for session in UIApplication.shared.openSessions {
        UIApplication.shared.requestSceneSessionDestruction(session, options: nil, errorHandler: nil)
    }
    

    This will call applicationWillTerminate(_ application: UIApplication) on your app delegate and terminate the app in the end.

    But beware of two things:

    • This is certainly not meant to be used for closing all scenes. (see https://developer.apple.com/design/human-interface-guidelines/ios/system-capabilities/multiple-windows/)

    • It compiles and runs fine on iOS 13 on an iPhone, but seems to do nothing.

    More info about scenes in iOS/iPadOS 13: https://developer.apple.com/documentation/uikit/app_and_environment/scenes

    0 讨论(0)
  • 2020-11-22 02:59

    My App has been rejected recently bc I've used an undocumented method. Literally:

    "Unfortunately it cannot be added to the App Store because it is using a private API. Use of non-public APIs, which as outlined in the iPhone Developer Program License Agreement section 3.3.1 is prohibited:

    "3.3.1 Applications may only use Documented APIs in the manner prescribed by Apple and must not use or call any private APIs."

    The non-public API that is included in your application is terminateWithSuccess"

    0 讨论(0)
提交回复
热议问题