如何检测iphone应用程序状态更改?

如何检测iphone应用程序状态更改?,iphone,automation,background,cocoa-design-patterns,uiapplicationdelegate,Iphone,Automation,Background,Cocoa Design Patterns,Uiapplicationdelegate,我发布这个问题(连同答案)是为了让其他人能够受益于我开发的一种巧妙的技术,它让模块自动检测(并响应)iOS应用程序状态的变化。(格式化的)博客讨论就在这里如果你在谷歌上搜索让代码执行以响应应用程序状态更改的解决方案,你会发现代码示例,你可以在其中将对代码的调用添加到应用程序委托中,因为每当应用程序使用选项完成启动或激活时,它就会被调用,或者是背景 但假设你开始开发另一个应用程序,它会重复使用你的很多代码。如果您可以复制一些文件并获得所有功能,而不必担心重新连接应用程序委托方法,这不是很好吗 总而

我发布这个问题(连同答案)是为了让其他人能够受益于我开发的一种巧妙的技术,它让模块自动检测(并响应)iOS应用程序状态的变化。(格式化的)博客讨论就在这里

如果你在谷歌上搜索让代码执行以响应应用程序状态更改的解决方案,你会发现代码示例,你可以在其中将对代码的调用添加到应用程序委托中,因为每当应用程序使用选项完成启动或激活时,它就会被调用,或者是背景

但假设你开始开发另一个应用程序,它会重复使用你的很多代码。如果您可以复制一些文件并获得所有功能,而不必担心重新连接应用程序委托方法,这不是很好吗

总而言之,我们需要插入模块,这些模块仅仅由于在项目中,就可以执行它们的工作,而无需任何额外的工作或接线。在这一点上,你可能会说“我还想让独角兽和精灵给我带来一个比萨饼”。请容忍我

我不确定我在阅读文档时怎么会错过这一点,但当iOS应用程序改变状态时,知道这一点的不仅仅是应用程序代理。所有主要状态更改的通知也会发布。以下是直接取自api参考的文本:

在调用[ApplicationIDBecMeactive]之后,应用程序还会发布UIApplicationIDBecMeactiveNotification通知,让感兴趣的对象有机会响应转换

类似地,还有一个UIApplicationIDFinishLaunchingNotification,在应用程序完成启动后立即发布,还有其他用于进入后台或前台的通知

因此,这简化了我们的代码:而不必调用

 [RobustWebService handleAppBecomingActive]
在应用程序委托的ApplicationIDBecomeActive实现中,我们只需要让RobustWebService响应UIApplicationIDFinishLaunchingNotification

现在仔细考虑一下,您可能会意识到,为了让RWS类处理通知,它必须注册为观察者。那个电话看起来像

[[NSNotificationCenter defaultCenter] addObserver:self
Selector:@selector(handleAppBecomeActive)
name:UIApplicationDidFinishLaunchingNotification
object :nil]
在哪里可以做到呢?请记住,我们不想触碰应用程序代理,因为这会破坏拥有独立内置模块的意图。如果有某种方法可以自动为类调用addObserver函数就好了。要是

此时,我们必须放弃“Cocoa”,深入研究Objective-C的底层技术。可以肯定的是,有一个名为“load”的类方法,如果在类定义中出现,它将在首次加载类时自动调用。让我们在代码中重申这一点。如果在任何class.m文件中编写此函数

    + (void) load
    {
                // stuff
    }
+ (void) load;
{
    [[NSNotificationCenter defaultCenter] addObserver:self
        selector:@selector(handleAppLaunched)
     name:UIApplicationDidFinishLaunchingNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self         selector:@selector(handleAppResigningActive) name:UIApplicationWillResignActiveNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleAppBecomingActive) name:UIApplicationDidBecomeActiveNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleAppEnteringBackground) name:UIApplicationDidEnterBackgroundNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleAppEnteringForeground) name:UIApplicationWillEnterForegroundNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleAppClosing) name:UIApplicationWillTerminateNotification object:nil];
}
它将在iOS加载类时运行。有趣的是,它是在调用应用程序的main()例程之前运行的,所以您必须非常小心您尝试执行的操作!此时,您的大多数应用程序实际上并没有启动和运行,但您可以保证,您的类链接的所有框架也将首先加载。框架,比如NSNotificationCenter,所以如果您在类中包含它

     + (void) load
     {
      [[NSNotificationCenter defaultCenter] addObserver:self
                Selector:@selector(handleAppBecomeActive)
                name:UIApplicationDidFinishLaunchingNotification
                object :nil];
     }
然后,当应用程序处于活动状态时,您的HandLeappEcoMeactive方法将被调用,而无需在项目中包含class.h和class.m以外的任何操作

如果在class.m文件中包含此代码

    + (void) load
    {
                // stuff
    }
+ (void) load;
{
    [[NSNotificationCenter defaultCenter] addObserver:self
        selector:@selector(handleAppLaunched)
     name:UIApplicationDidFinishLaunchingNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self         selector:@selector(handleAppResigningActive) name:UIApplicationWillResignActiveNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleAppBecomingActive) name:UIApplicationDidBecomeActiveNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleAppEnteringBackground) name:UIApplicationDidEnterBackgroundNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleAppEnteringForeground) name:UIApplicationWillEnterForegroundNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleAppClosing) name:UIApplicationWillTerminateNotification object:nil];
}
您的类将收到所有应用程序状态更改的通知,无需其他工作。这是如此的酷,它仍然让我感到刺痛。享受吧


Terry

如果你在谷歌上搜索让代码执行以响应应用程序状态更改的解决方案,你会找到代码示例,在其中你将对代码的调用添加到你的应用程序委托中,因为每当应用程序使用选项完成启动、激活或将进入后台时,它就会被调用

但假设你开始开发另一个应用程序,它会重复使用你的很多代码。如果您可以复制一些文件并获得所有功能,而不必担心重新连接应用程序委托方法,这不是很好吗

总而言之,我们需要插入模块,这些模块仅仅由于在项目中,就可以执行它们的工作,而无需任何额外的工作或接线。在这一点上,你可能会说“我还想让独角兽和精灵给我带来一个比萨饼”。请容忍我

我不确定我在阅读文档时怎么会错过这一点,但当iOS应用程序改变状态时,知道这一点的不仅仅是应用程序代理。所有主要状态更改的通知也会发布。以下是直接取自api参考的文本:

在调用[ApplicationIDBecMeactive]之后,应用程序还会发布UIApplicationIDBecMeactiveNotification通知,让感兴趣的对象有机会响应转换

类似地,还有一个UIApplicationIDFinishLaunchingNotification,在应用程序完成启动后立即发布,还有其他用于进入后台或前台的通知

因此,这简化了我们的代码:而不必调用

 [RobustWebService handleAppBecomingActive]
在应用程序委托的ApplicationIDBecomeActive实现中,我们只需要让RobustWebService响应UIApplicationIDFinishLaunchingNotification

现在仔细考虑一下,您可能会意识到,为了让RWS类处理通知,它必须注册为观察者。那个电话看起来像

[[NSNotificationCenter defaultCenter] addObserver:self
Selector:@selector(handleAppBecomeActive)
name:UIApplicationDidFinishLaunchingNotification
object :nil]
在哪里可以做到呢?请记住,我们不想触碰应用程序代理,因为这会破坏拥有独立内置模块的意图。如果有某种方法可以自动为类调用addObserver函数就好了。要是

在这一点上,我们必须放弃“可可”和挖掘