Iphone &引用;应用程序崩溃时你在做什么;恢复

Iphone &引用;应用程序崩溃时你在做什么;恢复,iphone,objective-c,xcode,Iphone,Objective C,Xcode,更新!照片后检查。 全部, 我今天正在玩一个iPhone应用程序(Photovine),注意到一个我很想包含在我的应用程序中的功能。当应用程序崩溃时,我正在向应用程序添加一张照片。没什么大不了的,我想,我会重新打开它。当我重新打开它时,砰的一声,一个UIAlertView弹出一个小文本框,问我“应用程序崩溃时你在做什么?” 我认为这是一个很棒的功能,但在我发布问题之前的10秒搜索中,我找不到如何实现它 有人知道怎么做吗 **编辑:对于尝试此操作的任何人,请记住同步您的NSUserDefault

更新!照片后检查。

全部,

我今天正在玩一个iPhone应用程序(Photovine),注意到一个我很想包含在我的应用程序中的功能。当应用程序崩溃时,我正在向应用程序添加一张照片。没什么大不了的,我想,我会重新打开它。当我重新打开它时,砰的一声,一个UIAlertView弹出一个小文本框,问我“应用程序崩溃时你在做什么?”

我认为这是一个很棒的功能,但在我发布问题之前的10秒搜索中,我找不到如何实现它

有人知道怎么做吗


**编辑:对于尝试此操作的任何人,请记住同步您的
NSUserDefaults
,以使其正常工作。
NSUserDefaults
方法如果在将其写入YES后进行同步,则可以完美地工作。只需调用
[NSUserDefaults synchronize]你将是金色的

我猜当应用程序正常终止时,应用程序会设置一个标志。如果应用程序加载且未设置标志,则弹出对话框

查看应用程序委派方法:

- (void)applicationWillTerminate:(UIApplication *)application

没有代码-但主要思想是:

  • 当应用程序启动时,您保存一些属性,比如说“creash”为YES
  • 正常关闭应用程序时,将其设置为否

  • 现在,当您启动应用程序时,检查此属性是否设置为“是”或“否”以指示崩溃。

    您可以做的一件事是使用
    NSUserDefaults
    记录应用程序启动或移动到前台的时间,然后当应用程序终止或移动到后台时,您可以记录退出时间(因为在后台,苹果可以随时终止您的应用程序而不另行通知)。每次启动时,只需确保应用程序关闭时间>大于应用程序启动时间,否则可能会导致崩溃。

    您可以针对导致程序终止的条件安装处理程序(未捕获的异常和信号)并设置一个在启动时检查的标志。有关捕获异常和信号的详细信息,请参阅此

    此代码将为导致程序关闭的未捕获异常和信号安装处理程序

    void InstallUncaughtExceptionHandler() {
        NSSetUncaughtExceptionHandler(&HandleException);
        signal(SIGABRT, SignalHandler);
        signal(SIGILL, SignalHandler);
        signal(SIGSEGV, SignalHandler);
        signal(SIGFPE, SignalHandler);
        signal(SIGBUS, SignalHandler);
        signal(SIGPIPE, SignalHandler);
    }
    
    SignalHandler
    HandleException
    功能应:

  • 使用
    NSUserDefaults
    设置一个标志以指示崩溃,并存储可能有用的任何其他信息(例如时间,这样您就可以知道哪些数据与哪个崩溃相关)
  • 删除信号或异常处理程序,使步骤3导致崩溃
  • 重新发送信号或异常。这将导致实际崩溃,并创建崩溃日志

  • 在您的
    DidFinishFindingWithOptions:
    方法中,您应该检查此标志。如果找到它,您将显示窗口以从用户收集信息并发送给自己。然后清除标志。

    我如何知道应用程序是否正常关闭?添加了将被调用的方法。HTH Dave。这不会被称为I如果应用程序从多任务栏退出。您的程序只会收到一个SIGKILL。由于您无法捕获SIGKILL,因此更容易捕获崩溃情况。ughoavgfhw:那么您建议如何执行此操作?@James catch the crash。有关详细信息,请参阅我的答案。我如何知道应用程序是否正常关闭?请查看此处:假设它将通过UIApplicationLegate中的一个常规方法退出,该方法将“重置”这个标志。很好很简单,只需使用一个标志和时间比较+1@James我链接的帖子建议从
    didFinishLaunchingWithOptions:
    以0的延迟调用它,以确保运行循环已设置。在此之前崩溃不会被捕获,但在此之前您的程序确实不应该崩溃。