Applescript в проекте Objective C - PullRequest
0 голосов
/ 02 октября 2011

Я пытаюсь запустить эту команду сценария оболочки через appleScript в моем приложении Mac.Он отлично работает в редакторе яблочного сценария, но когда я запускаю его в xcode, как показано ниже, он не работает.Я делаю это неправильно?

NSString *asString = [[NSString alloc] initWithFormat:@"property MACaddr : \"gg:gg:gg:gg:gg:gg\"\n property WAN_IP_address : \"255.255.255.255\"\n property port_number : \"9\"\n "
                    "on run\n set command to \"/usr/bin/php -r \" & quoted form of (\"$mac = \" & quoted form of MACaddr & \"; $porttemp = \" & quoted form of port_number & \";$ip = \" & quoted form of WAN_IP_address & \"; \" & \"" 
                                        "$mac_bytes = explode(\\\":\\\", $mac); "
                                          " $mac_addr = \\\"\\\"; "
                                          " for ($i=0; $i<6; $i++) "
                                          " $mac_addr .= chr(hexdec($mac_bytes[$i]));" 
                                          " $packet = \\\"\\\"; "
                                          " for ($i=0; $i<6; $i++)   "
                                          " $packet .= chr(255); "
                                           "for ($i=0; $i<16; $i++)  "
                                           "$packet .= $mac_addr;" 
                                          " $port = $porttemp; "
                                           "$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);" 
                                           "socket_set_option($sock, SOL_SOCKET, SO_BROADCAST, TRUE);" 
                                           "socket_sendto($sock, $packet, strlen($packet), 0, $ip, $port);" 
                                           "socket_close($sock);\") "
                                           "do shell script command \n"
                                            "end run"   ];
NSLog(@"the applescript %@", asString);
NSAppleScript *asScript = [[NSAppleScript alloc] initWithSource:asString];
[asScript executeAndReturnError:nil];
[asString release];
[asScript release];

Вот точный appleScript, который отлично работает в моем редакторе Applescript.Я отредактировал вышеупомянутую часть с правильными обратными слешами и все так же, как мой яблочный пирог, который работает.Однако, это все еще не работает в xcode, и волшебный пакет не отправляется.(используя wireshark, чтобы контролировать это.) Есть идеи, что не так?Я даже добавил часть запуска.

property MACaddr : "gg:gg:gg:g4:g5:gg"
property WAN_IP_address : "255.255.255.255"
property port_number : "9"

on run
    set command to "/usr/bin/php -r " & quoted form of ("$mac = " & quoted form of     MACaddr & "; $porttemp = " & quoted form of port_number & ";$ip = " & quoted form of WAN_IP_address & "; " & " 


$mac_bytes = explode(\":\", $mac); 
$mac_addr = \"\"; 
for ($i=0; $i<6; $i++) 
$mac_addr .= chr(hexdec($mac_bytes[$i])); 
$packet = \"\"; 
for ($i=0; $i<6; $i++)  /*6x 0xFF*/ 
$packet .= chr(255); 
for ($i=0; $i<16; $i++) /*16x MAC address*/ 
$packet .= $mac_addr; 

$port = $porttemp; 
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); 
socket_set_option($sock, SOL_SOCKET, SO_BROADCAST, TRUE); 
socket_sendto($sock, $packet, strlen($packet), 0, $ip, $port); 
socket_close($sock); 
")
    do shell script command
end run

в любом случае, у меня все работает НАКОНЕЦ.Понятия не имею, что именно это было, но вот код для того, кто хочет запустить php-скрипт для магического пакета WOL (wake on lan) через PHP в качестве сценария оболочки appleScript в целевой среде c.Ага.Вот отредактированный и рабочий:

NSString *asString = [[NSString alloc] initWithFormat:@"property MACaddr : \"gg:gg:gg:gg:gg:gg\"\n property WAN_IP_address : \"255.255.255.255\"\n property port_number : \"9\"\n "
                    "on run\n set command to \"/usr/bin/php -r \" & quoted form of (\"$mac = \" & quoted form of MACaddr & \"; $porttemp = \" & quoted form of port_number & \";$ip = \" & quoted form of WAN_IP_address & \"; \" & \"\n" 
                                        "$mac_bytes = explode(\\\":\\\", $mac);\n "
                                          " $mac_addr = \\\"\\\";\n "
                                          " for ($i=0; $i<6; $i++) "
                                          " $mac_addr .= chr(hexdec($mac_bytes[$i]));\n" 
                                          " $packet = \\\"\\\";\n "
                                          " for ($i=0; $i<6; $i++)\n     "
                                          " $packet .= chr(255);\n "
                                           "for ($i=0; $i<16; $i++)\n    "
                                           "$packet .= $mac_addr;\n" 
                                          " $port = $porttemp;\n "
                                           "$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);\n" 
                                           "socket_set_option($sock, SOL_SOCKET, SO_BROADCAST, TRUE);\n" 
                                           "socket_sendto($sock, $packet, strlen($packet), 0, $ip, $port);\n" 
                                           "socket_close($sock);\")\n "
                                           "do shell script command \n"
                                            "end run"   ];
NSLog(@"the applescript %@", asString);
NSString *script2 = [asString stringByReplacingOccurrencesOfString:@"gg:gg:gg:gg:gg:gg" withString:AirportMAC];
NSAppleScript *asScript = [[NSAppleScript alloc] initWithSource:script2];
[asScript executeAndReturnError:nil];
[asString release];
[asScript release];

Большое спасибо всем за помощь!

Ответы [ 2 ]

1 голос
/ 02 октября 2011

Никогда не делайте этого:

NSLog([asScript stringValue]);

Всегда делайте это:

NSLog("%@",[asScript stringValue]);

Передача строк неизвестного формата в NSLog () - это быстрый путь к корзине с ошибками.

0 голосов
/ 02 октября 2011

Определенно проблема с символами обратной косой черты.NSLog вашу переменную asString и попробуйте запустить этот напечатанный код в редакторе, и вы увидите ошибку.

Если в строке есть кавычки, вам потребуется тройная обратная косая черта!

"$mac_bytes = explode(\":\", $mac); "

должно быть

"$mac_bytes = explode(\\\":\\\", $mac); "

и в других местах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...