[英]Use a relative path with NSTask Arguments in Objective-C
除了 shell 腳本之外,我幾乎沒有任何編程經驗,但是我需要使用 launchd 調用二進制文件,並且由於 Catilina 中的安全更改,它看起來好像不能是 AppleScript .app、Automator .app,或鴨嘴獸 .app。 所有這三個都調用了某種 GUI 元素,並且在啟動時都不會工作。
我拼湊了一段代碼,可以編譯並調用我需要的腳本。 我把它捆綁了一個 .app,簽名,它工作正常。 但我非常想調用相對於二進制文件的腳本。
我怎樣才能調用相當於
[task setArguments:@[ @"../Resources/script" ]];
代替
[task setArguments:@[ @"/Full/Path/To/script" ]];
下面是 main.m 的全部內容
#import <Foundation/Foundation.h>
enter code here
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSTask *task = [[NSTask alloc] init];
[task setLaunchPath:@"/bin/zsh"];
[task setArguments:@[ @"/Full/Path/To/script" ]];
[task launch];
}
return 0;
}
順便說一句,我知道有更好的方法可以做到這一點,但我的目標不是擁有一個獲獎的應用程序,而是簡單地解決一個特定的問題。 非常感謝。
使用
NSFileManager
獲取當前目錄
NSString* path = [[NSFileManager defaultManager] currentDirectoryPath];
argv
的第一個參數是二進制文件的路徑
任何一個
NSString *path = [NSString stringWithUTF8String:argv[0]];
或者
NSString *path = [[NSProcessInfo processInfo] arguments][0];
您應該為此使用NSBundle
。 特別是,您應該使用:
[[NSBundle mainBundle] pathForResource:@"script" ofType:nil]
如:
[task setArguments:@[ [[NSBundle mainBundle] pathForResource:@"script" ofType:nil] ]];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.