From eb4b29c6f2d58a4c7af2692fee68410a90d1af61 Mon Sep 17 00:00:00 2001 From: udevsharold <45226508+udevsharold@users.noreply.github.com> Date: Wed, 9 Sep 2020 20:35:38 +0800 Subject: [PATCH] Support for NFCActivator --- Headers/NFBackgroundTagReadingManager.h | 4 ++- Headers/NFCNDEFMessage.h | 4 +++ Headers/NFCNDEFPayload.h | 5 +++ Headers/NFTagInternal.h | 3 ++ Makefile | 4 ++- NSData+Conversion.h | 8 +++++ NSData+Conversion.m | 23 +++++++++++++ Tweak.xm | 43 ++++++++++++++++++++----- control | 2 +- 9 files changed, 85 insertions(+), 11 deletions(-) create mode 100644 Headers/NFCNDEFMessage.h create mode 100644 Headers/NFCNDEFPayload.h create mode 100644 Headers/NFTagInternal.h create mode 100644 NSData+Conversion.h create mode 100644 NSData+Conversion.m diff --git a/Headers/NFBackgroundTagReadingManager.h b/Headers/NFBackgroundTagReadingManager.h index c9a9cd5..4393f46 100644 --- a/Headers/NFBackgroundTagReadingManager.h +++ b/Headers/NFBackgroundTagReadingManager.h @@ -1,5 +1,6 @@ #import "NBETagLockProvider/NBETagLockProvider.h" #import "NBETagLockProvider/NBETagRemovalProtocol.h" +#import "NFTagInternal.h" @interface NFBackgroundTagReadingManager { NFDriverWrapper *_driverWrapper; @@ -9,7 +10,8 @@ - (id)initWithQueue:(id)arg1 driverWrapper:(id)arg2 lpcdHWSupport:(bool)arg3; - (void)didScreenStateChange:(bool)arg1; - (bool)updateAirplaneMode; +- (id)_readNDEFFromTag:(NFTagInternal *)tag; #pragma mark NBETagRemovalProtocol - (void)tagPresenceRemoved; -@end \ No newline at end of file +@end diff --git a/Headers/NFCNDEFMessage.h b/Headers/NFCNDEFMessage.h new file mode 100644 index 0000000..ed7b567 --- /dev/null +++ b/Headers/NFCNDEFMessage.h @@ -0,0 +1,4 @@ +@interface NFCNDEFMessage : NSObject +@property (nonatomic,copy) NSArray *records; +-(id)initWithNFNdefMessage:(id)message; +@end diff --git a/Headers/NFCNDEFPayload.h b/Headers/NFCNDEFPayload.h new file mode 100644 index 0000000..3102ce6 --- /dev/null +++ b/Headers/NFCNDEFPayload.h @@ -0,0 +1,5 @@ +@interface NFCNDEFPayload : NSObject +@property (nonatomic,copy) NSData *type; //@synthesize type=_type - In the implementation block +@property (nonatomic,copy) NSData *identifier; //@synthesize identifier=_identifier - In the implementation block +@property (nonatomic,copy) NSData *payload; //@synthesize payload=_payload - In the implementation block +@end diff --git a/Headers/NFTagInternal.h b/Headers/NFTagInternal.h new file mode 100644 index 0000000..4ee63a2 --- /dev/null +++ b/Headers/NFTagInternal.h @@ -0,0 +1,3 @@ +@interface NFTagInternal +@property (nonatomic,copy,readonly) NSData *tagID; +@end diff --git a/Makefile b/Makefile index 4dbcc7d..9316ff7 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,4 @@ +export DEBUG = 0 export FINALPACKAGE = 1 export TARGET = iphone:clang:11.2:latest @@ -9,8 +10,9 @@ include $(THEOS)/makefiles/common.mk TWEAK_NAME = NFCBackgroundEnabler -NFCBackgroundEnabler_FILES = Tweak.xm NBETagLockProvider/NBETagLockProvider.mm +NFCBackgroundEnabler_FILES = Tweak.xm NBETagLockProvider/NBETagLockProvider.mm NSData+Conversion.m NFCBackgroundEnabler_CFLAGS = -fobjc-arc +NFCBackgroundEnabler_FRAMEWORKS = CoreNFC include $(THEOS_MAKE_PATH)/tweak.mk SUBPROJECTS += nfcbackgroundenablerpreferences diff --git a/NSData+Conversion.h b/NSData+Conversion.h new file mode 100644 index 0000000..a608d81 --- /dev/null +++ b/NSData+Conversion.h @@ -0,0 +1,8 @@ +#import + +@interface NSData (NSData_Conversion) + +#pragma mark - String Conversion +- (NSString *)hexadecimalString; + +@end diff --git a/NSData+Conversion.m b/NSData+Conversion.m new file mode 100644 index 0000000..d6f5c0d --- /dev/null +++ b/NSData+Conversion.m @@ -0,0 +1,23 @@ +#import "NSData+Conversion.h" + +@implementation NSData (NSData_Conversion) + +#pragma mark - String Conversion +- (NSString *)hexadecimalString { + /* Returns hexadecimal string of NSData. Empty string if data is empty. */ + + const unsigned char *dataBuffer = (const unsigned char *)[self bytes]; + + if (!dataBuffer) + return [NSString string]; + + NSUInteger dataLength = [self length]; + NSMutableString *hexString = [NSMutableString stringWithCapacity:(dataLength * 2)]; + + for (int i = 0; i < dataLength; ++i) + [hexString appendString:[NSString stringWithFormat:@"%02lx", (unsigned long)dataBuffer[i]]]; + + return [NSString stringWithString:hexString]; +} + +@end diff --git a/Tweak.xm b/Tweak.xm index fe26f83..d5e3250 100644 --- a/Tweak.xm +++ b/Tweak.xm @@ -2,8 +2,14 @@ #import "Headers/NFDriverWrapper.h" #import "Headers/NFTimer.h" #import "Headers/NFTag.h" +#import "Headers/NFTagInternal.h" +#import "Headers/NFCNDEFMessage.h" +#import "Headers/NFCNDEFPayload.h" #import "NBETagLockProvider/NBETagLockProvider.h" #import "NBETagLockProvider/NBETagRemovalProtocol.h" +#import "NSData+Conversion.h" + +extern "C" CFNotificationCenterRef CFNotificationCenterGetDistributedCenter(void); float protectionTime = 2; float debounceTime = 1; @@ -72,14 +78,35 @@ bool tagLockEnable = YES; if (tagLockEnable) { self.tagLockProvider.debounceTime = debounceTime; - if (![self.tagLockProvider shouldSkipTag:tags[0]]) { - %orig; - } - } - else { - %orig; + if ([self.tagLockProvider shouldSkipTag:tags[0]]) return; } - + + %orig; + + if ([[NSFileManager defaultManager] fileExistsAtPath:@"/Library/MobileSubstrate/DynamicLibraries/NFCActivator.dylib"]){ + NSMutableArray *compiledData = [[NSMutableArray alloc] init]; + for (NFTagInternal *tag in tags) { + NSString *uid = [tag.tagID hexadecimalString]; + + NSMutableArray *records = [[NSMutableArray alloc] init]; + [self _readNDEFFromTag:tag]; + id messageInternal = [self _readNDEFFromTag:tag]; + NFCNDEFMessage *ndefMessage = [[NFCNDEFMessage alloc] initWithNFNdefMessage: messageInternal]; + for(NFCNDEFPayload *payload in ndefMessage.records) { + NSString *payloadData = [[NSString alloc] initWithData:payload.payload encoding:NSUTF8StringEncoding]; + NSString *type = [[NSString alloc] initWithData:payload.type encoding:NSUTF8StringEncoding]; + [records addObject:@{@"payload" : payloadData, @"type" : type}]; + } + + [compiledData addObject:@{@"uid" : uid, @"records" : [records copy]}]; + } + + dispatch_async(dispatch_get_main_queue(), ^{ + CFDictionaryRef userInfo = (__bridge CFDictionaryRef)@{@"data" : [compiledData copy]}; + CFNotificationCenterRef center = CFNotificationCenterGetDistributedCenter(); + CFNotificationCenterPostNotification(center, CFSTR("nfcbackground.newtag"), NULL, userInfo, TRUE); + }); + } } - (bool)updateAirplaneMode { @@ -150,4 +177,4 @@ static void reloadPreferences() { NULL, CFNotificationSuspensionBehaviorCoalesce ); -} \ No newline at end of file +} diff --git a/control b/control index 609a287..dd92698 100644 --- a/control +++ b/control @@ -1,7 +1,7 @@ Package: com.haotestlabs.nfcbackgroundenabler Name: NFCBackgroundEnabler Depends: mobilesubstrate -Version: 1.2.0.0 +Version: 1.2.0.1 Architecture: iphoneos-arm Description: Enables native background NFC detection on iPhones. Maintainer: ArandomDev