Skip to content

Instantly share code, notes, and snippets.

@pookjw
Last active September 18, 2023 13:10
Show Gist options
  • Save pookjw/5bd7ffe7a7a68862a54bd45dbb026d59 to your computer and use it in GitHub Desktop.
Save pookjw/5bd7ffe7a7a68862a54bd45dbb026d59 to your computer and use it in GitHub Desktop.
/*
- Required entitlement:
<key>com.apple.springboard.hardware-button-service.event-consumption</key>
<true/>
- Required framework:
/System/Library/PrivateFrameworks/SpringBoardServices.framework/SpringBoardServices
*/
#import <UIKit/UIKit.h>
#import <objc/message.h>
@interface ViewController : UIViewController
@property (retain) id hardwareButtonService;
@property (retain, nullable) id eventConsumerInfo;
@end
@implementation ViewController
- (instancetype)initWithCoder:(NSCoder *)coder {
if (self = [super initWithCoder:coder]) {
_hardwareButtonService = [reinterpret_cast<id (*)(Class, SEL)>(objc_msgSend)(NSClassFromString(@"SBSHardwareButtonService"), NSSelectorFromString(@"sharedInstance")) retain];
}
return self;
}
- (void)dealloc {
reinterpret_cast<void (*)(id, SEL)>(objc_msgSend)(_eventConsumerInfo, NSSelectorFromString(@"invalidate"));
[_hardwareButtonService release];
[_eventConsumerInfo release];
[super dealloc];
}
- (void)consumeAnyPressEventForButtonKind:(long)arg1 {
NSLog(@"Triggered! %ld", arg1);
}
- (IBAction)consume:(id)sender {
reinterpret_cast<void (*)(id, SEL)>(objc_msgSend)(self.eventConsumerInfo, NSSelectorFromString(@"invalidate"));
/*
1 : Home Button
2 : Sleep Button
3 : Volume Up Button
4 : Volume Down Button
5~6 : Reserved?
<1, >6 : NSAssert
0x1853cb27c <+48>: sub x8, x22, #0x1
0x1853cb280 <+52>: cmp x8, #0x6
0x1853cb284 <+56>: b.hs 0x1853cb2ec ; <+160>
*/
self.eventConsumerInfo = reinterpret_cast<id (*)(id, SEL, long, id, long)>(objc_msgSend)(self.hardwareButtonService, NSSelectorFromString(@"beginConsumingPressesForButtonKind:eventConsumer:priority:"), 1, self, 0);
}
- (IBAction)invalidate:(id)sender {
reinterpret_cast<void (*)(id, SEL)>(objc_msgSend)(self.eventConsumerInfo, NSSelectorFromString(@"invalidate"));
self.eventConsumerInfo = nil;
}
@end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment