2011-08-18 71 views
5

我真的不认为这是可以做到的,但我的老板仍然希望我提供一个链接。他想要的是添加一个'你确定要退出吗?'当用户按下主页按钮时发出警告,如果用户说'不',则该应用程序不会无效。 它不能完成,可以吗?iOS主页按钮警告,可以吗?

+0

感谢您的回答,我不认为这可能是反正做。 – Samssonart

回答

16

不,你不能这样做 - 应用程序没有发言权。问问你的老板他是否曾经见过一个可以做到这一点的iOS应用程序的例子。没有......我不会打赌。

应用程序可以继续在后台执行一些功能 - 流音乐,例如获取位置信息,但没有应用程序可以阻止主页按钮。如果你能做到这一点,你可以阻止应用程序永远关闭。

A)你不能在技术上做到这一点,

B)苹果不会允许它在App Store发布,如果这是你服用

如果你看一下分布路线当你创建一个应用程序委托由的XCode创建的方法存根

-(void)applicationWillResignActive:(UIApplication *)application 

-(void)applicationWillTerminate:(UIApplication *)application 

那充满将有关如何使用此方法来暂停任务,禁用定时器,油门下的帧速率,保存数据的意见 - 有什么关于能够延迟,用“你确定”消息查询用户。

这个想法与iPhone/Pad/Pod-Touch的用户体验相反。

从App Store准则(略有删节):

应用是改变设备上的开关的行为将 拒绝

这是一个建议改变家中的行为按钮 - 所以会被拒绝。

+0

我没有直接引用App Store指南,因为它是受版权保护的文档,只有拥有开发者帐户才能访问。但是,如果您被要求开发iOS应用程序,那么您必须有权访问。我建议你看看它。 – iandotkelly

2

这是可能在监狱破碎的设备上,使用未经批准的API。这个概念是在多次违反苹果的使用政策,所以你永远不会得到一个应用程序试图以任何方式在官方应用程序商店实现这一点。这里有几个原因:

  1. 你不能改变任何按钮的功能(包括音量按钮,有些相机应用程序用来用它们来拍照,但他们得到了从商店引导的结果) 。
  2. 您不能干涉标准用户与设备的交互。主页按钮将人们带回家,你无法阻止,或者要求确认,因为这会干扰交互。
  3. 没有公共API来检测主页按钮的实际使用情况。因此,您需要一个私有API,如果没有Apple的明确许可,您不能使用私有API,因为上面的#1和#2,他们永远不会给出这些API。

我相信还有很多其他原因,但不管它会直接违反应用商店政策还是iOS人机界面指南。

您可以检测应用程序即将失去焦点,失去焦点或可能失去焦点(例如电话进入),但无法改变流程(即不允许应用程序失去焦点)。

您可以在后台指南和限制内继续在后台执行代码。后台代码可以向用户提交一个允许他们切换回应用程序的通知......这要尽可能地接近你的想法,并且如果每次应用程序关闭时苹果都会拒绝你...

1

你需要证明来证明你的老板显然不是iOS开发者。

Apple Human Interface Guide

这应该是所有你需要的证明。但要清楚的是,Apple不会允许应用以任何方式覆盖主页按钮。在注销之前,您一定要将动作表或弹出窗口警告,但是一旦按下主页按钮,您就会注意到放弃记忆,您将被关闭。

0

我能找到的最佳参考是this one。这并不十分明确,但苹果的人机界面指南有两个标题'总是准备停止',然后是'不要编程',它明确了主页按钮的功能,并且你不应该实现你的自己的戒烟策略。

2

已经被许多人回答,但不,你不能这样做。当用户按下主页按钮时,您的应用程序代理的applicationWillResignActive被调用,它禁用应用程序的触摸事件。然后applicationDidEnterBackground被调用,它,每Apple docs

你委托的applicationDidEnterBackground:方法有 约5秒完成任何任务并返回。在实践中, 这个方法应该尽快返回。如果该方法 不会返回时间用完之前,你的应用程序被杀害,并从内存

1

你可能想看看IOS的商场展示模式清除 。通过这种方式,您可以在启动后首先启动的第一个应用中取消“主页”按钮并锁定设备。

1

我知道我为时已晚回答这个问题。

但我最近遇到了Samssonart的问题。

由@iandotkelly给出的答案已被iOS5弃用。现在,没有一个代理方法将用于区分使用主页按钮锁定设备或将应用程序发送到背景。

您现在可以使用applicationState变量来定义触发的操作。

applicationState是由appDelegate提供的内置ID。

**

if it returns 2 then, it will identify the Home button is pressed 
if it returns 1 then, it will identify the lock hardware button is pressed 

**

所以,你的情况,你可以在**applicationDidEnterBackground**方法检查出这个条件

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    NSLog(@"decision >> %d",[[UIApplication sharedApplication] applicationState]); 
} 

欣赏节目!

+1

我很想在此投下一票:这不是对原始问题的回答。这应该是对iandotkelly答案的评论。 – vikingosegundo

+0

是的,我知道这不是原始问题的答案。但我只想告诉大家,现在接受的答案中的方法已不再有用。这是你可以检查后返回到您的应用程序,而不是检查条件,而关闭它。就评论而言,我不知道如何在评论中安排词语,就像我们在回答中安排的一样。这就是为什么我更愿意给出答案并让每个人都知道这个方法的原因。 –

0

我知道这是一个老话题,但我只是想更新这个答案。在iOS 7中,这不起作用。 所以我使用screenbrightness时,应用程序将去背景,以确定主页和锁按钮之间的区别。

-(void)applicationDidEnterBackground:(UIApplication *)application { if ([[UIApplication sharedApplication] applicationState] == UIApplicationStateInactive) { NSLog(@"Sleep button pressed"); } else if ([[UIApplication sharedApplication] applicationState] == UIApplicationStateBackground) { if ([[UIScreen mainScreen] brightness] > 0.0) NSLog(@"Home button pressed"); else NSLog(@"Sleep button pressed"); } }

我希望这会有所帮助的话在未来的人