2013-04-22 18 views
11

Tôi đang cố gắng viết một ứng dụng chạy ẩn và chèn chạm vào bàn đạp hoặc các ứng dụng khác. Tôi hiểu rằng tôi sẽ sử dụng các API và cấu trúc riêng. Ứng dụng là ứng dụng dành cho doanh nghiệp và không cần được phê duyệt cho AppStore.Cách tìm cổng màu tím cho ứng dụng phía trước nhất trong iOS 5 trở lên?

Tôi đang sử dụng cấu trúc GSEvent theo đề xuất của KennyTM với một số sửa đổi nhỏ cho IOS 5/6. Tôi có thể gửi các sự kiện liên lạc và các sự kiện khác tới Springboard bằng cách gửi GSSystemEvents.

Tôi cũng cần có khả năng gửi các sự kiện tương tự cho các ứng dụng khác, nhưng tôi không thể tìm thấy cổng cho ứng dụng phía trước nhất.

Có cách nào để nhận cổng cho ứng dụng đang trả trước và chạy để tôi có thể gửi GSEvents của mình đến ứng dụng không?

Sẽ thật tuyệt nếu ai đó có thể chỉ cho tôi các ví dụ hoặc chỉ cho tôi cách tôi có thể nhận được cổng màu tím của ứng dụng phía trước nhất.

Cảm ơn!

Trả lời

12

CẬP NHẬT: Tôi chưa thử nghiệm tính năng này trên ios7.

Tôi xảy ra để làm việc trên cùng một yêu cầu chính xác trước đây.

Để nhận được cổng màu tím, bạn có thể sử dụng GSCopyPurpleNamedPort() với Id gói làm đối số.

Nếu bạn cần mô phỏng cảm ứng trên SpringBoard, hãy sử dụng GSGetPurpleSystemEventPort.

Với mã bên dưới này, bạn sẽ có thể nhận được cổng và sử dụng nó để tiêm rộng hệ thống cảm ứng.

#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); 
} 

Tôi đã thử nghiệm ... này hoạt động tốt trên iOS 5 và 6. Bạn có thể không cần phần khóa nếu bạn không tiêm khi màn hình khóa xuất hiện. Hy vọng điều này sẽ hữu ích.

+0

Điều đó hiệu quả! cảm ơn! – mercury00x

+0

@ mercury00x bạn rất hoan nghênh – pt2121

+1

Tuyệt vời .. !! Làm việc như người ở..!! – Apurv

Các vấn đề liên quan