Objective c 文本文件是';没有被创造 int main(int argc,const char*argv[]{ NSAppleScript*脚本=[[NSAppleScript alloc]initWithSource:@“告诉应用程序\“Safari\”返回窗口1的选项卡的URL”]; NSDictionary*scriptError=nil; NSAppleEventDescriptor*描述符=[script executeAndReturnError:&scriptError]; 如果(脚本错误){ NSLog(@“错误:%@”,脚本错误); }否则{ NSAppleEventDescriptor*listDescriptor=[描述符强制描述符类型:typeAEList]; NSMUTABLEARRY*结果=[[NSMUTABLEARRY alloc]init]; 对于(NSInteger i=1;i

Objective c 文本文件是';没有被创造 int main(int argc,const char*argv[]{ NSAppleScript*脚本=[[NSAppleScript alloc]initWithSource:@“告诉应用程序\“Safari\”返回窗口1的选项卡的URL”]; NSDictionary*scriptError=nil; NSAppleEventDescriptor*描述符=[script executeAndReturnError:&scriptError]; 如果(脚本错误){ NSLog(@“错误:%@”,脚本错误); }否则{ NSAppleEventDescriptor*listDescriptor=[描述符强制描述符类型:typeAEList]; NSMUTABLEARRY*结果=[[NSMUTABLEARRY alloc]init]; 对于(NSInteger i=1;i,objective-c,cocoa,scripting,applescript,Objective C,Cocoa,Scripting,Applescript,Tilde扩展由Unix shell处理。Objective-C不会自动将该字符串扩展为桌面目录的绝对路径 您需要使用stringByExpandingTildeInPath或 int main(int argc, const char * argv[]) { NSAppleScript *script = [[NSAppleScript alloc] initWithSource:@"tell application \"Safari\" to return URL of tabs o

Tilde扩展由Unix shell处理。Objective-C不会自动将该字符串扩展为桌面目录的绝对路径

您需要使用
stringByExpandingTildeInPath

int main(int argc, const char * argv[]) {
    NSAppleScript *script = [[NSAppleScript alloc] initWithSource:@"tell application \"Safari\" to return URL of tabs of window 1"];
    NSDictionary *scriptError = nil;
    NSAppleEventDescriptor *descriptor = [script executeAndReturnError:&scriptError];
    if(scriptError) {
        NSLog(@"Error: %@",scriptError);
    } else {
        NSAppleEventDescriptor *listDescriptor = [descriptor  coerceToDescriptorType:typeAEList];
        NSMutableArray *result = [[NSMutableArray alloc] init];
        for (NSInteger i = 1; i <= [listDescriptor numberOfItems]; ++i) {
            NSAppleEventDescriptor *URLDescriptor = [listDescriptor descriptorAtIndex:i];
            [result addObject: URLDescriptor.stringValue];
    }
    NSString *content = [result componentsJoinedByString:@","];

    NSData *fileContents = [content dataUsingEncoding:NSUTF8StringEncoding];
    [[NSFileManager defaultManager] createFileAtPath:@"~/Desktop/foo.txt"
                                            contents:fileContents
                                          attributes:nil];
    NSLog(@"Result: %@", [result copy]);
    }
    return 0;
}

要为
createFileAtPath

构建正确的路径来回答第二个问题,
告诉应用程序“Safari”获取每个窗口每个选项卡的URL
应该返回URL字符串列表(注意应用程序Apple事件支持中的任何错误/限制)


您可能还想考虑使用桥接器,它会为您做所有的数据转换和调用工作。虽然还不理想,但它不像NSAPPEScript/NSpApple Envidior描述符或令人沮丧的中断脚本脚本那样令人厌烦,因此通常是最容易和最可靠的方式来与“Apple Spice”对话。来自ObjC的应用程序。

要回答您的第一个问题,您可以使用:

NSSearchPathForDirectoriesInDomains(NSDesktopDirectory, NSUserDomainMask, YES);
而不是:

[content writeToFile:[NSHomeDirectory() stringByAppendingString: @"/Desktop/foo.txt"]
     atomically:YES
       encoding:NSUTF8StringEncoding
          error:nil]
content
是您在代码中使用的变量

NSData *fileContents = [content dataUsingEncoding:NSUTF8StringEncoding];
[[NSFileManager defaultManager] createFileAtPath:@"~/Desktop/foo.txt"
                                        contents:fileContents
                                      attributes:nil];