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

2023-11-21

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

我想创建一个当用户单击其他应用程序(邮件、iChat 等)中的 HTTP 或 HTTPS 链接时默认启动的应用程序。


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

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

添加支持http:// and 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>

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
}

3) 注册URL处理方法

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

您应该将此代码添加到应用程序的初始化代码中的某个位置。

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

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

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

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

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

我们必须使用启动服务 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

(在更改默认浏览器之前最好先征求用户的许可。)

自定义 URL 方案

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 Cocoa 应用程序设置为默认 Web 浏览器? 的相关文章

  • iOS:管理本地化图像

    我有 2 组 iPhone 应用程序的本地化图像 我应该如何放置图像 我如何加载到应用程序中 文件夹结构如下 For English version MyApp en lproj Localizable strings InfoPList
  • 如何消除错误 服务无效 请检查您的设置并尝试

    我一直在努力工作 一切都很顺利 只是突然间 当我尝试构建我的项目时 我在 xCode 中收到以下错误 1 在构建时的警报框中 服务无效 请检查您的设置并重试 0xE8000022 只需重新启动您的 iPod 或 iPhone 即可
  • iOS:两个 UIAlert 具有两种不同的委托方法

    我有一个 UIAlert UIAlertView alertView UIAlertView alloc initWithTitle ok message Canc delegate self cancelButtonTitle OK ot
  • 多对多关系中的 KVO 对象属性

    我有一个核心数据对多关系 由父 gt 子组成 我想设置一个键值观察机制 以便当任何子对象上的属性 例如 firstName lastName 发生更改时 它会触发通知 使用标准 KVO 语法时 self parentObject addOb
  • 如何制作字幕 UILabel / UITextField / NSTextField

    我需要制作字幕UILabel在 Xcode 中 选取框将从右向左滚动 我试过CCScrollingLabel also JHTickerView和别的 但我找不到带有选框的简单代码 没有任何视图 数组 一些愚蠢的库和其他库 如何制作选框UI
  • 如何在首选项包中使用 PSLinkListCell 中的值?

    我想为我的越狱调整制作一个偏好包 我成功地制作了一个带有可用开关的首选项捆绑包 但我想要一个选择颜色的设置 例子 Blue Color gt Yellow Green 所以如果我点击Color 它会将我带到另一个屏幕 要求我选择 Blue
  • 如何以编程方式设置 iOS 6/7 Delta

    当我离开 iOS6 时 我正在使用 Xcode 4 6 开发 UISplitView 应用程序 我有设计 现在我迁移到新的 Xcode5 现在我有这样的设计 UINavigationBar 完全重叠我的 UISearchBar Leo Na
  • object_setClass()而不是分配isa指针的性能

    我注意到在 XCode 4 6 的最新更新中 我收到了关于以下几行的警告JSONKit m 具体来说 设置对象类的行 dictionary gt isa JKDictionaryClass 这些被标记为已弃用 并注明首选方法是使用objec
  • SplitViewController 与 TabbarController

    我在我的应用程序中使用分割视图功能 我必须将选项卡栏放在 rootViewController 中 但是 当我在选项卡栏中添加控制器并将它们添加到分割视图中时 它不会分割 它只显示detailViewController 这是应用程序中完成
  • iOS 显示 UIImage 全屏并启用缩放(捏合和双击)

    我有一个UIImage从相机捕获UIImagePickerController 现在 在用户单击它之后 我希望它显示全屏 并且能够使用捏合手势进行放大和缩小 还可以使用双击手势来放大特定区域 换句话说 我想模拟ios默认图像浏览器的功能 我
  • 解析后 UITableView 委托和数据源在单独的类中

    我需要从一个单独的类设置 UITableView 委托和数据源 方法调用解析后数据准备就绪 但每次我的表都是空的 我正在使用 ARC 这是简化的代码 HomeViewController h import
  • scrollToRowAtIndexPath:atScrollPosition:动画滚动太慢

    基于分页 UIScrollView 的页面更改 我正在调用scrollToRowAtIndexPath atScrollPosition animated到所显示的该页面的表详细信息 void scrollViewDidScroll UIS
  • 如果您查看内部,nib 文件到底是什么样子的?

    我刚刚学习 nibs 和 swift 并对某些东西感到好奇 我知道 如果您有一个 main storyboard 文件 则首先加载根视图控制器的笔尖 然后加载该视图控制器下可能分层存在的任何视图 但是 我想知道一些事情 当他们说笔尖已 加载
  • 快速找到一个数字的下一个倍数的方法

    我需要找到从基数开始的数字的第一个倍数 例如 7 中 3 的第一个倍数是 9 我的第一次尝试是这样做 multiple baseNumber while multiple number 0 multiple 最后 multiple 将具有第
  • NSMutableData 删除字节?

    我可以使用以下命令轻松地将字节添加到 NSMutableData 实例appendData方法 但是我没有看到任何类似的删除数据的方法 我是否忽略了某些内容 或者我是否需要创建一个新对象并仅复制我需要的字节 请参阅以下方法的文档 void
  • 使用捏合手势;如何放大用户手指实际“捏”的位置?

    我已经在我的应用程序中的 UIImageView 上实现了 UIPinchGestureRecognizer 但是无论我在图像的哪个位置捏合 它似乎都会放大到同一个位置 有谁知道我如何让它放大到用户实际 捏 的地方 请参阅下面的代码 视图控
  • UIAlertView 中的 MPVolumeView?

    是否可以将 MPVolumeView 放入 UIAlertView 中 我已经尝试过put它在里面 但不显示 这可能是sizeToFit or initWithFrame 部分 有没有办法测试是否MPVolumeView实际上正在被创建吗
  • 处理 NSPropertyListSerialization 中的 CFNull 对象

    在我的应用程序中 我尝试序列化服务器响应字典并将其写入文件系统 但对于某些响应 我收到错误 属性列表格式无效 原因是服务器响应中的 CFNull 对象 现在 服务器响应将不断变化 因此我没有明确的方法来删除 CFNull 对象 下面是我的代
  • iOS:addConstraints:应用程序崩溃

    Problem 我似乎无法在现有项目中采用自动布局 Details 我之前也遇到过与此问题相同的问题presentViewController 在 iOS 但所提供的答案都不是我的解决方案 我正在使用所有没有 xib 的故事板视图 我的 使
  • 桌面上的 AVAudioSession?

    在 mac 桌面上 我试图录制系统声音 以及可选的麦克风声音 但一开始我只是录制系统声音 我正在遵循本指南 https www appcoda com ios avfoundation framework tutorial https ww

