如何在iOS中以编程方式重新启动iPhone应用程序

5

10
不。不要这样做。求求你了。 - Jonathan Sterling
好的,你引用的例子是针对Cocoa应用程序而不是Cocoa Touch(iOS)应用程序的。其次,在iOS上无法重新启动你的应用程序。 - itsaboutcode
3
当然,真正的问题是:你为什么想要这样做? - tc.
我已经更新了我的帖子,明确说明它不适用于iOS。但我不明白为什么你会想要重新启动一个iPhone应用程序。 - Pripyat
@Pripyat - 在复杂的SDK(如AWS)中,为确保安全性,可能需要重新启动应用程序以进行应用程序重启,以便更改生效,例如切换配置(例如注销并再次登录)。请参阅清除AWSCognitoCredentialsProvider的正确方法 - Lactose.Int.Robot
4个回答

21

我知道的实现方法可能不是最理想的,但它可以解决问题。

首先,你的应用程序必须退出后台执行(多任务),而不是作为后台任务运行。这可以通过 plist 关键字 UIApplicationExitsOnSuspend 实现。

其次,你的应用程序需要注册一个自定义的 URL 方案,以便启动应用程序。

第三,你需要在某个地方托管一个网页,当加载该网页时,将重定向到你的应用程序的自定义 URL 方案。

第四,用户需要有一个活动的互联网连接。

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


3
如果您感到反常,您可以从您的应用中直接托管页面(您有约10秒钟在“-applicationWillTerminate:”方法中退出;可能更容易在另一个线程中提供它,但您也可以使用socket(),bind(),listen(),accept(),write()和close()直接调用)。在提供完页面后让您的应用程序终止,并延迟一段时间后再打开该页面(使用“Refresh”或“Reload”标头)。 - tc.
你甚至不需要设置UIApplicationExitsOnSuspend;你只需要调用exit()函数即可。通过在-beginBackgroundTaskWithExpirationHandler:中包装“服务器”,确保你的应用程序获得足够的CPU时间来提供服务,然后你可以休眠500毫秒(以“确保”数据已发送)并退出。复杂的部分是解析请求,但你可以通过休眠500毫秒并读取到一个相对较大(8K)的缓冲区中来处理这个问题,或者(如果你感觉冒险)使用select+read来进行500毫秒的操作。 - tc.

1

你链接的我的帖子是关于Cocoa应用程序,而不是iOS。在iOS上,你可以通过使用exit(0);退出应用程序(但苹果不喜欢这样做),但我不建议这样做。但是,你无法重新启动iPhone应用程序。


0

除非你是为越狱设备开发,否则苹果甚至不允许你以编程方式终止应用程序。因此,重新启动设备是不可能的。


2
我认为Alexei指的是重新启动应用程序,而不是设备。当然,重新启动后者是绝对不可能的。 - Adrian Kosmaczewski
当然可以 - 你可以调用exit()或kill(),或者从main()函数中返回,或者使用其他方法(如abort())。这与崩溃无法区分,很可能会因此被苹果拒绝。 - tc.
从main()函数返回是什么意思?我解决了向应用添加退出按钮的问题。我需要它,因为第一次和第二次测量总是不同的。 - Andrei Eremchuk
我正在使用exit()来退出一个应用程序,在应用商店审核中没有任何问题。 - Michael Behan
@mbehan 可能是因为审核团队没有发现它。如果他们发现了,很可能会拒绝它。 - samvermette
1
@samvermette 他们不可能没有注意到 - 如果您在初始屏幕上输入的出生日期使您不到18岁,它会退出(这是饮料公司应用程序的要求)。虽然如此,如果我提交相同的应用程序并因此被拒绝,我也不会感到惊讶。所有的拒绝似乎都有点随机! - Michael Behan

-1

您的 AppDelegate 实例有一个方法

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

在这里,您可以编写逻辑来确定应用程序是否应该重新启动或继续执行其正在进行的操作。例如,您可以有一个名为appMustRestartBOOL变量,一开始是false,但每当您希望下一次是全新启动时,它就会被触发为true
if (appMustRestart)
{
    [self resetVars];  // call a method that resets all your vars to initial settings

    // INSERT CODE HERE TO TRANSFER FOCUS TO INITIAL VIEWCONTROLLER
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接