如何检测iphone应用程序状态变化? [关闭]

Posted

技术标签:

【中文标题】如何检测iphone应用程序状态变化? [关闭]【英文标题】:How to detect iphone app state changes? [closed] 【发布时间】:2011-02-07 19:20:02 【问题描述】:

我发布这个问题(连同答案)是为了让其他人可以从我已经进化到让模块自动检测(并响应)ios 应用程序状态变化的巧妙技术中受益。 (格式化的)博客讨论在这里My Blog

【问题讨论】:

我强烈建议将其重新表述为一个真正的问题,然后发布答案,而不是尝试发送垃圾邮件 Mitchel,您说得对,我忘记在原始帖子中包含问号。固定。 您回复得如此之快,以至于我来不及发布答案。我希望你不要觉得它仍然是一个垃圾邮件。 :) 嗯。显然我做错了什么,但与 Mitchel 的评论(有具体说明)不同,版主的评论并不能真正帮助我改进我的帖子。我觉得我好像因为 1) 想帮助别人编写更好的代码和 2) 不知道这里的规则而受到惩罚。呃,好吧。我试过了。 【参考方案1】:

如果您四处搜索让代码执行以响应应用状态更改的解决方案,您会发现代码示例,您可以在其中将代码调用添加到应用委托中,因为每当应用程序 didFinishLaunchingWithOptions 或 didBecomeActive 时都会调用它, 或 WillEnterBackground。

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

总而言之,我们想要插入式模块,仅凭借参与项目,即可执行其工作,而无需任何额外的努力或接线。此时您可能会说“我也希望独角兽和精灵给我带来披萨”。忍受我。

我不知道在阅读文档时我是怎么错过的,但是当 iOS 应用程序更改状态时,知道它的不仅仅是应用程序委托。 NSNotifications 也会发布所有主要的状态变化。以下是直接取自 api 参考的文本:

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

同样,有一个 UIApplicationDidFinishLaunchingNotification 在应用程序完成启动后立即发布,以及进入后台或进入前台的其他通知。

所以这简化了我们的代码:而不是必须调用

 [RobustWebService handleAppBecomingActive]

在应用代理的 applicationDidBecomeActive 实现中,我们只需要让 RobustWebService 响应 UIApplicationDidFinishLaunchingNotification。

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

[[NSNotificationCenter defaultCenter] addObserver:self
Selector:@selector(handleAppBecomeActive)
name:UIApplicationDidFinishLaunchingNotification
object :nil]

在哪里可以完成?请记住,我们不想接触应用程序委托,因为这会破坏拥有独立插件模块的意图。如果只有某种方法可以让类的 addObserver 函数调用自动发生。要是……

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

    + (void) load
    
                // stuff
    

它将在 iOS 加载类时运行。有趣的是,它在你的应用程序的 main() 例程被调用之前运行,所以你必须非常小心你试图做什么!此时您的大多数应用程序实际上并未启动并运行,但您可以保证您的类链接的所有框架也将首先加载。像 NSNotificationCenter 这样的框架,所以如果你在你的 class.m 中包含这个

     + (void) load
     
      [[NSNotificationCenter defaultCenter] addObserver:self
                Selector:@selector(handleAppBecomeActive)
                name:UIApplicationDidFinishLaunchingNotification
                object :nil];
     

然后你的handleAppBecomeActive 方法会在你的应用激活时被调用,你不需要做任何事情,只需要在你的项目中包含class.h 和class.m。

如果你在你的 class.m 文件中包含这段代码

+ (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开发了。谢谢大佬

以上是关于如何检测iphone应用程序状态变化? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Xcode - 如何检测 iPhone 的屏幕尺寸 [关闭]

iPhone 上的节奏(声音变化)检测

如果只有颜色发生变化,如何检测 Webelement 的状态

如何检测用户的iPhone关闭或开启的蓝牙?

如何使用广播接收器检测蓝牙状态变化?

ios检测终止状态下的蓝牙状态变化