11

バックグラウンドで実行され、スプリングボードまたは他のアプリにタッチを挿入するアプリを作成しようとしています。プライベート API と構造を使用することを理解しています。アプリはエンタープライズ アプリであり、AppStore で承認される必要はありません。

KennyTM によって提案された GSEvent 構造を、IOS 5/6 用に少し変更して使用しています。GSSystemEvents を送信することで、タッチ イベントやその他のイベントを Springboard に送信できます。

同様のイベントを他のアプリケーションにも送信できるようにする必要がありますが、最前面のアプリケーションのポートを見つけることができません。

GSEvents をアプリに送信できるように、事前に実行されているアプリケーションのポートを取得する方法はありますか?

誰かが私に例を示したり、最前面のアプリの紫色のポートを取得する方法を教えてくれたりするといいでしょう.

ありがとう!

4

1 に答える 1

12

更新: 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 で正常に動作します。ロック画面が表示されたときに注入しない場合、ロック部分は必要ないかもしれません。お役に立てれば。

于 2013-04-22T22:04:02.493 に答える