如何在objective-c中保持对象在应用程序中的活动性

时间:2014-10-20 10:31:03

标签: objective-c jailbreak theos tweak springboard

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

这是我登录HomeScreen(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>

MyClass.h

#import <Foundation/Foundation.h>

@interface MyClass : NSObject

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

@end

MyClass.m

#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

Tweak.xm

#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

2 个答案:

答案 0 :(得分:0)

每个进程都有自己的变量副本,因为这是进程在iOS中运行的方式(而不仅仅是在iOS中)。每个进程都有自己独立的内存,数据之间根本不共享。因此,您的单身人士将为每个流程单独构建。

答案 1 :(得分:0)

如果要使用同一个对象,则必须开发一些进程间通信(IPC)方法。虽然我没有多少经验,但我知道RocketBootstrap图书馆可以成为开始学习的好地方。

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

如果您需要能够将请求从SpringBoard发送到UIKit应用程序,那么您必须下载到mach_msg级别而不是使用RocketBootstrap。它仍然可以帮助你掌握你正在做的事情。