八、AppleScript與OC交互

依舊假使有一個需求当辐,很簡單黎棠,根據(jù)xcodeproj路徑打開該Xcode工程晋渺。若該工程已經(jīng)打開镰绎,則關閉后再打開。

如果是通過OC來實現(xiàn)木西,OC可以調用下面的方法來實現(xiàn)打開Xcode工程畴栖。

[[NSWorkspace sharedWorkspace] openFile:@"對應的xcodeproj路徑" withApplication:@"該Mac的Xcode名稱" andDeactivate:YES];

但是沒有辦法重新打開該工程呀,在我已知的方法里OC沒有辦法來操作關閉Xcode這樣的需求八千。那么來通過AppleScript來操作吧驶臊。AppleScript本身就是來操作Mac上的應用程序的語言。

我們先通過腳本編輯器來嘗試下如何去關閉Xcode叼丑。

首先打開 腳本編輯器 关翎,> 文件 > 打開詞典 來查看Xcode的支持的AppleScript的操作有哪些?

image.png

我這里有三個Xcode鸠信,應用程序的名字不一樣纵寝,但是這幾個關閉和打開Xcode的AppleScript的命令都是一樣的。隨便選擇一個


WeChatd65df5f7249ffb7c87f00b4560eacc85.png

看到open方法星立,可以打開對應的文件爽茴。我們調用試下

tell application "Xcode8.1" -- 填寫需要打開的應用名稱
    open "/Users/lujh/Test/Test.xcodeproj"
end tell

能夠成功打開。
接下來close绰垂,close可以關閉文件或者windows室奏。

tell application "Xcode"
        
        repeat with aWindow in windows
            
            set aDocument to document of aWindow
            set currentPath to ""
            try
                set currentPath to path of aDocument
            end try
            if currentPath = "/Users/lujh/Test/Test.xcodeproj" then
                close aWindow
                exit repeat
            end if
            
        end repeat
    end tell

遍歷所有已經(jīng)打開的Xcode的windows,判斷path與要關閉的文件路徑是否一致劲装,一致則關閉該window胧沫。

現(xiàn)在我們已經(jīng)能夠滿足關閉和打開該工程了。那么整合下占业,給出一個便于調用的接口绒怨,handler。需要兩個參數(shù)谦疾,Xcode的名稱和需要重新打開的xcodeproj文件的路徑南蹂。

AppleScript代碼

on reopenWindowWithPath(XcodeName, windowPath)
    
    tell application XcodeName
        
        repeat with aWindow in windows
            
            set aDocument to document of aWindow
            set currentPath to ""
            try
                set currentPath to path of aDocument
            end try
            if currentPath = windowPath then
                
                close aWindow
                exit repeat
                
            end if
            
        end repeat
        
        open windowPath
        
    end tell
    
    return
    
end reopenWindowWithPath

在腳本編輯器,將文件保存為scpt格式念恍。只有這個格式才能被OC調用六剥。

通過OC調用AppleScript,創(chuàng)建NSAppleScript對象峰伙,傳入AppleScript所在的url疗疟。創(chuàng)建NSAppleEventDescriptor對象,指定suite词爬、eventID等秃嗜,這幾個宏是固定的,因為我們不需要其他的功能顿膨,所有不導入其他的庫锅锨,只重新聲明下這幾個宏定義。然后傳入指定的handler的函數(shù)名恋沃,key是固定的‘snam’必搞,并通過同樣的方法傳入需要的參數(shù)。最后調用executeAppleEvent 執(zhí)行AppleScript囊咏。

OC 代碼

+ (void)reopenXcodeWindowWithXcodeName:(NSString *)xcodeName projectPath:(NSString *)path
{
    NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"MobSDKToolScript" ofType:@"bundle"];
    NSBundle *scriptBundle = [NSBundle bundleWithPath:bundlePath];
    NSURL *url = [scriptBundle URLForResource:@"reopenXcode" withExtension:@"scptd" subdirectory:@"AppleScript"];
    
    NSAppleScript           * appleScript;
    NSAppleEventDescriptor  * thisApplication, *containerEvent;
    
    NSDictionary * appleScriptCreationError = nil;
    appleScript = [[NSAppleScript alloc] initWithContentsOfURL:url error:&appleScriptCreationError];
    
#define kASAppleScriptSuite 'ascr'
#define kASSubroutineEvent  'psbr'
#define keyASSubroutineName 'snam'
    containerEvent = [NSAppleEventDescriptor appleEventWithEventClass:kASAppleScriptSuite
                                                              eventID:kASSubroutineEvent
                                                     targetDescriptor:thisApplication
                                                             returnID:kAutoGenerateReturnID
                                                        transactionID:kAnyTransactionID];
    
    [containerEvent setParamDescriptor:[NSAppleEventDescriptor descriptorWithString:@"reopenWindowWithPath"]
                            forKeyword:keyASSubroutineName];
    
    NSAppleEventDescriptor  *arguments = [[NSAppleEventDescriptor alloc] initListDescriptor];
    NSString                *object;
    
    NSArray *scriptArgumentArray = @[[xcodeName stringByDeletingPathExtension], path];
    
    for (object in scriptArgumentArray)
    {
        [arguments insertDescriptor:[NSAppleEventDescriptor descriptorWithString:object]
                            atIndex:([arguments numberOfItems] + 1)];
    }
    
    [containerEvent setParamDescriptor:arguments forKeyword:keyDirectObject];
    
    //Execute the event
    NSDictionary *executionError = nil;
    NSAppleEventDescriptor *result = [appleScript executeAppleEvent:containerEvent error:&executionError];
    if (executionError != nil)
    {
        DLog(@"%@", [NSString stringWithFormat:@"error while executing script. Error %@",executionError]);
        
    }
    else
    {
        DLog(@"Script execution has succeed. Result(%@)",result);
    }
}
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末恕洲,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子梅割,更是在濱河造成了極大的恐慌霜第,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件户辞,死亡現(xiàn)場離奇詭異泌类,居然都是意外死亡,警方通過查閱死者的電腦和手機底燎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門刃榨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人双仍,你說我怎么就攤上這事枢希。” “怎么了朱沃?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵苞轿,是天一觀的道長。 經(jīng)常有香客問我逗物,道長呕屎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任敬察,我火速辦了婚禮秀睛,結果婚禮上,老公的妹妹穿的比我還像新娘莲祸。我一直安慰自己蹂安,他們只是感情好,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布锐帜。 她就那樣靜靜地躺著田盈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缴阎。 梳的紋絲不亂的頭發(fā)上允瞧,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音,去河邊找鬼述暂。 笑死痹升,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的畦韭。 我是一名探鬼主播疼蛾,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼艺配!你這毒婦竟也來了察郁?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤转唉,失蹤者是張志新(化名)和其女友劉穎皮钠,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赠法,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡麦轰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了期虾。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片原朝。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖镶苞,靈堂內(nèi)的尸體忽然破棺而出喳坠,到底是詐尸還是另有隱情,我是刑警寧澤茂蚓,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布壕鹉,位于F島的核電站,受9級特大地震影響聋涨,放射性物質發(fā)生泄漏晾浴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一牍白、第九天 我趴在偏房一處隱蔽的房頂上張望脊凰。 院中可真熱鬧,春花似錦茂腥、人聲如沸狸涌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帕胆。三九已至,卻和暖如春般渡,著一層夾襖步出監(jiān)牢的瞬間懒豹,已是汗流浹背芙盘。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留脸秽,地道東北人儒老。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像豹储,于是被迫代替她去往敵國和親贷盲。 傳聞我的和親對象是個殘疾皇子淘这,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容