5

Tôi đang làm việc trên ứng dụng này ra mắt các ứng dụng khác. Tôi nghe ra mắt ứng dụng sử dụng:
Cách khởi chạy Ứng dụng, từ Ứng dụng của tôi, với thông số tùy chỉnh để tôi có thể kiểm tra xem ứng dụng có được khởi chạy bởi tôi không?

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

Và tôi khởi động chúng bằng cách sử (Mail chỉ là một ví dụ):

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

tôi đã làm một số nghiên cứu, và tôi thấy rằng bạn có thể gửi một đối số khi bạn khởi chạy một ứng dụng (đó là lý do tại sao tôi sử dụng var dict trong mã ở trên), nhưng tôi đang gặp vấn đề với điều này: thậm chí sử dụng NSWorkspaceLaunchWithoutActivation, Mail.app được khởi chạy và trở nên tập trung với một cửa sổ soạn thư mới. Tôi không biết tại sao nó lại làm vậy.

Một điều khác, nếu tôi quản lý thành công gửi đối số tùy chỉnh mà không tập trung ứng dụng, làm cách nào để kiểm tra xem ứng dụng có được khởi chạy hay không (kiểm tra xem đối số có ở đó) không?

PS: Tôi đang tìm các phương pháp sẵn sàng cho App Store.

+1

Bạn không thể kiểm tra args ra mắt của ứng dụng khác trừ khi ứng dụng cung cấp một API để làm như vậy giống như các dòng lệnh. Đối số là thứ bạn thấy trong main.m của mỗi mẫu ứng dụng Cocoa. Tôi muốn chuẩn POSIX argc và argv cho chính() – uchuugaka

+0

Bạn có thể lấy lại ID tiến trình sau khi khởi động và sử dụng nó để truy vấn sau này không? –

+0

NSWorkspaceLaunchConfigurationArguments không khả dụng cho các ứng dụng hộp cát: https://developer.apple.com/reference/appkit/nsworkspacelaunchconfigurationarguments –

Trả lời

1

Gửi dấu thời gian (UTC) cùng với tên ứng dụng bạn đã khởi động tới máy chủ hoặc tệp cục bộ nếu có thể.

Sau đó, bạn có thể theo dõi nó.

0

Trước tiên, tôi muốn thử NSWorkspaceLaunchAndHide nếu NSWorkspaceLaunchWithoutActivation không hoạt động ". Không lý tưởng, không có .. nhưng một kludge ...

Thứ hai ... đây là một "đầy đủ, chạy ví dụ" mà không lừa ..

#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 ->You ARE Mail's baby's daddy!

Xin chúc mừng !

+0

Cảm ơn bạn đã trả lời! Tôi sẽ thử nó sau. Btw, là cửa hàng ứng dụng sẵn sàng chưa? –

+0

Tôi không thấy bất cứ điều gì có thể xúc phạm công khai về nó ... Về cơ bản nó chỉ là một cách gọi khác là 'NSTask'. –

+0

Tôi xin lỗi nhưng điều này không hoạt động trong các ứng dụng hộp cát –

0

Bạn có thể tạo Tác vụ mới bằng NSTask. Với NSTask, bạn có thể đặt các đối số cũng như một số biến môi trường cho ứng dụng để bạn có thể kiểm tra xem nó có được khởi chạy bởi bạn hoặc bởi người khác hay không.

Đây là sniffet mẫu mã để làm như vậy:

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]; 
Các vấn đề liên quan