Как сохранить объект во всем приложении в t arget-c

У меня проблема в том, что я хочу использовать объект в таких приложениях, как 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 ответа

Решение

Если вы хотите использовать один и тот же объект, вам придется разработать какой-то метод межпроцессного взаимодействия (IPC). Хотя у меня нет особого опыта в этом, я знаю, что библиотека RocketBootstrap может быть хорошим местом для начала обучения.

Основная идея заключается в том, что вы внедряете две разные версии вашей настройки в приложения SpringBoard и UIKit. В SpringBoard вы будете запускать сервер и прослушивать сообщения. В приложениях UIKit вы будете подключаться к этому серверу и отправлять запрос всякий раз, когда вам нужно выполнить функцию на синглтоне. Вы можете использовать RocketBootstrap, чтобы отправить это сообщение. Это определенно не без проблем, так как вы должны разработать протокол связи, но все будет работать, если все сделано правильно.

Если вам нужно иметь возможность отправлять запросы из SpringBoard в приложения UIKit, вам придется перейти на уровень mach_msg, а не использовать RocketBootstrap. Тем не менее, это может помочь вам получить контроль над тем, что вы делаете.

Каждый из процессов имеет свою собственную копию переменной, потому что так работают процессы в iOS (и не только в iOS). Каждый процесс имеет свою отдельную память, и данные вообще не разделяются между ними. По этой причине ваш синглтон будет создаваться отдельно для каждого процесса.

Другие вопросы по тегам