繁体   English   中英

从 cocoa 运行 applescript 应用程序停止工作

[英]run applescript from cocoa app stopped working

直到最近,这段代码一直运行良好。 我没有改变任何东西,也没有升级我的系统,我完全糊涂了。

我已经使用它 6 年了,现在它死在我身上。

从 cocoa 应用程序中运行 applescript 是否有更简单或更好的方法? 在这一点上,我很乐意花钱解决这个问题!

实用程序.h

#import <Foundation/Foundation.h>

@interface Utils : NSObject
// Runs an applescript with a given map of variables (name/value)
+ (NSArray *)runApplescript:(NSString *)source withVariables:(NSDictionary *)variables;
// Runs an applescript from a file pathwith a given map of variables
// (name/value)
+ (NSArray *)runApplescriptFromFile:(NSString *)scriptName withVariables:(NSDictionary *)variables;
+ (NSArray *)arrayFromDescriptor:(NSAppleEventDescriptor *)descriptor;
// String is empty or only has white characters (space, tab...)
+ (BOOL)stringIsEmptyOrWhite:(NSString *)string;
@end

Utils.M #import "Utils.h"

@implementation Utils

+ (NSArray *)arrayFromDescriptor:(NSAppleEventDescriptor *)descriptor {
    // Enumerate the apple descriptors (lists) returned by the applescript and
    // make them into arrays
    NSMutableArray *returnArray = [NSMutableArray array];
    NSInteger counter, count = [descriptor numberOfItems];

    for (counter = 1; counter <= count; counter++) {
        NSAppleEventDescriptor *desc = [descriptor descriptorAtIndex:counter];
        if (nil != [desc descriptorAtIndex:1]) {
            [returnArray addObject:[Utils arrayFromDescriptor:desc]];
        } else {
            NSString *stringValue = [[descriptor descriptorAtIndex:counter] stringValue];
            if (nil != stringValue) {
                [returnArray addObject:stringValue];
            } else {
                [returnArray addObject:@""];
            }
        }
    }
    return returnArray;
    
}
+ (NSString *)escapeCharacters:(NSString *)string {
    return [string stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""];
}

+ (NSArray *)runApplescript:(NSString *)source withVariables:(NSDictionary *)variables {
    NSString *input = @"";
    NSArray *variableNames = [variables allKeys];
    // Transform the dictionary of names/values to set sentences of applescript
    for (NSString *variableName in variableNames) {
        NSObject *variableValue = [variables objectForKey:variableName];
        if ([variableValue isKindOfClass:[NSString class]]) {
            input =
                [input stringByAppendingString:[NSString stringWithFormat:@"set %@ to (\"%@\" as text)\n", variableName,
                                                                          [Utils escapeCharacters:variableValue], nil]];
        } else if ([variableValue isKindOfClass:[NSNumber class]]) {
            input = [input stringByAppendingString:[NSString stringWithFormat:@"set %@ to (%@ as integer)\n",
                                                                              variableName, variableValue, nil]];
        } else if ([variableValue isKindOfClass:[NSArray class]]) {
            // Initialize a list
            NSString *entry;
            NSArray *values = (NSArray *)variableValue;
            input = [input stringByAppendingString:[NSString stringWithFormat:@"set %@ to {", variableName]];
            BOOL first = TRUE;
            for (entry in values) {
                if (!first) {
                    input = [input stringByAppendingString:@", "];
                }
                input = [input
                    stringByAppendingString:[NSString stringWithFormat:@"\"%@\"", [Utils escapeCharacters:entry], nil]];

                first = FALSE;
            }
            input = [input stringByAppendingString:@"}\n"];
        }
    }
    NSString *finalScript = [input stringByAppendingString:[NSString stringWithFormat:@"\n\n%@", source]];
    NSLog(@"Final script: %@", finalScript);
    NSAppleScript *script = [[NSAppleScript alloc] initWithSource:finalScript];
    NSDictionary *error;
    NSAppleEventDescriptor *descriptor = [script executeAndReturnError:&error];
    NSLog(@"applescript error: %@", [error description]);
    // Transform the return value of applescript to nested nsarrays
    return [Utils arrayFromDescriptor:descriptor];
}
+ (NSArray *)runApplescriptFromFile:(NSString *)scriptName withVariables:(NSDictionary *)variables {
    NSString *scriptPath = [[NSBundle mainBundle] pathForResource:scriptName ofType:@"applescript"];
    NSString *scriptSource =
        [[NSString alloc] initWithContentsOfFile:scriptPath encoding:NSASCIIStringEncoding error:nil];
    return [Utils runApplescript:scriptSource withVariables:variables];
}
+ (BOOL)stringIsEmptyOrWhite:(NSString *)string {
    string = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
    return [string isEqualToString:@""];
}

@end

更容易,是的,尽管这是否是您的实际问题是另一个问题。

http://appscript.sourceforge.net/asoc.html

我假设您已经处理了其他详细信息,包括沙盒和强化设置以及 plist 条目。 (最近的 Xcode 升级也有在自动升级项目文件时打破它的习惯,通过为您打开硬化,这样 Apple 事件就无法退出。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM