MacOS 开发 - NSWorkspace

简介

NSWorkspace继承自NSObject,属于AppKit.framework。一个NSWorkspace对象可以启动其他应用程序和执行各种文件处理服务。
NSWorkspace 为应用程序提供如下服务:
1)打开,操作文件/设备,获取文件/设备信息
2)跟踪文件,设备以及数据库的变动
3)设置或获取文件的 Finder 信息
4)操作应用程序。

一、操作应用程序

常用API

launchApplication: - 运行指定的app
launchApplicationAtURL:options:configuration:error: - 指定的url运行app
launchApplication:showIcon:autolaunch: - 使用附加的属性运行指定的app

hideOtherApplications - 隐藏其他发送者的所有应用程序

使用

1、打开pages,numbers

[[NSWorkspace sharedWorkspace] launchApplication:@"Pages"]; [[NSWorkspace sharedWorkspace] launchApplication:@"Numbers"];

二、打开文件

常用API

openURL:,打开指定的URL;
openFile: ,根据文件类型使用默认的app打开指定的文件
openFile:withApplication: ,使用指定的app打开文件
openFile:withApplication:andDeactivate: 使用指定的app打开文件, andDeactivate传入YES,如果发送请求前app在后台禁用,允许已经打开的app到前台。

使用方法

1、openURL 打开网页

#pragma mark - 使用safari打开网页
- (void)openUrlBySafari {
    NSURL * url = [NSURL URLWithString:@"http://blog.csdn.net/lovechris00?viewmode=contents"];
    [[NSWorkspace sharedWorkspace] openURL: url];
}

2、openURL 发送邮件

#pragma mark - 使用safari发邮件
- (void)sendEmail{
    NSURL *url = [NSURL URLWithString:@"mailto:abcdefg@163.com"];
    assert(url !=nil);
    [[NSWorkspace sharedWorkspace]openURL:url];
}

3、openURL 使用照片预览 打开 pdf 文件

#pragma mark - 使用照片预览 打开 pdf 文件
- (void)openPdfByDefault {
    NSString *path = @"/Users/user/Downloads/《明解C语言》.pdf";
    NSURL *fileURL = [NSURL fileURLWithPath: path];
    [[NSWorkspace sharedWorkspace] openURL: fileURL];
}

4、openURL 使用 safari 打开 pdf 文件

#pragma mark - 使用 safari 打开 pdf 文件
- (void)openPdfBySafari {
    NSString *path = @"/Users/user/Downloads/《明解C语言》.pdf";
    NSURL *fileURL = [NSURL fileURLWithPath: path];
    NSWorkspace * workspace = [NSWorkspace sharedWorkspace];
    [workspace openFile:[fileURL path] withApplication:@"Safari"];
}

5、打开 Pages 文件

如果使用 safari 打开 Pages 文件,Safari 打开后,识别到文件类型后,还是会自动打开 pages 编译器

#pragma mark - 使用默认模式 打开 Pages 文件
- (void)openPagesByDefault {
    NSString *path = @"/Users/user/Documents/需求文档.pages";
    NSURL *fileURL = [NSURL fileURLWithPath: path];
    NSWorkspace *workspace = [NSWorkspace sharedWorkspace];
    [workspace openURL: fileURL];
}

6、使用代码打开 dmg、pkg 文件

注意:url 要使用fileURLWithPath 来转化。使用 URLWithString 就没用了。

#pragma mark - 使用默认模式 打开 Pages 文件
 NSString *path = @"/Users/administrator/Downloads/MacCode_v1.46.dmg";
 NSString *pkgPath = @"/Users/administrator/Desktop/PKGDemo/build/PKGDemo1.pkg";
 NSWorkspace *workspace = [NSWorkspace sharedWorkspace];
 [workspace openURL:[NSURL fileURLWithPath:pkgPath]];

7、openFile 打开偏好设置

[[NSWorkspace sharedWorkspace] openFile:@"/System/Library/PreferencePanes/Security.prefPane”];
上面的是打开万能辅助的界面的代码。
如果你想打开,其他的界面可以替换后面的 Security.prefPane。
我们可以打开目录 /System/Library/PreferencePanes 一看

performFileOperation:source:destination:files:tag: 在一个特定的目录中执行对一组文件的文件操作,可操作类型有
NSWorkspaceMoveOperation - "Use -[NSFileManager moveItemAtURL:toURL:error:] instead.");
NSWorkspaceCopyOperation - "Use -[NSFileManager copyItemAtURL:toURL:error:] instead.");
NSWorkspaceLinkOperation - "Use -[NSFileManager linkItemAtURL:toURL:error:] instead.”);                                                                
NSWorkspaceDestroyOperation - "Use -[NSFileManager removeItemAtURL:error:] instead.”);

三、操作文件

常用API

selectFile:inFileViewerRootedAtPath: 根据文件夹全路径选择文件
duplicateURLs:completionHandler: - 以 Finder 操作的相同方式异步复制指定的 URL。
recycleURLs:completionHandler: - 以 Finder 操作的相同方式,移动指定的url到废纸篓
activateFileViewerSelectingURLs: 激活Finder,根据指定的多个文件,打开一个或者多个windows并且选中他们。

使用

1、selectFile 打开文件夹并选中文件

#pragma mark - 打开文件夹并选中文件
- (void)selectFileInFinder {
    NSString * path = @"/Users/MelissaShu/Pictures/看视频.png";
    NSURL *fileURL = [NSURL fileURLWithPath: path];
    NSWorkspace *workspace = [NSWorkspace sharedWorkspace];
    [workspace selectFile:[fileURL path] inFileViewerRootedAtPath:nil];//根据文件夹全路径 选择文件
}

我感觉 inFileViewerRootedAtPath: 应该很好用,不过博主调用失败了,有知道的同学,希望能够告诉我,我的方法是:
NSString *path2 = @"111.png";
NSURL *fileURL2 = [NSURL fileURLWithPath: path2];
[workspace selectFile:[fileURL2 path] inFileViewerRootedAtPath:@"/Users/MelissaShu/Pictures/"];

四、请求文件信息

常用API

getInfoForFile:application:type: 检索指定的文件的信息。
URLForApplicationToOpenURL: 返回将用于打开给定的URL的默认的app的URL。
fullPathForApplication: 返回指定app的全路径
getFileSystemInfoForPath:isRemovable:isWritable:isUnmountable:description:type: 用fullPath描述文件系统。
isFilePackageAtPath: 确定指定的路径是不是一个文件包。

@property(readonly, strong) NSRunningApplication frontmostApplication; 返回最前面的应用程序,接收事件的app。
@property(readonly, copy) NSArray<NSRunningApplication > runningApplications; , 返回正在运行的app

1、fullPathForApplication 获取指定app的全路径

- (void)getFullPathForApplication {
   NSString *fullPath = [[NSWorkspace sharedWorkspace] fullPathForApplication:@"Pages"];
    NSLog(@"fullPath:%@",fullPath);
}
打印结果:
fullPath:/Applications/Pages.app

2、getInfoForFile 获取文件信息

