【问题标题】:How programmatically restart an iPhone app in iOS如何在 iOS 中以编程方式重启 iPhone 应用
【发布时间】:2010-11-21 16:47:35
【问题描述】:

如何在 iOS 中以编程方式重启 iPhone 应用?

我发现这种方式http://writeitstudios.com/david/?p=54

但可能很简单。

【问题讨论】:

  • 没有。不要这样做。看在上帝的份上。
  • 好吧,您引用的示例适用于 Cocoa 应用程序,而不是 Cocoa Touch (iOS) 应用程序。其次,它不可能在 iOS 上重新启动您的应用程序。
  • 当然还有真正的问题:你为什么要这样做?
  • 我更新了我的帖子,明确表示它不适用于 iOS。不过,我不明白你为什么要重新启动 iPhone 应用程序。
  • @Pripyat - 可能需要重新启动应用程序以确保 AWS 等复杂 SDK 中的安全性,其中切换配置(例如注销和再次登录)需要重新启动应用程序才能使更改生效,例如The right way to clear AWSCognitoCredentialsProvider

标签: ios iphone ios6


【解决方案1】:

我知道这样做的唯一方法并不理想,但它确实有效。

首先,您的应用必须退出后台执行(多任务处理) 退出时应用必须退出,而不是作为后台任务运行。这是通过 plist 键 UIApplicationExitsOnSuspend 完成的。

其次,您的应用需要注册一个可用于启动应用的自定义 URL 方案。

第三,您需要一个托管在某处的网页,该网页在加载时会重定向到您应用的自定义 URL 方案。

第四,用户需要有效的互联网连接。

要退出并重新启动,请在托管的重定向网页上调用 UIApplication openURL。您的应用程序将退出,Safari 将启动并加载您的页面。该页面会将 Safari 重定向到您的自定义 URL 方案,提示 Safari 在内部调用 openURL,从而导致 iOS 启动您的应用程序。

【讨论】:

  • 如果你觉得反常,你可以从你的应用程序本身托管页面(在-applicationWillTerminate: 中你有大约 10 秒的时间退出;在另一个线程中提供它可能更容易,但你同样可以调用 socket()、bind()、listen()、accept()、write() 和 close())。让您的应用在您提供页面后终止,并使页面延迟启动您的应用(我认为是“刷新”或“重新加载”标题)。
  • 你甚至不需要设置 UIApplicationExitsOnSuspend;你只需要调用exit()。在 -beginBackgroundTaskWithExpirationHandler 中包装“服务器”:确保您的应用程序获得足够的 CPU 时间来服务该事物,然后您可以休眠 500 毫秒(以“确保”数据被发送)并退出()。复杂的部分是解析请求,但您可以通过休眠 500 毫秒并读入一个较大的 (8K) 缓冲区,或者(如果您喜欢冒险)选择 + 读取 500 毫秒来伪造它。
【解决方案2】:

您链接到的我的帖子指的是 Cocoa 应用程序,而不是 iOS。在 iOS 上,您可以使用 exit(0); 退出应用程序(但 Apple 不喜欢这样),但我不建议这样做。但是你不能重启 iPhone 应用程序。

【讨论】:

    【解决方案3】:

    除非您正在为越狱设备进行开发,否则 Apple 甚至不允许您以编程方式终止您的应用。所以重启设备是不可能的。

    【讨论】:

    • 我认为 Alexei 指的是重新启动应用程序,而不是设备。当然,重启后者绝非不可能。
    • 当然可以——您可以调用 exit() 或 kill() 或仅从 main() 或其他各种东西(如 abort())返回。它与崩溃无法区分,并且可能会因此导致您的应用被 Apple 拒绝。
    • 从main()返回是什么意思?我解决了将 exit() 按钮添加到应用程序的问题。我需要它,因为第一次和第二次测量总是不同的。
    • 我正在使用 exit() 退出应用,通过应用商店审核没问题。
    • @samvermette 他们不可能没有注意到它——如果你在它退出的初始屏幕上输入一个使你小于 18 岁的出生日期(这是其应用程序所在的饮料公司的要求。)我如果我提交了相同的应用程序并被拒绝,也不会感到惊讶。拒绝似乎都有点随机!
    【解决方案4】:

    你的AppDelegate 实例有一个方法

    (void)applicationDidBecomeActive:(UIApplication *)application
    {
    }
    

    在这里,您可以设置逻辑来确定应用程序是否应该重新启动,或者继续执行它正在执行的任何操作。例如,您可以有一个BOOL 变量appMustRestart,一开始是false,但只要您的应用程序中发生您希望下次重新启动的事情,就会触发为真。

    if (appMustRestart)
    {
        [self resetVars];  // call a method that resets all your vars to initial settings
    
        // INSERT CODE HERE TO TRANSFER FOCUS TO INITIAL VIEWCONTROLLER
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      • 2019-02-15
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      • 2015-07-30
      • 2020-08-16
      相关资源
      最近更新 更多