Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从Mac上的cocoa应用程序内部启动和终止应用程序_Cocoa - Fatal编程技术网

如何从Mac上的cocoa应用程序内部启动和终止应用程序

如何从Mac上的cocoa应用程序内部启动和终止应用程序,cocoa,Cocoa,我的Cocoa应用程序需要启动和终止其他应用程序。请让我知道任何可以执行以下操作的示例代码: 从代码内部启动应用程序 从代码内部终止应用程序 要启动应用程序,请执行以下操作: [[NSWorkspace sharedWorkspace] launchApplication:@"App"]; 从 退出: NSApp应用程序有一个-terminate:method:[NSApp terminate:nil] 从假设这是针对10.6的,您可以使用NSRunningApplication以及NSWor

我的Cocoa应用程序需要启动和终止其他应用程序。请让我知道任何可以执行以下操作的示例代码:

  • 从代码内部启动应用程序
  • 从代码内部终止应用程序
  • 要启动应用程序,请执行以下操作:

    [[NSWorkspace sharedWorkspace] launchApplication:@"App"];
    

    退出:

    NSApp应用程序有一个-terminate:method:
    [NSApp terminate:nil]


    假设这是针对10.6的,您可以使用
    NSRunningApplication
    以及
    NSWorkspace
    。首先,您应该使用以下方法确定应用程序是否已在运行:

    [[NSWorkspace sharedWorkspace] runningApplications]
    

    如果它未运行,则可以使用
    NSWorkspace
    启动它,但我建议使用较新的调用
    launchApplicationAtURL:options:configuration:error:
    ,该调用将返回一个
    NSRunningApplication
    ,您可以使用该调用终止应用程序。有关更多详细信息,请参阅。

    如前所述,在NSWorkspace类的帮助下启动其他应用程序非常容易,例如:

    - (BOOL)launchApplicationWithPath:(NSString *)path
    {
        // As recommended for OS X >= 10.6.
        if ([[NSWorkspace sharedWorkspace] respondsToSelector:@selector(launchApplicationAtURL:options:configuration:error:)])
            return nil != [[NSWorkspace sharedWorkspace] launchApplicationAtURL:[NSURL fileURLWithPath:path isDirectory:NO] options:NSWorkspaceLaunchDefault configuration:nil error:NULL];
    
        // For older systems.
        return [[NSWorkspace sharedWorkspace] launchApplication:path];
    }
    
    为了退出另一个应用程序,您必须做更多的工作,特别是如果目标是10.6之前的版本,但这并不太难。以下是一个例子:

    - (BOOL)terminateApplicationWithBundleID:(NSString *)bundleID
    {
        // For OS X >= 10.6 NSWorkspace has the nifty runningApplications-method.
        if ([[NSWorkspace sharedWorkspace] respondsToSelector:@selector(runningApplications)])
            for (NSRunningApplication *app in [[NSWorkspace sharedWorkspace] runningApplications])
                if ([bundleID isEqualToString:[app bundleIdentifier]])
                    return [app terminate];
    
        // If that didn‘t work then try using the apple event method, also works for OS X < 10.6.
    
        AppleEvent event = {typeNull, nil};
        const char *bundleIDString = [bundleID UTF8String];
    
        OSStatus result = AEBuildAppleEvent(kCoreEventClass, kAEQuitApplication, typeApplicationBundleID, bundleIDString, strlen(bundleIDString), kAutoGenerateReturnID, kAnyTransactionID, &event, NULL, "");
    
        if (result == noErr) {
            result = AESendMessage(&event, NULL, kAEAlwaysInteract|kAENoReply, kAEDefaultTimeout);
            AEDisposeDesc(&event);
        }
        return result == noErr;
    }
    
    -(BOOL)terminateApplicationWithBundleID:(NSString*)bundleID
    {
    //对于OS X>=10.6的NSWorkspace,它有一个漂亮的runningApplications方法。
    if([[NSWorkspace sharedWorkspace]respondsToSelector:@selector(运行应用程序)])
    对于(在[[NSWorkspace sharedWorkspace]运行应用程序]中运行NSRunningApplication*应用程序)
    if([bundleID IsequalString:[app bundleID标识符]])
    返回[应用程序终止];
    //如果这不起作用,那么尝试使用apple事件方法,也适用于OS X<10.6。
    AppleEvent事件={typeNull,nil};
    常量字符*bundleIDString=[BundleIDUTF8String];
    OSStatus result=AEBuildAppleeEvent(kCoreEventClass、kAEQuitApplication、typeApplicationBundleID、bundleIDString、strlen(bundleIDString)、kAutoGenerateReturnID、kAnyTransactionID和event,NULL,“”);
    如果(结果==noErr){
    结果=AESendMessage(&event,NULL,kAEAlwaysInteract | kAENoReply,kAEDefaultTimeout);
    AEDisposeDesc(和事件);
    }
    返回结果==noErr;
    }