iOS - 从 AppDelegate 监控应用程序流

Posted

技术标签:

【中文标题】iOS - 从 AppDelegate 监控应用程序流【英文标题】:iOS - Monitoring app flow from AppDelegate 【发布时间】:2016-10-07 11:16:51 【问题描述】:

我正在尝试创建将从 AppDelegate 初始化的 Singleton。目的是监视所有UIViewControllers(活动的)并在控制台上打印该类(作为概念证明)。所以我的基本想法是初始化AppDelegate 中的单例并将AppDelegate 的引用作为参数传递。然后我必须以某种方式监视哪个是活动视图。

例如: 查看 A B C A 是 Navigation Controller 中的第一个视图。我的 Singleton 知道当前视图是 A。然后我们推送视图 B,Singleton 被通知视图 B 现在是当前视图。和 C 一样。现在我们弹出 C,Singleton 知道当前视图是 B。

是否有任何类型的 KVONSNotification 用于通知我的单身人士新的 UIView 出现/删除?有什么办法可以解决这个问题吗?

【问题讨论】:

【参考方案1】:

注册所有通知后,我发现了UINavigationControllerDidShowViewControllerNotification

有了这个观察者: [notifyCenter addObserver:self selector:@selector(viewAppeared:) name:@"UINavigationControllerDidShowViewControllerNotification" object:nil]; 我可以监控 UINavigationController 的活动。

【讨论】:

除了 UITabBarController 之外,有没有办法做同样的事情?【参考方案2】:

你可以通过在 appdelegate 中创建一个视图控制器对象来获取当前的视图控制器

@property (strong, nonatomic) UIViewController *currentViewController;

然后在视图上会出现你当前的视图控制器,给应用程序委托对象的当前引用,比如

AppDelegate *myAppd = (AppDelegate*)[[UIApplication sharedApplication]delegate];
    myAppd.currentViewController = self;

这样您就可以获得当前的活动视图。

【讨论】:

【参考方案3】:

一种方法是选择您想了解的特定方法并拦截它。

在这里,我在UIViewController 上创建了一个类别,并提供了一个我想要在控制器的viewWillAppear: 通常被调用时调用的方法:

#include <objc/runtime.h>

@implementation UIViewController (Swap)

+ (void)load

    NSLog(@"Exchange implementations");
    method_exchangeImplementations(
     class_getInstanceMethod(self, @selector(viewWillAppear:)),
     class_getInstanceMethod(self, @selector(customViewWillAppear:)));


- (void)customViewWillAppear:(BOOL)animated

    // Call the original method, using its new name
    [self customViewWillAppear:animated];

    NSLog(@"Firing %@ for %@", VIEW_CONTROLLER_APPEARED, self);
    [[NSNotificationCenter defaultCenter] postNotificationName:VIEW_CONTROLLER_APPEARED
                                                        object:self];


@end

之后,只需在需要知道的任何对象(例如您的Singleton)中侦听通知。

【讨论】:

问题是我希望 Singleton 更通用并且适用于现有项目。这就是为什么我希望它具有 AppDelegate 作为参数。 我不明白这如何使这个策略无效。如果可以将Singleton添加到项目中,也可以添加类别到项目中。 我会在稍后阶段将其转换为框架。这就是为什么我试图找到它,如果我可以在没有任何其他代码的情况下监控应用程序的流程

以上是关于iOS - 从 AppDelegate 监控应用程序流的主要内容,如果未能解决你的问题,请参考以下文章

设备重启后 iBeacon 监控/测距

从 iOS 框架引用 UIApplication 或 AppDelegate 窗口属性会导致应用被 App Store 拒绝吗?

使用 Swift2 从 AppDelegate 重新打开 iOS 应用程序到指定的导航控制器

设备重启后的 IOS8 iBeacon 监控

iOS:如何从 UIViewController 通知 appDelegate

从 AppDelegate 导航 iOS Storyboard ViewController