随机推荐

  • django.db.utils.operationalError:(2059,“身份验证插件'caching_sha2_password'”)

    我正在尝试将我的 django 项目 mysite 连接到 mysql 我在mysql中创建了一个用户并授予其访问该项目的所有权限 这些是我对 settings py 所做的更改 DATABASES default ENGINE djang
  • Qt findChild 返回 0

    我目前正在研究一种使用 GUI 在运行时修改对象内容的好方法 项目使用 Qt 所以我想到了通过QLayout到对象 让他们创建自己的 GUI 作为 POC 我创建了这个 display 是QVBoxLayout 范围 QPushButton
  • 想要在 iframe 未加载或已加载时调用函数吗?

    我有一个iframe在我的页面中 如果iframe无法加载 希望加载alert消息 找不到pdf 如果iframe确实加载 应该alert pdf打开 有谁知道如何实现这一目标 因此 我们的想法是使用 Ajax 请求来 测试 URL Aja
  • 如何在 Watir 中获取 HTML 中具有相同属性的元素的数量?

    我有一个 HTML 文档 其中包含具有相同类名的元素 我可以对页面中的所有元素进行迭代 并将具有类名的元素存储在列表中 Watir 有没有更好的方法来获取具有相同类名的所有 HTML 元素的计数 这个问题XML 中具有相同属性的元素计数有点
  • 如何在方法中传输 Java List (Varargs) 的值?

    我有以下方法 public static List a getValuesExclusion A exclusion return Arrays stream values filter item gt item exclusion col
  • 如何为html类添加事件监听器?

    如果我有这样的 HTML a href class movieImg div class previewBulk div a a href class movieImg div class previewBulk div a 和 JavaS
  • 感知器中的阈值有什么意义?

    我很难看出阈值在单层感知器中的实际作用 无论阈值是多少 数据通常都是分离的 似乎较低的阈值可以更均匀地划分数据 这是它的用途吗 实际上 当您不使用偏差时 您只需设置阈值即可 否则 阈值为 0 请记住 单个神经元用超平面划分输入空间 好的 现
  • 修复自动完成模式和 linum 模式的烦恼

    我在用着auto complete mode我认为这太棒了 我也是的忠实粉丝linum mode但是当两者一起使用时 特别是当我在新的缓冲区 或行数很少的缓冲区 中工作时 我遇到了一个非常恼人的问题 基本上缓冲区的长度是 x 行 但是当自动
  • 在最坏的情况下二分搜索是否是最优的?

    在最坏的情况下二分搜索是否是最优的 我的老师是这么说的 但我找不到支持它的书 我们从一个有序数组开始 在最坏的情况下 该算法的最坏情况 任何算法总是会花费更多成对比较比二分查找 很多人表示这个 问题不清楚 对不起 所以输入是任何通用的排序数
  • Android:哪个线程调用.onSensorChanged?

    我读过一些关于哪个线程调用各种回调方法的讨论 例如与传感器相关的回调方法 大多数人声称 UI 线程调用回调 即使涉及单独的工作线程 我们确定吗 考虑这种情况 一个单独的类实现 Runnable 和 SensorListener UI 线程
  • Android JNI 在应用程序中检测到错误:调用 JNI GetMethodID 时出现未决异常

    我正在尝试用我的 android 项目运行 Googles OCR Tesseract 我已经使用 android ndk 编译了 tesseract 并且在尝试运行 android 项目后收到此错误 我的环境如下 安卓5 1 1 适用于
  • 无法识别JS服务器

    我试图为 Android 设置 React Native 当我最终尝试运行该应用程序时 反应本机运行 Android 我收到一条消息JS server not recognized continuing with build 构建已成功完成
  • WPF 列表框项和上下文菜单

    我有这样的代码
  • Python 海龟不透明度?

    只是想知道 是否可以用半透明墨水绘制 填充乌龟 就像是 turtle setfillopacity 50 Would set it to 50 transparency 运行Python 2 7 你可以通过这样做 import turtle
  • 如何从图像创建数据,例如 UCI 的“字母图像识别数据集”

    我使用 OpenCV 中的 letter regcog 示例 它使用 UCI 的数据集 其结构如下 Attribute Information 1 lettr capital letter 26 values from A to Z 2 x
  • 同步执行 Sequelize 查询

    我正在使用 Node js 和 Sequelize 带有 Postgres 后端 构建一个网站 我有一个查询返回许多带有外键的对象 并且我想将外键引用的对象列表传递给视图 在示例中 出勤包含黑客马拉松密钥 我想返回黑客马拉松列表 由于代码是
  • 无法使用 matplotlib.use('Agg'),图形始终显示在屏幕上

    我正在研究 matplotlib 不知道如何保存图形而不将其打印在屏幕上 所以我在网上做了一些研究 很多答案都说解决方案是 matplotlib use Agg 并且必须在导入 matplotlib pyplot 或 pylab 之前 然后
  • .NET 流、在对象之间传递流、最佳实践 (C#)

    我目前正在用 c 编写一个小玩具汇编程序 正在经历计算系统要素图书目录 顺便说一句 确实是一本好书 汇编器采用输入文件路径并删除垃圾 注释等 行 然后该文件被传递到解析器 最后传递到创建二进制代码的另一个模块 这并不太复杂 但我不想每次一个
  • 使用指针和比较器 C++ 的优先级队列

    我刚刚开始学习C 有一半的时间我不知道我在做什么 花几个小时在Google上搜索并盲目地将代码放入我的项目中 这可能是一个基本问题 但我似乎做不到把它做好 这是要求对于我的任务 我需要这些 在边缘类中 public bool operato
  • 如何将 Cocoa 应用程序设置为默认 Web 浏览器?

    如何将 Cocoa 应用程序设置为默认 Web 浏览器 我想创建一个当用户单击其他应用程序 邮件 iChat 等 中的 HTTP 或 HTTPS 链接时默认启动的应用程序 制作可充当默认网络浏览器的应用程序有四个步骤 前三个步骤允许您的应用