Je travaille sur une bibliothèque statique qui traite des données sensibles. Il est impératif que le développeur qui utilise la bibliothèque ne puisse pas utiliser la réflexion sur la bibliothèque.
Sur Android, nous résolvons le problème en développant une aar
avec service
et exécuter le service
(Lorsque le service est exécuté dans un autre processus, le développeur ne peut pas utiliser la réflexion) mais je me demande si quelque chose de similaire existe dans iOS ?
Peut-on exécuter une bibliothèque statique dans un processus séparé ? Si non, comment éviter la réflexion sur nos bibliothèques statiques ?
Par exemple :
MyTestObject *obj = [[[myTestView alloc] init ];
//===========================================
Class clazz = [obj class];
u_int count;
Ivar* ivars = class_copyIvarList(clazz, &count);
NSMutableArray* ivarArray = [NSMutableArray arrayWithCapacity:count];
for (int i = 0; i < count ; i++)
{
const char* ivarName = ivar_getName(ivars[i]);
[ivarArray addObject:[NSString stringWithCString:ivarName encoding:NSUTF8StringEncoding]];
}
free(ivars);
objc_property_t* properties = class_copyPropertyList(clazz, &count);
NSMutableArray* propertyArray = [NSMutableArray arrayWithCapacity:count];
for (int i = 0; i < count ; i++)
{
const char* propertyName = property_getName(properties[i]);
[propertyArray addObject:[NSString stringWithCString:propertyName encoding:NSUTF8StringEncoding]];
}
free(properties);
Method* methods = class_copyMethodList(clazz, &count);
NSMutableArray* methodArray = [NSMutableArray arrayWithCapacity:count];
for (int i = 0; i < count ; i++)
{
SEL selector = method_getName(methods[i]);
const char* methodName = sel_getName(selector);
[methodArray addObject:[NSString stringWithCString:methodName encoding:NSUTF8StringEncoding]];
}
free(methods);
NSDictionary* classDump = [NSDictionary dictionaryWithObjectsAndKeys:
ivarArray, @"ivars",
propertyArray, @"properties",
methodArray, @"methods",
nil];
NSLog(@"%@", classDump);
//======================================================
int v2 = [[obj valueForKey:@"testValue"] intValue];
SEL s = NSSelectorFromString(@"wannatTestIt");
[obj performSelector:s];
MyTestObject
est un cours de ma bibliothèque. Dans la première ligne, j'initialise un objet de cette classe.
Dans la ligne suivante, je lis la liste des variables, méthodes et propriétés de la classe et je l'enregistre. Voici le résultat :
{
ivars = (
testValue
);
methods = (
printTestValue,
wannatTestIt,
"initWithFrame:"
);
properties = (
);
}
wannaTestIt
est une méthode privée et testValue
est une variable privée. Je m'attends donc à ce que le développeur qui utilise la bibliothèque ne puisse pas y accéder. Cependant, comme l'utilisateur de la bibliothèque a pu obtenir le nom, il peut finalement appeler la méthode pour lire la valeur de l'iVar.
Comment puis-je éviter cela ?