参考链接
Logos wiki
定义
Logos是theteosdevelopment套件的一个组件,它允许使用一组特殊的预处理器指令轻松而清晰地编写方法挂钩代码。
概述
Logos提供的语法极大地简化了MobileSubstrate扩展(“tweaks”)的开发,它可以在整个OS中钩住其他方法。在这种情况下,“方法钩住”是指用于替换或修改在电话上的其他应用程序中找到的类的方法的技术。
标识指令列表
######Block level
此类别中的指令打开一个代码块,该代码块必须由%enddirective关闭(如下所示)。这些不应该存在于函数或方法内。
- %group
%group Groupname
组用于条件初始化或代码组织。分组对于管理与旧代码的向后兼容性非常有用。以名称groupname开始一个钩子组。组不能在另一个%groupblock内。所有未分组的挂钩都在隐式“未分组”组中。如果没有其他组,将为您初始化未分组的组。您可以使用%init指令手动初始化它。其他组必须使用%init(Groupname)指令初始化。
%group iOS8
%hook IOS8_SPECIFIC_CLASS
// your code here
%end // end hook
%end // end group ios8
%group iOS9
%hook IOS9_SPECIFIC_CLASS
// your code here
%end // end hook
%end // end group ios9
%ctor {
if (kCFCoreFoundationVersionNumber > 1200) {
%init(iOS9);
} else {
%init(iOS8);
}
}
- %hook
%hook Classname
打开类名称dclassname的挂钩块。可以在%groupblock中。下面是一个简单的例子:
%hook SBApplicationController
-(void)uninstallApplication:(SBApplication *)application {
NSLog(@"Hey, we're hooking uninstallApplication:!");
%orig; // Call the original implementation of this method
return;
}
%end
- %new
%new
%new(signature)
通过在方法定义上方添加此指令,将新方法添加到挂接类或子类中。signatureis是新方法的Objective-C类型编码;如果省略,则将生成一个新方法。必须在%hook钩块内。
- %subclass
%subclass Classname: Superclass
子类块-该类在运行时创建,并用方法填充。IVAR还没有被支持(使用关联对象)。对于超类中不存在的方法,需要%New。要实例化新类的对象,可以使用%coperator。可以在%group block中。下面是一个例子
%subclass MyObject : NSObject
- (id)init {
self = %orig;
[self setSomeValue:@"value"];
return self;
}
//the following two new methods act as `@property (nonatomic, retain) id someValue;`
%new
- (id)someValue {
return objc_getAssociatedObject(self, @selector(someValue));
}
%new
- (void)setSomeValue:(id)value {
objc_setAssociatedObject(self, @selector(someValue), value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
%end
%ctor {
MyObject *myObject = [[%c(MyObject) alloc] init];
NSLog(@"myObject: %@", [myObject someValue]);
}
- %property
%property (nonatomic|assign|retain|copy|weak|strong|getter|setter) Type name;
将一个属性添加到一%subclass个子类,就像您将用@ propertyto一个普通OC子类一样,以及向%Hook中的现有类添加新属性。必须在%subclass %Hook中。
- %end
关闭组/钩子类块。