DistributedNotificationCenter - 如何在应用程序之间传递数据?

2024-03-20

我构建了两个应用程序:“主”应用程序和一个支持它的 Finder 扩展。使用分布式通知中心我可以成功地在应用程序之间来回发布消息,并且注册的观察者事件会按预期触发。

问题似乎是我无法通过该事件传递任何用户数据。所有文档都表明您可以通过NS词典 or [任何Hashable:任何]对象作为发布通知名称

例如:发布消息看起来像这样......

let center: DistributedNotificationCenter = DistributedNotificationCenter.default()
center.postNotificationName(NSNotification.Name(name), object: nil, userInfo: mydata, deliverImmediately: true)

这是我的 Finder 扩展发送代码:

    var myInfo = [AnyHashable: Any]()
    myInfo[AnyHashable("filename")] = "Test Data"

    let center: DistributedNotificationCenter = DistributedNotificationCenter.default()
    center.postNotificationName(NSNotification.Name("RequestSyncState"), object: nil, userInfo: myInfo, deliverImmediately: true)

主应用程序接收代码:

    @objc func recievedMessage(notification:NSNotification){
    NSLog ("Message Recieved from Finder Extension \(notification.name.rawValue)")

    if notification.name.rawValue == "RequestSyncState" {
        NSLog ("Message Recieved from Finder to determine the sync icon")
        guard let userInfo = notification.userInfo else
        {
            return
        }

        guard let value = userInfo["Filename"]  else
        {
            NSLog ("Message payload is empty")
            return
        }

        NSLog ("Message payload is \(value)")
    }

正如我所说,这些函数会触发并收到通知,但没有实际数据。如果我查询 notification.userInfo 它为零,如果我查询 notification.object 它也为零。

我尝试了我能想到的一切,但我完全不知所措。


对于任何偶然发现这一点的人来说,事实证明,我可以使其工作的唯一方法是将我自己的数据作为消息的一部分发布,并将其包含在 postNotificationName 方法的 Object 属性中。 UserInfo 在跨进程边界时被完全忽略。

因此,我将自己的类 Cache Entry 序列化为字符串,将其发布,然后在另一侧将其解开。

所以像这样:

func sendMessage(name: String, data: CacheEntry) {

    let message:String = createMessageData(messsagePayload: data)
    let center: DistributedNotificationCenter = DistributedNotificationCenter.default()
    center.postNotificationName(NSNotification.Name(name), object: message, userInfo: nil, deliverImmediately: true)
}
func createMessageData(messsagePayload: CacheEntry) -> String {
        
    let encoder = JSONEncoder()
    let data = try! encoder.encode(messsagePayload)
    let messsagePayloadString = String(data: data, encoding: .utf8)!

    return String(messsagePayloadString)
}
func reconstructEntry(messagePayload: String) -> CacheEntry {

    let jsonData = messagePayload.data(using: .utf8)!
    let messsagePayloadCacheEntry = try! JSONDecoder().decode(CacheEntry.self, from: jsonData)
        
    return messsagePayloadCacheEntry
}

@objc func recievedMessage(notification: NSNotification) {

    NSLog ("Message Received from Application \(notification.name)")

    if notification.name.rawValue == "DSF-SetSyncState" {
        NSLog ("Message Recieved from Application to set the sync icon")
            
        let cEntry = reconstructEntry(messagePayload: notification.object as! String)
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DistributedNotificationCenter - 如何在应用程序之间传递数据? 的相关文章

  • iOS 视频压缩 Swift iOS 8 损坏的视频文件

    我正在尝试压缩用户相机从 UIImagePickerController 拍摄的视频 不是现有视频 而是动态视频 以上传到我的服务器 并花费少量时间来完成此操作 因此较小的尺寸是理想的选择 而不是 30 较新质量的相机为 45 mb 这是在
  • 升级到 5.4 但“php -v”仍然返回旧版本

    我使用的是 OSX Lion 10 7 5 正如建议的如何在 Mac OS X 中升级 PHP https stackoverflow com questions 2526085 how do i upgrade php in mac os
  • Xcode 6.4 Swift 单元测试无法编译:“GPUImage.h 未找到”“无法导入桥接标头”

    我的 Xcode 项目构建并运行良好 它有 Swift 和 Objective C 代码 它已安装 GPUImage 我向它添加了单元测试 现在它将不再编译 找不到 GPUImage h 文件 导入桥接标头失败 以下是我发现并尝试过的解决方
  • 从 AVAudioRecorder 获取分贝

    我正在尝试从 AVAudio 录音机获取分贝值 这是我目前的代码 我有一个启动录音机的方法 然后是一个读取分贝值的方法 var recorder AVAudioRecorder 全局定义的记录器 然后在此处使用 func init reco
  • 如何设置Python的USER_SITE;我需要吗?

    我在 OS X 10 10 只需使用 pip 维护 上安装了 Python 我的站点包位于 Library Python 2 7 site packages 苹果的封装在 System Library Frameworks Python f
  • 如何使用存储在 Cocoa Touch 框架中的 Localized.strings?

    我想为 CocoaTouch 框架添加多语言支持 问题 可本地化的字符串我创建的文件仅被使用NSLocalizedString当它是主应用程序及其目标的一部分时 我想将其存储在框架内以将事物分开 我怎样才能使用可本地化的字符串当放置在 Co
  • 在 OS X 上以编程方式禁用环境光传感器屏幕调暗

    我已经在内核代码仓库中挖掘了好几天了 但我在任何地方都找不到这个 我想禁用 启用 检测许多高端 Mac 笔记本电脑所具有的基于环境光传感器的屏幕调光的状态 这是通过显示控制面板中的 自动调整亮度 复选框激活的调光 请注意 我是NOT谈论半暗
  • 如何更改默认的Python版本?

    我已经在我的 Mac 上安装了 Python 3 2 我跑完之后 Applications Python 3 2 Update Shell Profile command 当我输入时 这很令人困惑Python V在终端它说Python 2
  • 在C语言中如何清屏? [复制]

    这个问题在这里已经有答案了 我想清除屏幕上的所有文字 我尝试过使用 include
  • 在 64 位 OS X 10.6 上制作胖二进制文件更喜欢 32 位的正确方法?

    假设我问用户 你想在 32 位模式还是 64 位模式下运行 他们选择 32 位 我如何向操作系统注册这一事实 我看过arch http developer apple com mac library documentation Darwin
  • 如何生成Mac应用程序的安装包?

    如何为 OS X 二进制文件以及一些配置和脚本文件创建单个安装程序包 最终文件夹应如下所示 任何帮助 将不胜感激 谢谢 如果您希望将各种东西放置在不同的位置 安装程序在这里 文档在那里 支持文件在这里等等 它们也非常适合提供安装体验的可配置
  • 对 boost 库的依赖项没有完整路径

    我已经成功构建了动态库 依赖于使用自定义前缀构建和安装的 boost 库 b2 install prefix PREFIX 然而 当我跑步时otool L在我的库中 我得到如下输出 libboost regex dylib compatib
  • Swift 中的 quitFirstResponder

    我怎样才能用Apple的新语言实现它 Objective C 代码 void touchesBegan NSSet touches withEvent UIEvent event for UIView view in self view s
  • 如何无限地每1分钟运行一个iOS应用程序?

    我制作了一个应用程序 需要每 1 分钟向服务器发送一次位置和状态更新 我尝试了以下方法 但没有一个能帮助我 有什么解决办法吗 1 NSTimer 很多人建议这样做 但问题出在后台模式上 它只能工作 20 分钟 该应用程序停止发送数据后 2
  • 在 iOS 上使用 HEVC 编码器输出视频尺寸巨大

    我有一个项目 目前使用 H 264 编码器在 iOS 上录制视频 我想尝试在 iOS 11 中使用新的 HEVC 编码器来减小文件大小 但发现使用 HEVC 编码器会导致文件大小急剧膨胀 GitHub 上的一个项目显示了该问题 它使用 H
  • 如何在 Mac 上安装 Clang 9?

    这是我 Mac 上的内容 clang version Apple LLVM version 10 0 0 clang 1000 10 44 4 Target x86 64 apple darwin17 7 0 Thread model po
  • iOS 11 浮动 TableView 标题

    有一个应用程序包含多个部分 展开 时每个部分有几行 折叠 时没有 每个部分都有一个部分标题 使用以下子类重用它们UITableViewHeaderFooterView等等 到目前为止一切顺利 然后在 iOS 11 中 我使用了可视化调试器
  • 使用 Cocoa/OSX 合并/堆叠两个图像

    我有一个 CGImageRef 我们称之为原始图像 和一个透明 png 水印 我正在尝试编写一种方法将水印放置在原始内容之上 并返回 CGImageRef 在 iOS 中 我会使用 UIKit 将它们绘制到上下文中 但这在 OSX 中似乎不
  • 如何从 Firebase 同步检索数据?

    我有两个集合 即用户和问题 根据使用 userId 登录的用户 我检索currQuestion价值来自users收藏 基于currQuestion值 我需要检索question来自 Firebase 的文档Questions收藏 我使用下面
  • 如何从 Mac OS X 中完全删除 Eclipse(包括设置和插件)?

    我的 Eclipse 与 GAE 损坏并且工作异常 所以我从Application文件夹中删除了Eclipse 但是留下了垃圾 我重新下载了全新的 eclipse 但它以旧设置运行 并且损坏的 GAE 结构仍然存在 如何从 Mac 上完全删

随机推荐

  • Java 1.6 中的 Try-with-resources 等效项

    我有以下代码 public class Main public static void main String args throws SQLException try Connection conn DBUtil getConnectio
  • React 中的 setInterval 和 setState

    我有一个计时器使用setInterval 在 React 组件中 我不确定启动和停止此间隔的最佳实践是什么state 我遇到了一些异步问题 假设我的 React 组件中有一组链接可以很好地渲染和执行回调 let links 10 50 10
  • “无法读取未定义的属性‘加载’”

    我正在尝试遵循this https developers google com identity sign in web devconsole project与 Google 登录集成的文档 尽管我在控制台中遇到了此错误 Uncaught
  • async/await forEach 和 Promise.all + map 有什么区别

    In 类似问题的接受答案 https stackoverflow com a 37576787 12458473答案指出forEach调用只是抛出一个承诺然后退出 我认为情况应该是这样forEach回报undefined但是为什么下面的代码
  • atexit 被认为有害吗?

    使用是否存在固有的危险atexit在图书馆等大型项目中 如果是这样 背后的技术本质是什么 atexit这可能会导致大型项目出现问题 我避免使用的主要原因atexit在图书馆中 它的任何使用都涉及全局状态 一个好的库应该避免拥有全局状态 然而
  • 在 vue 组件的模板 html 中启用智能感知需要什么?

    我对 Vue 比较陌生 但精通 Typescript 和 Angular 我目前正在走打字稿路线 使用vue 类组件 https github com vuejs vue class component and vue 属性装饰器 http
  • 无法访问 Django 服务器 http://127.0.0.1:8000/

    第一次它工作得很好 但现在显示了这个问题 app python manage py runserver Performing system checks System check identified no issues 0 silence
  • 更改路线不会滚动到新页面的顶部

    当路线改变时 我发现了一些不受欢迎的行为 至少对我来说是这样 在教程的第11步中http angular github io angular phonecat step 11 app phones http angular github i
  • 如何将双精度值和浮点值插入到sqlite中?

    以下是我的数据库创建代码 Override public void onCreate SQLiteDatabase db db execSQL CREATE TABLE TABLE NAME ID INTEGER PRIMARY KEY A
  • 打开跟踪文件时出错:没有这样的文件或目录 (2)

    我收到上述错误 打开跟踪文件时出错 没有这样的文件或目录 2 当我在模拟器上运行我的 Android 应用程序时 有人能告诉我这可能是什么原因吗 我正在使用 android sdk 20 并将以下行添加到 AndroidManifest x
  • 未捕获的 ReferenceError:ReactDOM 未定义

    所以我有Rails应用程序 我安装了react rails gem 设置它并尝试运行测试应用程序 刚安装好后 当我尝试运行 hello world 程序时 发生了以下错误 未捕获的 ReferenceError ReactDOM 未定义 这
  • C#,WinForms 中的双缓冲区?

    private void button3 Click object sender EventArgs e this DoubleBuffered true for int i 0 i lt 350 i using Graphics g th
  • 如何解析 gridstack.js 项目?

    也许这很简单 但我仍在学习 JS 之类的东西 我正在使用插件https github com troolee gridstack js https github com troolee gridstack js并希望在小部件重新定位 调整大
  • Android:购买后使用产品(应用内计费)

    我在应用程序计费方面遇到一些问题 我想在应用程序内创建一个可以多次购买的产品 但谷歌在应用程序内计费的方式是 产品必须先被消费 然后才能再次购买 我用下面的代码尝试过 public class HomeFragment extends Fr
  • 使用 SonarQube Web api 分析项目

    我使用 SonarQube Web api 创建了一个项目 现在我正在尝试分析该项目 我找到了这个 POST api project analyses create event 当我尝试这项服务时 我得到了这样的回复 errors msg
  • jQuery html() 和 &

    我正在人员列表中进行搜索 我希望它能够即时显示结果 所以它确实做到了 但我需要一个链接 它应该如下所示 chatid 18 userid 45 create new 但通过此显示结果后 get ajax php sec search use
  • 经过身份验证后访问 [Authorize] 控制器时收到 404

    我正在尝试在 ASP NET MVC Core 应用程序 NetCore 2 上使用 IdentityServer4 实现身份验证和访问控制 虽然这不是我第一次实现后端 但这是第一次使用 net 并且我正在努力解决一些问题 我已按照以下说明
  • 文本分析:使用 python 查找列中最常见的单词

    我创建了一个数据框 其中只有一个带有主题行的列 df activities filter Subject axis 1 df shape 这返回了这个数据框 Subject 0 Call Out Quadria Capital May Lo
  • Azure IOT 配置服务中的个人注册无法通过 REST API 运行

    我目前面临着使用提供的 REST API 在 Azure 设备配置服务中进行个人注册的挑战 文档中也存在一些空白 我正在按照此网址中的官方文档中提到的步骤进行操作 https learn microsoft com en us rest a
  • DistributedNotificationCenter - 如何在应用程序之间传递数据?

    我构建了两个应用程序 主 应用程序和一个支持它的 Finder 扩展 使用分布式通知中心我可以成功地在应用程序之间来回发布消息 并且注册的观察者事件会按预期触发 问题似乎是我无法通过该事件传递任何用户数据 所有文档都表明您可以通过NS词典