
Hook Objective-C كتل مع libffi. إنها أداة AOP قوية للكتل. يمكن لـ blockhook تشغيل الكود الخاص بك قبل/بدلاً من ذلك/بعد استدعاء كتلة. يمكن لـ blockhook حتى إخطارك عند حدوث كتلة. يمكنك تتبع دورة الحياة بأكملها للكتلة باستخدام blockhook!
هل تريد ربط الكتل التي تمر إلى الأساليب؟ جرب blocktracker!
يحتاج Blockhook إلى libffi ، الذي يدعم iOS و TVOs و MacOS. يمكنك تشغيل BlockHookSample iOS أو BlockHookSample tvOS أو BlockHookSample macOS target.
يمكنك ربط كتلة باستخدام 4 أوضاع (قبل/بدلاً من ذلك/بعد/ميتة). هذه الطريقة تُرجع مثيل BHToken لمزيد من التحكم. يمكنك remove BHToken ، أو تعيين قيمة إرجاع مخصصة على خاصية القيمة retValue الخاصة بها. سوف يستدعي استدعاء طريقة invokeOriginalBlock التنفيذ الأصلي للكتلة.
- (BHToken *)block_hookWithMode:(BlockHookMode)mode
usingBlock:( id )blockBlockhook سهل الاستخدام. واجهات برمجة التطبيقات لها تأخذ مثال حسب الجوانب. فيما يلي مجموعة كاملة من استخدام blockhook.
هذا مثال لتركيب الكتلة في جميع الأنماط. يمكنك تغيير قيمة إرجاع الكتلة من 8 إلى 15. ثم قم بإزالة بعض الخطاف وتحقق مما إذا كانت ناجحة. أخيرًا ، نحصل على رد الاتصال عند Block Dealloc.
NSObject *z = NSObject .new;
int (^block)( int x, int y) = ^ int ( int x, int y) {
int result = x + y;
NSLog ( @" %d + %d = %d , z is a NSObject: %@ " , x, y, result, z);
return result;
};
BHToken *token = [block block_hookWithMode: BlockHookModeDead|BlockHookModeBefore|BlockHookModeInstead|BlockHookModeAfter usingBlock: ^(BHInvocation *invocation, int x, int y) {
int ret = 0 ;
[invocation getReturnValue: &ret];
switch (invocation. mode ) {
case BlockHookModeBefore:
// BHInvocation has to be the first arg.
NSLog ( @" hook before block! invocation: %@ " , invocation);
break ;
case BlockHookModeInstead:
[invocation invokeOriginalBlock ];
NSLog ( @" let me see original result: %d " , ret);
// change the block imp and result
ret = x * y;
[invocation setReturnValue: &ret];
NSLog ( @" hook instead: '+' -> '*' " );
break ;
case BlockHookModeAfter:
// print args and result
NSLog ( @" hook after block! %d * %d = %d " , x, y, ret);
break ;
case BlockHookModeDead:
// BHInvocation is the only arg.
NSLog ( @" block dead! token: %@ " , invocation. token );
break ;
default :
break ;
}
}];
NSLog ( @" hooked block " );
int ret = block( 3 , 5 );
NSLog ( @" hooked result: %d " , ret);
// remove token.
[token remove ];
NSLog ( @" remove tokens, original block " );
ret = block( 3 , 5 );
NSLog ( @" original result: %d " , ret);ها هو السجل:
hooked block
hook before block! invocation:<BHInvocation: 0x60b00003c370>
3 + 5 = 8, z is a NSObject: <NSObject: 0x6020000279d0>
let me see original result: 0
hook instead: '+' -> '*'
hook after block! 3 * 5 = 15
hooked result:15
block dead! token:<BHToken: 0x60d000004bd0>
remove tokens, original block
3 + 5 = 8, z is a NSObject: <NSObject: 0x6020000279d0>
original result:8
في بعض الأحيان تريد تسجيل دخول المستخدم أولاً قبل التوجيه إلى مكونات أخرى. لاعتراض كتلة دون اختراق رمز أجهزة التوجيه ، يمكنك استخدام اعتراض الكتلة.
NSObject *testArg = [ NSObject new ];
NSObject *testArg1 = [ NSObject new ];
NSObject *(^testblock)( NSObject *) = ^( NSObject *a) {
return [ NSObject new ];
};
[testblock block_interceptor: ^(BHInvocation *invocation, IntercepterCompletion _Nonnull completion) {
dispatch_after ( dispatch_time (DISPATCH_TIME_NOW, ( int64_t )( 0.5 * NSEC_PER_SEC)), dispatch_get_main_queue (), ^{
NSObject * __unsafe_unretained arg;
[invocation getArgument: &arg atIndex: 1 ];
NSLog ( @" Original argument: %@ " , arg);
[invocation setArgument: ( void *)&testArg1 atIndex: 1 ];
completion ();
});
}];
testblock (testArg);Cocoapods هو مدير التبعية لمشاريع الكاكاو. يمكنك تثبيته مع الأمر التالي:
$ gem install cocoapods لدمج blockhook في مشروع Xcode الخاص بك باستخدام cocoapods ، حدده في Podfile الخاص بك:
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
use_frameworks!
target 'MyApp' do
pod 'BlockHook'
end
تحتاج إلى استبدال "myapp" باسم مشروعك.
ثم ، قم بتشغيل الأمر التالي:
$ pod installCarthage هو مدير التبعية اللامركزي الذي يبني تبعياتك ويوفر لك الأطر الثنائية.
يمكنك تثبيت قرطاج مع Homebrew باستخدام الأمر التالي:
$ brew update
$ brew install carthage لدمج blockhook في مشروع Xcode الخاص بك باستخدام قرطاج ، حدده في Cartfile :
github "yulingtianxia/BlockHook"
قم بتشغيل carthage update لإنشاء الإطار وسحب BlockHook.framework .
بعد استيراد libffi ، فقط أضف الملفان BlockHook.h/m إلى مشروعك.
Yulingtianxia ، [email protected]
Blockhook متاح تحت رخصة معهد ماساتشوستس للتكنولوجيا. انظر ملف الترخيص لمزيد من المعلومات.
بفضل Mablockclosure والجوانب!