5

Diğer uygulamalar başlatan bu uygulama üzerinde çalışıyorum. Ben kullanmaya devam eden uygulama lansmanları dinliyorum:
Uygulamamın uygulamalarını nasıl başlattığımı kontrol etmek için Uygulamamdan özel bir parametreyle nasıl çıkacağım?

[[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self 
selector:@selector(appLaunched:) name:NSWorkspaceDidLaunchApplicationNotification 
object:nil]; 

Ve onların kullanarak başlatmak (Posta sadece bir örnektir):

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSArray arrayWithObject:@"lalalala"], NSWorkspaceLaunchConfigurationArguments, nil]; 
[[NSWorkspace sharedWorkspace] launchApplicationAtURL:[NSURL URLWithString:@"/Applications/Mail.app"] options:NSWorkspaceLaunchWithoutActivation configuration:dict error:nil]; 

biraz araştırma yaptım ve senin gönderebilmesi gördü Bir uygulamayı başlattığınızda bir argüman (bu yüzden yukarıdaki kodda var dict kullandım), ancak bu konuda bir sorun yaşıyorum: NSWorkspaceLaunchWithoutActivation kullanarak bile, Mail.app başlatılır ve yeni bir oluşturma penceresi ile odaklanır. Bunu neden yaptığını bilmiyorum.

Uygulamaya odaklanmadan başarılı bir şekilde özel bir argüman göndermeyi başarabilirsem başka bir şey, uygulamanın bana göre başlatılıp başlatılmadığını nasıl kontrol edebilirim (argüman olup olmadığını kontrol et)?

PS: App Store için hazır yöntemler arıyorum.

+1

başka uygulamanın başlatılması args kontrol edemez: İşte

bunu örnek kod sniffet olduğunu. Tartışma, her bir Kakao uygulama şablonunun main.m bölümünde gördüğünüz şeydir. Standart POSIX argc ve mainv için argv() – uchuugaka

+0

Ben başlatmadan sonra bir süreç kimliği alabilir ve daha sonra sorgulamak için kullanabilir miyim? –

+0

NSWorkspaceLaunchConfigurationArguments, korumalı uygulamalar için kullanılamıyor: https://developer.apple.com/reference/appkit/nsworkspacelaunchconfigurationarguments –

cevap

1

Zaman damgasını (UTC) sunucu ile başlattığınız uygulama adıyla veya mümkünse yerel bir dosyayla birlikte gönderin.

Sonra izleyebilirsiniz.

0

İlk olarak, NSWorkspaceLaunchWithoutActivation "çalışma" değilse NSWorkspaceLaunchAndHide'u denerim. İdeal olmayan, hayır .. ama kludge ...

İkincisi ... Burada hile yok "tam, çalışan örnek" ..

#import <Cocoa/Cocoa.h> 
NSString *psAUX(NSString*grep) {  
    FILE *read_f; char buff[BUFSIZ+1]; int char_rd; NSString *res, *cmnd; 
    memset(buff, '\0', sizeof(buff)); 
    cmnd = [NSString stringWithFormat:@"/bin/ps aux|grep -i %@",grep]; 
    read_f = popen(cmnd.UTF8String, "r"); 
    if (read_f == NULL) return nil; 
    char_rd = fread(buff, sizeof(char), BUFSIZ, read_f); 
    if (!char_rd) return nil; 
    return res = [NSString stringWithUTF8String:buff], pclose(read_f), res; 
} 
int main(int argc, char *argv[]) { @autoreleasepool {   
    NSString* secretStr; NSURL *mailURL; NSDictionary *cfg; NSWorkspace *ws; NSApplication.sharedApplication; 
    secretStr = @"TAMPAX"; 
    mailURL = [NSURL URLWithString:@"file:///Applications/Mail.app"]; 
    cfg = @{NSWorkspaceLaunchConfigurationArguments:@[secretStr]}; 
    ws = NSWorkspace.sharedWorkspace; 
    [ws launchApplicationAtURL:mailURL options:0 configuration:cfg error:nil]; 
    fprintf(stderr,"%s", 

     [psAUX(@"Mail.app") containsString:secretStr] 
     ? "You ARE Mail's baby's daddy!" 
     : "Hands off, she's NOT yours!"); 

[NSApp run]; } } 

NSLog var ->You ARE Mail's baby's daddy!

Tebrikler !

+0

Cevabınız için teşekkürler! Daha sonra deneyeceğim. Btw, bu uygulama hazır mı? –

+0

Bu konuda açıkça rahatsız edici olan hiçbir şey görmüyorum ... Temelde 'NSTask' demenin farklı bir yolu. –

+0

Üzgünüm ama bu korumalı uygulamalarda çalışmıyor –

0

NSTask kullanarak yeni bir Görev oluşturabilirsiniz. NSTask ile argümanların yanı sıra bazı ortam değişkenlerini uygulamaya geçirebilirsiniz, böylece sizin veya başka birinin sizin tarafından başlatılıp başlatılmadığını kontrol edebilirsiniz. söz konusu uygulama sadece komut satırı gibi bunu yapmak için bir API sağlar sürece

NSTask* taskApp = [[NSTask alloc] init]; 
[taskApp setLaunchPath:@"App path goes here"]; 
[taskApp setArguments:[NSArray arrayWithObjects:@"Arg1",@"arg2", nil]]; 
[taskApp setEnvironment: [[NSProcessInfo processInfo] environment]]; 
[taskApp launch]; 
İlgili konular