2013-04-22 15 views
11

Arka planda çalışan ve sıçrama tahtası veya diğer uygulamalara dokunmalarını enjekte eden bir uygulama yazmaya çalışıyorum. Özel API'leri ve yapıları kullanacağımı anlıyorum. Uygulama bir kurumsal uygulama ve AppStore için onaylanmış olması gerekmez.IOS 5 ve üstü sürümlerde en çok kullanılan uygulama için mor bağlantı noktası nasıl bulunur?

IOS 5/6 için bazı küçük değişikliklerle birlikte KennyTM tarafından önerilen GSEvent yapısını kullanıyorum. GSSystemEvents göndererek Springboard'a dokunma olayları ve diğer etkinlikleri gönderebiliyorum.

Benzer uygulamalar diğer uygulamalara da gönderebilmem gerekir, ancak en çok uygulamanın ön bağlantı noktasını bulamıyorum.

Uygulama için GSEvents'ları gönderebilmem için önyüklenen ve çalıştırılan uygulama için bağlantı noktası almanın bir yolu var mı?

Birisi bana örneklere işaret edebilir veya bana en uygulamanın önündeki mor bağlantı noktasını nasıl alabileceğimi gösterebilirse iyi olur.

Teşekkürler!

cevap

12

GÜNCELLEME: Bunu ios7 üzerinde test etmedim.

Daha önce aynı gereksinim üzerinde çalışıyorum.

Mor bağlantı noktasını almak için GSCopyPurpleNamedPort() öğesini paket kimliğiyle argüman olarak kullanabilirsiniz.

SpringBoard'a dokunarak simüle etmeniz gerekiyorsa, GSGetPurpleSystemEventPort'u kullanın.

Aşağıdaki kodla, bağlantı noktası elde edebilmeniz ve bağlantı sistemini enjekte etmek için kullanabilmeniz gerekir.

Ive'sınav
#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); 
} 

... Bu iOS 5 üzerinde çalışıyor ve kilit ekranı göründüğünde enjekte yoksa 6. Kilit parçası gerekmeyebilir. Bu yardımcı olur umarım.

+0

Bu harika çalıştı! Teşekkürler! – mercury00x

+0

@ mercury00x Çok beğenirsiniz – pt2121

+1

Harika .. !! Bir çekicilik gibi çalıştı .. !! – Apurv

İlgili konular