更新:これはios7でテストしていません。
私は前とまったく同じ要件に取り組んでいます。
パープルポートを取得するには、バンドルIDを引数としてGSCopyPurpleNamedPort()を使用できます。
SpringBoardでタッチをシミュレートする必要がある場合は、GSGetPurpleSystemEventPortを使用します。
このコードでは、ポートを取得してタッチシステム全体に注入することができるはずです。私がテストしてみた
#import <dlfcn.h>
// Framework Paths
#define SBSERVPATH "/System/Library/PrivateFrameworks/SpringBoardServices.framework/SpringBoardServices"
-(mach_port_t)getFrontMostAppPort
{
bool locked;
bool passcode;
mach_port_t *port;
void *lib = dlopen(SBSERVPATH, RTLD_LAZY);
int (*SBSSpringBoardServerPort)() = dlsym(lib, "SBSSpringBoardServerPort");
void* (*SBGetScreenLockStatus)(mach_port_t* port, bool *lockStatus, bool *passcodeEnabled) = dlsym(lib, "SBGetScreenLockStatus");
port = (mach_port_t *)SBSSpringBoardServerPort();
dlclose(lib);
SBGetScreenLockStatus(port, &locked, &passcode);
void *(*SBFrontmostApplicationDisplayIdentifier)(mach_port_t *port, char *result) = dlsym(lib, "SBFrontmostApplicationDisplayIdentifier");
char appId[256];
memset(appId, 0, sizeof(appId));
SBFrontmostApplicationDisplayIdentifier(port, appId);
NSString * frontmostApp=[NSString stringWithFormat:@"%s",appId];
if([frontmostApp length] == 0 || locked)
return GSGetPurpleSystemEventPort();
else
return GSCopyPurpleNamedPort(appId);
}
...これは、ロック画面が現れたときに注入しない場合は、ロック部を必要としないかもしれないのiOS 5と6 で正常に動作します。 これが役立つことを願っています。
すごくうまくいった!ありがとう! – mercury00x
@ mercury00xあなたは大歓迎です – pt2121
すばらしい!チャームのように働いて.. !! – Apurv