iOS MobileSubstrate CFNotificationCenterPostNotification - 不工作

时间:2013-08-09 15:57:42

标签: ios jailbreak iphone-privateapi

我有一个SpringBoard挂钩,可以监听分布式通知。我已经在SpringBoard中收到的各种其他应用程序已发布通知。

如果我将userInfo传递为null,SpringBoard会收到来自所有应用的通知。如果我将CFDictionaryRef作为userInfo传递,SpringBoard只接收来自SpringBoard和SystemApps的通知。但是,用户应用无法发送通知。 (或者不是Springboard收到的)。

CFDictionaryRef是无辜的而不是罪魁祸首,因为当发件人和收件人是系统应用程序时,我能够传递它。

是否存在User Apps无法将userInfo对象发送到System Apps的限制?

修改 附加代码。我使用iOSOpenDev编译它。依靠NSLog进行调试。 场景1:如果您触摸SpringBoard,您会看到2条日志用于通知发送和收到通知。 场景2:调用任何系统应用程序,如时钟等,您会看到两个日志。 场景3:来自应用商店的任何应用,如SketchBookX等,只会打印一个日志以进行通知发送。它没有收到。

我尝试了各种CFNotificationCenterPostNotification但没有任何作用。

#import <UIKit/UIKit.h>
#include <CoreFoundation/CoreFoundation.h>
#include <CoreFoundation/CFNotificationCenter.h>
#include "GraphicsServices/GSEvent.h"

#define GS_EVENT_TYPE_OFFSET 2
#define HOME_DOWN 1000
#define HOME_UP 1001
#define VOL_DOWN_KEY_DOWN 1008
#define VOL_DOWN_KEY_UP 1009

extern "C" CFNotificationCenterRef CFNotificationCenterGetDistributedCenter(void);


void LogEvent(CFNotificationCenterRef center,
          void *observer,
          CFStringRef name,
          const void *object,
          CFDictionaryRef userInfo)
{

NSString *str = [[NSString alloc]initWithFormat:@"%@,%@,%d,%d,%d,%d,%d\r\n",
     (NSString*)CFDictionaryGetValue(userInfo,@"strWindow"),
     (NSString*)CFDictionaryGetValue(userInfo,@"strView"),
     [(NSNumber*)CFDictionaryGetValue(userInfo,@"phase") intValue],
     [(NSNumber*)CFDictionaryGetValue(userInfo,@"xInView") intValue],
     [(NSNumber*)CFDictionaryGetValue(userInfo,@"yInView") intValue],
     [(NSNumber*)CFDictionaryGetValue(userInfo,@"xInWindow") intValue],
     [(NSNumber*)CFDictionaryGetValue(userInfo,@"yInWindow") intValue]];

    NSLog(@"Area51 Notification Received: %@",str);
}

%hook UIApplication
-(void) sendEvent:(UIEvent*)event
{

if(  [NSStringFromClass([event class]) isEqualToString:@"UITouchesEvent"] )
{

    NSSet *touches = [event allTouches];

    NSEnumerator *enumerator = [touches objectEnumerator];
    id value;

    while ((value = [enumerator nextObject])) {
        UITouch *touch = value;
        NSString *strViewClassName;
        if(!touch.view)
            strViewClassName = @" ";
        else
            strViewClassName = [NSString stringWithString:NSStringFromClass([[touch view] class])];

        CFMutableDictionaryRef dictionary = CFDictionaryCreateMutable(NULL,0,&kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);

        CFDictionaryAddValue(dictionary, @"phase", [NSNumber numberWithInt:[touch phase]] );
        CFDictionaryAddValue(dictionary, @"strWindow", NSStringFromClass([[touch window] class]) );
        CFDictionaryAddValue(dictionary, @"strView", strViewClassName);
        CFDictionaryAddValue(dictionary, @"xInView", [NSNumber numberWithInt:[touch locationInView:touch.view].x]) ;
        CFDictionaryAddValue(dictionary, @"yInView", [NSNumber numberWithInt:[touch locationInView:touch.view].y]) ;
        CFDictionaryAddValue(dictionary, @"xInWindow", [NSNumber numberWithInt:[touch locationInView:nil].x]) ;
        CFDictionaryAddValue(dictionary, @"yInWindow", [NSNumber numberWithInt:[touch locationInView:nil].y]) ;

        CFNotificationCenterPostNotificationWithOptions(
             CFNotificationCenterGetDistributedCenter(),
             (CFStringRef)@"RecordTouch",
             NULL,
             dictionary,
             kCFNotificationDeliverImmediately|kCFNotificationPostToAllSessions);

            NSLog(@"Area 51: Notification Send for App: %@",[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleDisplayName"] );

    }

}

%orig;
}

%end

%hook SpringBoard
-(void)applicationDidFinishLaunching:(UIApplication*) application
{

CFNotificationCenterAddObserver(
    CFNotificationCenterGetDistributedCenter(),
    NULL,
    LogEvent,
    NULL,
    NULL,
    CFNotificationSuspensionBehaviorDeliverImmediately);

NSLog(@"Area51: ObserverAdded");

%orig;
}

%end

__attribute__((constructor)) void area51init() {

%init;
}

1 个答案:

答案 0 :(得分:0)

当使用Darwin Notification Center作为userInfo时,问题似乎是center被忽略(因此为NULL)。 Source

另见this thread