将应用程序置于前台

Posted

技术标签:

【中文标题】将应用程序置于前台【英文标题】:Bring App to foreground 【发布时间】:2012-07-26 16:50:08 【问题描述】:

有没有办法在计时器用完后将我的应用程序置于前台?这是一个信息亭类型的应用程序,它将在用户会话期间的不同点显示一些信息。

这适用于仅安装在我们的企业设备上的应用程序,因此不会提交给 Apple 审批。我也愿意探索越狱选项。

如果你们能提供任何帮助/提示,​​我将不胜感激。谢谢。

【问题讨论】:

出于显而易见的原因,只有用户才能。我认为您可以期望的最好的结果是本地推送通知,询问用户是否要再次打开该应用程序。 @borrrden,他提到有越狱技术,所以说只有用户才能强制应用程序进入前台是不正确的。 或许ios6中的“引导式访问”新功能对你的用例会有帮助 @Nate 你是对的,我应该写“在非越狱系统上你可以期待的最好的” 我来看看“引导式访问”。我将如何在越狱设备上执行此操作(不确定这是否是正确的询问位置)?有人会使用 Xcode 为越狱设备开发应用程序吗?感谢您的帮助。 【参考方案1】:

是的,从技术上讲,您可以使用 Xcode 进行越狱开发(但您不必这样做)。如果您希望您的应用程序安装在普通沙箱之外,并且在 /Applications/ 中,那么您将使用 Xcode 代码签名、伪造代码签名(或使用自签名证书),然后使用scp 或类似的东西(可能有一个脚本)将应用程序复制/安装到您的设备上。

您也可以在“Theos”、“Logos”或“iOSOpenDev”等工具上进行谷歌搜索。 More here

另外,请参阅this page for information about fake code signing with Xcode。

在将应用程序置于前台方面,至少有两种方法可以处理:

一种方法是使用 Cydia 安装(免费)实用程序 open。使用open,您可以使用其捆绑ID(例如open com.mycompany.MyAppName)发出命令行调用以打开任何应用程序。如果您想以编程方式执行此操作,请在 system() 调用中发出该命令:

 #import <stdlib.h>

 int returnCode = system("/usr/bin/open com.mycompany.MyAppName");

另一种选择是to see this answer by @WrightsCS。请务必阅读 cmets,了解它的去向。


更新:在将您的应用程序置于后台方面,您可以使用exit(0)[[UIApplication sharedApplication] terminateWithSuccess] 完全终止您的应用程序。或者,see this answer for a solution to programmatically simulate a home button press,它将把应用程序发送到后台而不杀死它。

您将无法使用NSTimer,因为当您的应用处于后台时计时器不会触发。但是,您可以使用 GCD blocks 运行后台工作,并使用 open 调用 system() 将您带回前台。

See this answer, probably scrolling all the way to the bottom of his post

or look at this similar answer, which was actually posted at the bottom of the question

【讨论】:

我已经越狱了 ipad 并安装了 open 实用程序。在我的应用程序中,我创建了一个 NSTimer 来调用一个使用“system(..”打开自身(同一个应用程序)的方法。现在,当我启动计时器时,最小化应用程序,计时器似乎暂停了。我在做什么有什么问题吗?感谢您的帮助。 @user1558984,好的,所以您已将应用置于后台,并希望它使用NSTimer唤醒自己?我想这与我的设想有点不同,但它仍然应该是可行的。首先,请确认我正确理解了您的问题。其次,在您之前的评论中,您是说一旦您的应用程序进入后台,NSTimer 就会停止运行,因此您永远没有机会拨打system() 吗?或者system() 调用本身不起作用(将应用程序置于前台)? 没错。所以我的目标用例是,用户从前台的应用程序开始。该应用程序在用户执行操作后最小化(我正在使用 exit(0);不确定这是否正确),因此用户可以使用设备上安装的其他应用程序。应用程序需要在特定的持续时间后自行唤醒并进入前台。主页按钮将被禁用或通过自定义案例隐藏,因为这是一个信息亭类型的安装。再次感谢您的帮助。 @user1558984:那么,您需要一种程序化 方式来退出您的应用程序,而 Home 按钮不可用?另外,你能澄清一下我上一个问题的答案吗?您是否看到您的 NSTimer 在您处于后台时没有触发,或者它正在触发,但 system() 调用实际上不起作用? 是的,我需要一种编程方式来最小化(我更愿意让它在后台运行)我的应用程序。要回答您之前的问题,NSTimer 不会在后台触发,我怀疑那是因为我正在使用'exit();'最小化应用程序,但它真的退出了应用程序。至于'system('调用,我不相信它会被调用,因为应用程序实际上已关闭。我希望我在这里有意义。【参考方案2】:

将您的应用置于前台的越狱选项:

使用 MobileSubstrate 连接到 SpringBoard。您可以找到具有良好名称的类和方法,例如 [SBApplicationIcon launch][SBApplication launch]。另一种可能性是使用 SpringBoardServices 私有框架中的SBSLaunchApplicationWithIdentifier()

暂停应用的选项:

您很可能可以再次执行此操作,方法是使用 MobileSubstrate 让 SpringBoard 为您关闭特定应用程序。也许您可以通过调用[SBUIController handleMenuTap] 或类似的方法来模拟主页按钮的点击。

【讨论】:

以上是关于将应用程序置于前台的主要内容,如果未能解决你的问题,请参考以下文章

BlackBerry - 无法将正在运行的应用程序置于前台

如果已经运行,则 C++ 程序将进程置于前台,否则创建一个新进程

MainWindowHandle 为 0 时将窗口置于前台

设置为在 Windows 窗体应用程序中将第三方对话框置于前台

从 Access 将 Excel 窗口置于前台

如何在 OS X 上将进程窗口置于前台?