- (void)gatherFileInfo {
    NSString * path = @"/Users/MelissaShu/Pictures/看视频.png";
    NSURL *fileURL = [NSURL fileURLWithPath: path];
    NSWorkspace *workspace = [NSWorkspace sharedWorkspace];
    
    NSString *appName;
    NSString *fileType;
    
    //检索指定的文件的信息
    [workspace getInfoForFile: [fileURL path] application: &appName type: &fileType];
    NSLog(@"appName : %@ , fileType : %@",appName,fileType);
    
    BOOL removable = NO;
    BOOL writeable = NO;
    BOOL unmountable = NO;
    
    NSString *description;
    NSString *fileSystemType;

   //用fullPath描述文件系统
    [workspace getFileSystemInfoForPath:[fileURL path]
                            isRemovable: &removable
                             isWritable: &writeable
                          isUnmountable: &unmountable
                            description: &description
                                   type: &fileSystemType];
    
    NSString *fileInfo = [NSString stringWithFormat:
                     @"AppName: %@\ntype: %@"
                     @"\nremoveable: %d\nwriteable: %d\nunmountable: %d"
                     @"\ndescription: %@\nfileSystemType: %@",
                     appName, fileType,
                     removable, writeable, unmountable,
                     description, fileSystemType];
    
    NSLog (@" >> gather file info:\n%@", fileInfo);
}
打印结果
>> gather file info:
     AppName: /Applications/Preview.app
     type: png
     removeable: 0
     writeable: 1
     unmountable: 0
     description: hfs
     fileSystemType: hfs

五、操纵统一类型标识符信息 Uniform Type Identifier

typeOfFile:error: 返回指定文件的统一类型标识符,如果他能被探测到的话。
localizedDescriptionForType: 返回指定统一类型标识符的本地化描述
preferredFilenameExtensionForType: 返回指定统一类型标识符的文件后缀名
filenameExtension:isValidForType: 返回是否指定文件后缀是否适合统一类型标识符
type:conformsToType: 返回一个布尔值表示第一个统一类型标识符是否符合第二个统一类型标识符。
URLForApplicationWithBundleIdentifier: 返回相对于app指定标识符的url

六、管理图标

iconForFile: 返回指定文件包含的图标图片
iconForFileType: 返回指定类型指定文件包含的图标文件
iconForFiles: 返回指定多个文件包含的图标文件
setIcon:forFile:options: 带着附加的选项,为指定的路径文件或者目录 设置图标

1、iconForFile & iconForFileType 获取图片

- (void)getIconOfFile {
    NSWorkspace *workspace = [NSWorkspace sharedWorkspace];
    NSString *path = @"/Users/MelissaShu/Pictures/背景图/background0.png";
    NSURL *fileURL = [NSURL fileURLWithPath: path];
    self.imgView.image = [workspace iconForFile:[fileURL path]];//不显示图片,而是显示 图片类型文件 对应的图标
    
    NSString *path2 = [workspace fullPathForApplication:@"Safari"];
    self.imgView1.image  = [workspace iconForFile:path2];
    
    NSImage *xcodeIcon = [workspace iconForFileType:@"xcodeproj"];
    self.imgView2.image = xcodeIcon;
}

2、setIcon 设置文件预览图标

sqlist 原来是没有预览图的,我们改为系统图标
系统图标的方法,可参考:
http://blog.csdn.net/lovechris00/article/details/77994908

 NSString *path4 = @"/Users/MelissaShu/Documents/DATA.sqlist";
    [workspace setIcon:[NSImage imageNamed:NSImageNameQuickLookTemplate] forFile:path4 options:NSExcludeQuickDrawElementsIconCreationOption];

七、卸载设备

unmountAndEjectDeviceAtPath: 在指定的路径卸载和弹出设备。
unmountAndEjectDeviceAtURL:error: 尝试弹出安装在指定的路径的卷。

八、管理Bundles

  • absolutePathForAppBundleWithIdentifier: 返回一个app bundle在文件系统的绝对路径
  • launchAppWithBundleIdentifier:options:additionalEventParamDescriptor:launchIdentifier: 指定 bundleIdentifier 启动该应用程序。
  • openURLs:withAppBundleIdentifier:options:additionalEventParamDescriptor:launchIdentifiers: 从一个url数组打开一个或者多个文件

1、launchAppWithBundleIdentifier 通过BundleID 打开Safari

