2013-05-12 29 views
6

Tôi đang tìm cách thực thi tệp Applescript từ trong Ứng dụng Mac. Tôi đã thực hiện các ứng dụng mac trước đó sử dụng NSAppleScript *script = [[NSAppleScript alloc] initWithSource: @"MY_CODE"]];, nhưng bản ghi của tôi khá dài và tôi muốn chỉ có thể tham chiếu tệp đó như một phần của dự án của tôi và đường ống trong nội dung của nó (hoặc chỉ thực thi trực tiếp tệp từ bên trong ứng dụng của tôi).Thực thi tệp AppleScript trong ứng dụng Mac?

Cảm ơn bạn!

+0

Bạn sẽ nhận được gì nếu bạn tìm kiếm '[goal-c] applescript' ở đây? –

Trả lời

2

Tại sao không đặt tập lệnh hoặc văn bản tập lệnh đã biên dịch vào gói của bạn và sau đó sử dụng initWithContentsOfURL:error: method của NSAppleScript?

Ví dụ:

NSError * error = NULL; 
NSURL * resourceURL = [[NSBundle mainBundle] resourceURL]; 
NSURL * urlOfScript = [resourceURL URLByAppendingPathComponent: @"MyApplescript.scpt"]; 
NSAppleScript *script = [[NSAppleScript alloc] initWithContentsOfURL: urlOfScript error: &error]; 
if(script == NULL) 
{ 
    NSLog(@"could not instantiate script at %@ - %@", [urlOfScript absolutePath], [error localizedDescription]); 
} 
11

Để chạy AppleScripts người dùng cung cấp bên ngoài sandbox (10.8+), sử dụng NSUserAppleScriptTask

Để chạy .scpt file nhúng trong gói ứng dụng của bạn, hoặc kịch bản người dùng cung cấp trong 10.7 trở về trước, hãy sử dụng NSAppleScript.

NSUserAppleScriptTask và NSAppleScript đều có một chút lame, hãy nhớ bạn. Không cung cấp chuyển đổi dữ liệu tự động giữa các loại Cocoa và AS, điều này có nghĩa là rất nhiều thao tác cắt bằng tay với NSAppleEventDescriptors để truyền các tham số và kết quả. Các thể hiện của NSAppleScript cung cấp sự hỗ trợ liên tục một phần: các thuộc tính của kịch bản giữ lại trạng thái trên nhiều trình xử lý cuộc gọi, nhưng không có cách nào để lưu tập lệnh bị thay đổi trở lại đĩa sao cho bất kỳ thay đổi nào bị mất sau khi được dealloced. Và NSUSerAppleScriptTask là một vấn đề nghiêm túc một lần, vì vậy trạng thái kịch bản không tồn tại ở tất cả giữa các cuộc gọi.

Đối với hội nhập sâu hơn giữa nhúng AppleScript và ObjC mã trong gói ứng dụng của bạn, sử dụng AppleScriptObjC (10.6+):

ASOC là cầu nối hai chiều ge tương tự như PyObjC hoặc RubyCocoa, cho phép bạn viết mã AppleScript của bạn trong các đối tượng script sau đó xuất hiện với mã ObjC của bạn như các lớp Cocoa thông thường, cho phép mã ObjC gọi AS handlers và AS code để gọi các phương thức ObjC. Các loại ObjC và AS thông thường (ints, double, NSStrings, NSArrays, vv) được tự động bao bọc/chuyển đổi khi băng qua cầu, do đó không yêu cầu thêm công việc nào khác thường xuyên cast ở phía AS.

ASOC không hoàn hảo (tài liệu riêng của Apple hút, cầu nối không phải là miễn phí và không ổn định), nhưng để tương tác với các ứng dụng có thể chạy được từ ObjC, nó là lựa chọn tốt nhất .

+0

Bất kỳ cách nào để chuyển tham số vào? Hoặc chúng ta phải xây dựng một kịch bản mới với các đối số được nội suy mỗi khi chúng ta cần gọi nó (thông số của người nghèo)? –

+0

Tiện ích dòng lệnh 'osascript' [đối số hỗ trợ theo cách phong nha] (http://hints.macworld.com/article.php?story=20050523140439734). Tôi hy vọng một cái gì đó tương tự là có thể trong Objective-C hoặc Swift. –

+1

Sử dụng ['NSAppleScript' /' NSUserAppleScriptTask'] (http://appscript.sourceforge.net/nsapplescript.html). Sử dụng ['AppleScriptObjC'] (http://appscript.sourceforge.net/asoc.html). – foo