如何在objective-c中使对象在整个应用程序中保持活动状态

如何在objective-c中使对象在整个应用程序中保持活动状态,objective-c,jailbreak,theos,tweak,springboard,Objective C,Jailbreak,Theos,Tweak,Springboard,我的问题是,我想在SpringBoard、Safari、Settings、Notes等应用程序中使用对象。我使用的是Singleton模式。但当我转储这些对象时,它们有自己的分配。因此,我认为他们是不同的对象。有没有办法让对象在应用程序中保持活动状态?我有root权限 以下是我在主屏幕SpringBoard、Safari和设置上的日志: Oct 20 17:05:5 MyPhone SpringBoard[982] <Warning>: MyClass: <MyClass: 0

我的问题是,我想在SpringBoard、Safari、Settings、Notes等应用程序中使用对象。我使用的是Singleton模式。但当我转储这些对象时,它们有自己的分配。因此,我认为他们是不同的对象。有没有办法让对象在应用程序中保持活动状态?我有root权限

以下是我在主屏幕SpringBoard、Safari和设置上的日志:

Oct 20 17:05:5 MyPhone SpringBoard[982] <Warning>: MyClass: <MyClass: 0x17f72680>
Oct 20 17:06:29 MyPhone MobileSafari[1001] <Warning>: MyClass: <MyClass: 0x15da9b60>
Oct 20 17:06:34 MyPhone Preferences[1002] <Warning>: MyClass: <MyClass: 0x175864c0>
Tweak.xm


每个进程都有自己的变量副本,因为这是进程在iOS中的工作方式,而不仅仅是在iOS中。每个进程都有自己独立的内存,它们之间根本不共享数据。因此,将为每个进程分别构造单例。

如果要使用同一个对象,必须开发一些进程间通信方法。虽然我在这方面没有太多经验,但我知道图书馆是一个开始学习的好地方

主要概念是将两个不同版本的tweak注入到SpringBoard和UIKit应用程序中。在SpringBoard中,您将运行服务器并侦听消息。在UIKit应用程序中,您将连接到此服务器,并在需要在singleton上执行函数时发送请求。您可以使用RocketBootstrap发送此消息。它绝对不是无缝的,因为你必须设计一个通信协议,但如果做得好,一切都会成功的


如果您需要能够将请求从SpringBoard发送到UIKit应用程序,则必须降低到mach_msg级别,而不是使用RocketBootstrap。不过,它仍然可以帮助您掌握所做的事情。

谢谢您的回答。我将尝试其他解决方案。你好,WojtekSurowka,我使用NSDistributedNotificationCenter解决了我的问题。谢谢@Ryan Pendleton。我会试试你的建议。我的问题是:我必须创建一个新控件,在这种情况下,它是一个矩形。我的控件总是显示在顶部跳板和每个应用程序上。它看起来像iPhone/iPod/iPad上的辅助触摸屏。为了解决我的问题,我创建了一个自定义UIWindow并向其中添加了一个UIView。但我希望我的控件在SpringBoard和每个应用程序上的设备方向改变时会旋转。但在每个应用程序中,即使我已经使用单例模式,也会创建自定义UIWindow的新实例。这是我的自定义UIWindow@MinhQuy,那么您将调整注入应用程序有什么原因吗?似乎将它注入SpringBoard就足够了,除非我遗漏了什么。有很多方法可以处理设备方向的变化,但它们都有相同的问题。在每个应用程序过程中,SpringBoard、Safari、Notes等都将创建自己的自定义UIWindow对象。我可以旋转新对象,但在SpringBoard中创建的旧对象仍会显示,我无法删除或隐藏它。我试图检测SpringBoard何时出现在前台和后台。@MinhQuy但如果SpringBoard的窗口在所有应用程序中都可见,为什么还要在应用程序中加载插件?我只想把它放在跳板上。我想是的,但事实不同:。这是我的密码。我从中复制和修改。您可以看到,当调用updateWithDeviceOrientation:方法时,my window的对象将有不同的内存分配,每个应用程序进程中的不同对象都会有不同的内存分配。因此,我想在应用程序中加载我的插件
#import <Foundation/Foundation.h>

@interface MyClass : NSObject

+ (instancetype)sharedInstance;
- (void)doSomething;

@end
#import "MyClass.h"

@implementation MyClass

- (instancetype)init {
    self = [super init];

    return self;
}

+ (instancetype)sharedInstance {
    static dispatch_once_t p = 0;

    __strong static id _sharedSelf = nil;

    dispatch_once(&p, ^{
        _sharedSelf = [[self alloc] init];
    });

    return _sharedSelf;
}

- (void)doSomething {
    NSLog(@"MyClass: %@", self);
}

@end
#import <SpringBoard/SpringBoard.h>
#import <MyClass.h>

%hook SpringBoard

- (void)applicationDidFinishLaunching:(UIApplication *)application {
    %orig;

    MyClass *myClass = [MyClass sharedInstance];
    [myClass doSomething];
}

%end

%hook UIViewController

- (void)viewDidLoad {
    %orig;

    MyClass *myClass = [MyClass sharedInstance];
    [myClass doSomething];
}

%end