#pragma mark - 通过BundleID 打开APP
- (void)launchApplicationWithBundleID {
    NSWorkspace * workspace = [NSWorkspace sharedWorkspace];
    BOOL wasLaunched = [workspace launchAppWithBundleIdentifier: @"com.apple.Safari"
                       options: NSWorkspaceLaunchWithoutActivation
                       additionalEventParamDescriptor: NULL
                       launchIdentifier: nil];
    
    if( wasLaunched ){
        NSLog (@"Safari was launched");
    }else{
        NSLog (@"Safari was not launched");
    }
    NSArray * apps = [workspace valueForKeyPath:@"launchedApplications.NSApplicationName"];
    NSLog(@"Launched Applications:\n%@", apps);
}

九、管理桌面图片

  • desktopImageURLForScreen: 返回给定屏幕的桌面图片
  • setDesktopImageURL:forScreen:options:error: 指定给定的屏幕与图片url,为桌面设置图片
  • desktopImageOptionsForScreen: 返回给定屏幕的桌面图片选项
  • 执行Finder Spotlight搜索
    showSearchResultsForQueryString: 显示 Spotlight 搜索结果窗口

1、setDesktopImageURL 设置桌面背景图

- (void)setDesktopImage {
//    NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"wallpaper" ofType:@"jpg"];
//    NSURL* imageURL = [NSURL fileURLWithPath:imagePath isDirectory:NO];
     NSURL *imageURL = [[NSBundle mainBundle] URLForResource:@"background0" withExtension:@"jpg"];
      NSError *error;
      [[NSWorkspace sharedWorkspace] setDesktopImageURL:imageURL forScreen:[NSScreen mainScreen] options:nil error:&error];
    if (error) {
        NSLog(@"设置背景图失败:%@",error);
    }
}

2、desktopImageURLForScreen & desktopImageOptionsForScreen 获取桌面背景图&背景图信息

- (void)getDestopImage {
    NSURL *url = [[NSWorkspace sharedWorkspace] desktopImageURLForScreen:[NSScreen mainScreen]];
    NSImage *img = [[NSImage alloc]initWithContentsOfURL:url];
    NSLog(@"url:%@",url);
    self.imgView.image = img;

    NSDictionary *dic = [[NSWorkspace sharedWorkspace] desktopImageOptionsForScreen:[NSScreen mainScreen]];
    NSLog(@"当前桌面背景图信息:%@",dic);
}

十、执行 Finder Spotlight 搜索

1、showSearchResultsForQueryString: 显示 Spotlight 搜索结果窗口

- (void)searchFinder {
    [[NSWorkspace sharedWorkspace] showSearchResultsForQueryString:@"测试"];
}

十一、Finder文件标签

@property(readonly, copy) NSArray<NSColor *> *fileLabelColors; 返回相应文件在颜色数组中的文件标签

fileLabels 返回标签的数组

十二、跟踪文件系统的改变

  • noteFileSystemChanged: 通知workspace对象,文件系统在指定的路径发生变化。
    注销前请求额外的时间
  • extendPowerOffBy: 当关闭电源注销用户的时候,请求系统等待自定数量的时间
    支持可访问性
@property(readonly) BOOL accessibilityDisplayShouldDifferentiateWithoutColor; 一个布尔值,该值指示应用程序是否应避免通过单独的颜色展示信息。
@property(readonly) BOOL accessibilityDisplayShouldIncreaseContrast; 一个布尔值,该值指示应用程序是否应该显示高对比度的用户界面。

十三、常用用户信息字典的keys

@“NSApplicationPath”
app的全路径,一个NSString对象

@“NSApplicationName”
app的名称,一个NSString对象

@“NSApplicationBundleIdentifier”
app的bundle identifier,一个NSString对象

@“NSApplicationProcessIdentifier”
object. app的进程id,一个NSNumber对象

@“NSApplicationProcessSerialNumberHigh”
高长度的进程序列号(PSN),一个NSNumber对象

@“NSApplicationProcessSerialNumberLow”
低长度的进程序列号(PSN), 一个NSNumber对象

原文链接:https://blog.csdn.net/lovechris00/article/details/78128475

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容