2013-04-15 16 views
11

Cooca uygulamasından en çok uygulamaya tuş vuruşlarını göndermem gerekiyor.Sandboxed kakao uygulamasından en önde gelen uygulamaya tuş vuruşlarını gönderin

Zaten CGEventCreateKeyboardEvent() ve AXUIElementPostKeyboardEvent() kullanarak bunun için çalışma kodum var, ancak yalnızca uygulama korumalı değilse çalışır.

Aynı amaçla Google'da arama yaptım, ancak herhangi bir çalışma çözümü bulamadım.

Bir Text uygulamasının ve birkaçının da korumalı ortamda aynı şeyi yaptıklarını gördüm, bu yüzden merak ediyorum, eğer birisi bana yardım etmeme yardımcı olursa, aText.app ve diğerlerinin sandbox ortamında tuş vuruşlarını gönderebildiğini merak ediyorum.

sayesinde

+0

Hangi uygulamaların bunu ve ne zaman yeniden oluşturmadığım hakkında yeterli bilgi verebilir misiniz? Bunu korumalı bir uygulamadan hiç görmedim. –

+0

Lütfen aText.app adresini kontrol edin, sadece Google'da bir metin yazın ve ilk bağlantıyı kontrol edin.Site sürümlerinin kum kutulu olmadığı, uygulama mağazasının sürümünün geçici bir istisna olmaksızın sanal alanda çalıştığı ve çalıştığı görülüyor. lütfen ben yanlış olup olmadığını bildirin.Teşekkürler – AmitSri

cevap

2

Bu aslında mümkündür. Burada mevcut bir örnek uygulamasını yaptık -

SendKey at GitHub Ben kolay yol aldı ve basit bir AppleScript ile başladı:

delay 5 

tell application "System Events" 
    repeat 10 times 
     keystroke "#" 
    end repeat 
end tell 

komut 'gecikme' sadece bana bir metin düzenleyicisi yapmak için yeterli zamanı verir En eski uygulama. Ne olduğunu görmek için bu betiği çalıştırmaya başlamanızı öneririm.

Sonra ben varsayılan Application şablonunu kullanarak bir Xcode proje oluşturulur ve yazdı:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    NSString*  scriptPath = [[NSBundle mainBundle] pathForResource:@"sendkey" ofType:@"scpt"]; 
    NSURL*   scriptURL = [NSURL fileURLWithPath:scriptPath]; 
    NSDictionary* errors; 
    NSAppleScript* script  = [[NSAppleScript alloc] initWithContentsOfURL:scriptURL error:&errors]; 

    NSLog(@"%@", errors); 

    [script executeAndReturnError:&errors]; 

    NSLog(@"%@", errors); 
} 

Bunu test çalıştığını doğrulandı için korumalı alan açmadan ve onu yaptılar. Sonra Sandboxing'i açtım ve tabiki kırdı. Ama neyse ki, bunun etrafında bir yol var. Şimdilik, Apple, com.apple.security.temporary-exception.apple-events adında geçici bir yetki veriyor. Ve istisnanın 'com.apple.systemevents' için verilmesini isteyebilirsiniz. Yine beklendiği gibi çalıştı,

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" 
    "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
    <dict> 
    <key>com.apple.security.temporary-exception.apple-events</key> 
    <array> 
     <string>com.apple.systemevents</string> 
    </array> 
    <key>com.apple.security.app-sandbox</key> 
    <true /> 
    </dict> 
</plist> 

Benim korumalı app bu hakkını eklendi ve imzalar kez: Bu gibi haklara sahibim dosya görüntüsü.

Şimdi, diğer anahtarları göndermek istiyorsanız, bu soru & cevabını, komut dosyanızın anında nasıl oluşturulacağını gösterecektir - Passing variables to an applescript.

Elbette, bunların hepsini bir kez çalıştırdıktan sonra, olayı kod içinde oluşturmak için NSAppleEventDescriptor ve ilgili sınıflara dönebilirsiniz, ancak bu teknikle oynamamıştım.

Elma yapmanız önermek lütfen unutmayın geçici yetki kullanırken aşağıdaki: seçerseniz Artık uygulamanızı sandbox değil

veya geçici istisna hakkını kullanmak, Apple'ın hata raporlama sistemi kullanmak Apple ile karşılaştığınız sorunu bildirin. Apple, OS X platformunu geliştirdiği için isteklerini dikkate alır. Ayrıca, istisnanın neden gerekli olduğunu açıklamak için iTunes Connect'te İnceleme Notları alanını da kullanın.

+0

Merhaba, çabalarınız için teşekkürler. Ama almadığım bir şey var. Apple script'i açıkladığınız için teşekkürler, ama asıl soru bunu el yazması ya da geçici bir istisna olmaksızın yapmaktır. – AmitSri

+0

aText.app yetkilerini codesign aracıyla kontrol ettim ve geçici bir istisna bulamadım. Test uygulamamda geçici bir istisna eklediğimde, codesign üzerinden yetkilendirmelerde aText.app'ın kullanılmadığını görebiliyorum geçici istisna. – AmitSri

+0

Çok basit bir şey olabilir, ama henüz bana çarpmadı. Bunu yapmak için hala şık bir yol bulmaya çalışıyorum. Ve oldukça popüler bir talep gibi göründüğü takdirde, çözümü bulduğunda yayınlanacak. :) teşekkürler – AmitSri

İlgili konular