如何将Cocoa应用程序设置为默认Web浏览器?

geo*_*ock 31 cocoa objective-c

如何将Cocoa应用程序设置为默认Web浏览器?

我想创建一个默认启动的应用程序,当用户点击其他应用程序(Mail,iChat等)中的HTTP或HTTPS链接时.

geo*_*ock 73

制作可充当默认Web浏览器的应用程序有四个步骤.前三个步骤允许您的应用程序充当相关URL方案(HTTP和HTTPS)的角色处理程序,最后一步使它成为这些方案的默认角色处理程序.

1)将应用程序可以处理的URL方案添加到应用程序的info.plist文件中

要添加支持http://,https://您需要将以下内容添加到应用程序的info.plist文件中.这告诉操作系统您的应用程序能够处理HTTP和HTTP URL.

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLName</key>
        <string>http URL</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>http</string>
        </array>
    </dict>
    <dict>
        <key>CFBundleURLName</key>
        <string>Secure http URL</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>https</string>
        </array>
    </dict>
</array>
Run Code Online (Sandbox Code Playgroud)

2)编写URL处理程序方法

当操作系统想要使用您的应用程序打开URL时,将调用此方法.添加此方法的对象无关紧要,这将在下一步中显式传递给事件管理器.URL处理程序方法应如下所示:

- (void)getUrl:(NSAppleEventDescriptor *)event 
    withReplyEvent:(NSAppleEventDescriptor *)replyEvent
{
  // Get the URL
  NSString *urlStr = [[event paramDescriptorForKeyword:keyDirectObject] 
    stringValue];

  //TODO: Your custom URL handling code here
}
Run Code Online (Sandbox Code Playgroud)

3)注册URL处理程序方法

接下来,告诉事件管理器在要使用您的应用加载URL时要调用哪个对象和方法.在这里的代码中,我self作为事件处理程序传递,假设我们setEventHandler从定义getUrl:withReplyEvent:方法的同一对象调用.

您应该在应用程序的初始化代码中的某处添加此代码.

NSAppleEventManager *em = [NSAppleEventManager sharedAppleEventManager];
[em 
  setEventHandler:self 
  andSelector:@selector(getUrl:withReplyEvent:) 
  forEventClass:kInternetEventClass 
  andEventID:kAEGetURL];
Run Code Online (Sandbox Code Playgroud)

某些应用程序(包括早期版本的Adobe AIR)使用备用WWW!/ OURL AppleEvent来请求应用程序打开URL,因此要与这些应用程序兼容,还应添加以下内容:

[em
  setEventHandler:self 
  andSelector:@selector(getUrl:withReplyEvent:) 
  forEventClass:'WWW!' 
  andEventID:'OURL'];
Run Code Online (Sandbox Code Playgroud)

4)将您的应用程序设置为默认浏览器

到目前为止,我们所做的一切都告诉操作系统您的应用程序是浏览器,现在我们需要将其设置为默认浏览器.

我们必须使用Launch Services API来执行此操作.在这种情况下,我们将我们的应用程序设置为HTTP和HTTPS链接的默认角色处理程序:

CFStringRef bundleID = (CFStringRef)[[NSBundle mainBundle] bundleIdentifier];
OSStatus httpResult = LSSetDefaultHandlerForURLScheme(CFSTR("http"), bundleID);
OSStatus httpsResult = LSSetDefaultHandlerForURLScheme(CFSTR("https"), bundleID);
//TODO: Check httpResult and httpsResult for errors
Run Code Online (Sandbox Code Playgroud)

(在更改默认浏览器之前,最好询问用户的许可.)

自定义URL方案

值得注意的是,您还可以使用这些相同的步骤来处理自己的自定义URL方案.如果您正在创建自定义网址方案,最好将其基于应用的包标识符,以避免与其他应用冲突.因此,如果您的捆绑ID是com.example.MyApp您应该考虑使用x-com-example-myapp://URL.