问题标签 [xpc]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
5345 浏览

ios - NSManagedObjectContext executeFetchRequest:错误:抛出异常:OS_xpc_error

我的 iOS 应用程序出现异常错误。

我的应用程序会下载大量 JSON 对象,然后将这些对象插入 Core Data。每次下载都需要以下步骤:

  1. 打开网络连接并获取 JSON 对象
  2. 创建了一个主要的 NSManagedObject
  3. 创建 0 到大约 20 个额外的 NSManagedObjects 之间的任何数字
  4. 对于某些人来说,执行对现有 NAManagedObjects 的获取请求以查找现有匹配对象,并创建关系,或者如果未找到则创建新对象。

这是相关的代码片段,其中song是 NSManagedObject 子类的实例,并且Category是不同的 NSManagedObject 子类:

这工作正常,直到数百次下载和插入后,应用程序才会崩溃。成功下载的数量会有所不同,似乎是随机的。

导致异常的行是NSArray *fetchResults = [_moc executeFetchRequest:fetchRequest error:&error];,日志输出是这一行:

我尝试谷歌这个错误被证明是徒劳的。(说真的 - 我从来没有搜索过错误并且得到零结果:)

零谷歌点击错误

有没有其他人遇到过类似的错误并且可以指出我正确的方向?这一次我完全不知道从哪里开始我的搜索。

0 投票
2 回答
493 浏览

objective-c - 助手应用沙盒和安全范围的书签

所以我一直在用这个扯掉我的头发......

我有一个主应用程序和一个辅助应用程序。两者都是沙盒并使用应用程序组共享数据。我通过 NSXPCConnection 与助手应用程序交谈。我使用SMLoginItemSetEnabled将帮助应用程序设置为登录项。当用户激活助手应用程序时,它会作为守护程序运行。

这一切都很好。问题在于安全范围的书签。

帮助应用程序需要访问系统文件。当我需要授予对新位置的访问权限时,这是由主应用程序完成的,通过 NSXPCConnection 打开帮助程序并使用此类打开 NSOpenPanel:(https://github.com/leighmcculloch/AppSandboxFileAccess)这一切似乎工作也......

该类告诉我已授予文件访问权限,但是我还在控制台中收到了沙盒违规。

我在帮助应用程序中有正确的权利:

我还读到有人在访问后台线程上的书签时遇到问题,所以我尝试将所有与书签相关的调用包装在:

仍然没有喜悦。任何帮助深表感谢。

**沙盒是真正的噩梦......我的应用程序所做的只是在没有用户干预的情况下删除一些系统文件。沙盒之前这么简单的任务....现在我需要处理loginItems,XPC....很多令人头疼的问题。:(

0 投票
1 回答
376 浏览

c - XPC 服务阵列崩溃

我将 C 接口用于 XPC 服务;顺便说一句,除了以下问题,我的 XPC 服务运行得非常好。

前几天我试图通过 XPC 发送一个“大”数组;大约 200,000 个条目。通常,我的应用程序处理几千个条目的数据并且没有问题。对于其他用途,这种大小的数组可能并不特殊。

这是我用于生成数组的 C++ 服务器代码:

这是客户端代码:

如果我尝试处理大型数组,则会出现段错误(SIGSEGV)

0 投票
1 回答
567 浏览

tcpserver - 将套接字与 NSXPCConnection 一起使用

使用带有 NSXPCConnection 的套接字时遇到问题。

基本上,有一个主进程和一个辅助进程正在运行,通过 NSXPCConnection 建立。该辅助进程需要充当服务器并侦听特定端口(例如 111),该端口接收外部连接。

助手进程使用Apple 提供的TCPServer助手类(wrapper around )打开一个监听套接字。CFSocket代码在这里找到: https ://code.google.com/p/iphone-remotepad/source/browse/trunk/RemotePad/TCPServer.h?r=238

套接字在 中成功打开- (BOOL)start:(NSError **)error

外部客户端可以建立与 111 端口。(通过终端测试telnet localhost 111)。

但是,辅助进程永远不会收到 TCPServer 回调TCPServerAcceptCallBack

助手进程已com.apple.security.network.client启用权利。

此外,当我在主应用程序而不是辅助进程中运行 TCPServer 时,在端口 111 上设置服务器,并尝试连接到端口 111,我确实收到了回调。

关于帮助程序进程为什么没有收到套接字回调的任何想法?XPC 相关问题?

0 投票
0 回答
129 浏览

cocoa - XPC 服务用于处理沙盒应用程序中的多个可加载包

我有一个沙盒应用程序,它接受第三方制作的插件,可以同时连接多个插件。我想使用 XPC 服务为这些捆绑包创建另一层安全性,以防万一其中一个崩溃,我想继续使用没有这个的其他服务。

我正在使用NSXPCConnection,但问题是我不能同时创建这个东西的多个实例。所有实例都相互混淆。我不希望一个服务实例来处理所有的包,因为如果我有一个问题,我将不得不重新启动整个事情。而且我不想在项目中创建一堆服务副本,只是为了通过使用不同的服务名称来做同样的事情。

所以也许还有另一种方法可以做到这一点,甚至可能有正确的方法,请帮助

0 投票
3 回答
2034 浏览

macos - SMLoginItemSetEnabled 有时会静默无法启动沙盒 UI 帮助程序

我有一个沙盒应用程序,并包含一个显示一些 UI 的助手(作为全屏窗口,但也可以是状态项或类似项)。

这工作......大部分时间。但有时它不会;它只是默默地无法启动助手。

由于助手有 UI,我用SMLoginItemSetEnabled它来加载它,然后NSXPCConnection与它通信。但有时SMLoginItemSetEnabled无法启动它,但仍然返回 YES。

这似乎是由于机器上某处应用程序的旧版本所致;这似乎混淆了登录机制。删除旧应用程序可以修复它,但我不能合理地期望用户这样做(有些人喜欢保留旧版本)。

我可以通过将结果与应用程序包中帮助程序的 URL 进行比较来检测这种情况-[NSWorkspace URLForApplicationWithBundleIdentifier:],但是必须要求用户删除其他应用程序并不是一个非常优雅的解决方案。

有什么方法可以使SMLoginItemSetEnabled始终使用当前应用程序包中的登录项,而不是磁盘上其他地方的随机登录项?

或者在最近的操作系统版本中是否有任何改变以支持更优雅的 UI 助手机制?

我已经在这里和其他地方阅读了关于这个主题的许多其他问题,看起来这种笨重的机制仍然是最好的解决方案,但也许我错过了一些东西。

0 投票
1 回答
1878 浏览

cocoa - com.apple.xpc.launchd.oneshot

XCTestCase测试中,我创建了一个NSTask对象并将其设置为 run printenv。然后NSTask完成后,我printenv使用forkand运行execv。除了一个环境变量外,两者的输出是相同的。

NS任务:XPC_SERVICE_NAME=com.apple.xpc.launchd.oneshot.0x10000004.Xcode

执行:XPC_SERVICE_NAME=0

是什么com.apple.xpc.launchd.oneshot

0 投票
2 回答
1678 浏览

macos - 应用扩展中的安全范围书签

我正在创建一个 TodayWidget 应用程序扩展,它显示有关用户在应用程序目录之外选择的文件夹的信息。

在我的主应用程序中,我可以通过 NSOpenPanel 使用 powerbox 来选择文件夹。然后,我可以将一个安全范围的书签保存到我的 TodayWidget 可访问的应用程序组容器的用户默认值中。

TodayWidget 可以读取书签数据,但是当它调用URLByResolvingBookmarkData时,它会出错:

The file couldn’t be opened because it isn’t in the correct format.

我的主应用程序和 TodayWidget 都具有以下权利:

  • com.apple.security.files.bookmarks.app-scope
  • com.apple.security.files.user-selected.read-only

从 Apple 的文档中,只有创建安全范围书签的应用程序才能使用它。我猜这些意味着不允许嵌入式应用程序?

我已经考虑过使用 XPC,但这并不能真正解决问题,因为 XPC 也不能使用安全范围的书签,只能使用普通书签。一旦计算机重新启动,XPC 进程将失去对目录的访问权限。

我真正需要的是一种让 XPC 进程获得对用户指定目录的读取访问权限的方法。有没有办法不必每次重新启动计算机都重新启动我的主应用程序?

0 投票
1 回答
894 浏览

core-data - XPC 连接如何以线程方式处理?

假设我有一个 XPC 服务和两个用户可见的应用程序(菜单栏项和主应用程序)。两者都连接到 XPC 服务。

如果这两个应用程序组件都发送“create Foo”消息,它们是如何分派的?毕竟这是一个进程,所以它们是按顺序到达还是会使用多个队列?

XPC 服务使用 Core Data,所以我担心是否必须创建全局队列或以任何其他方式确保线程限制。

0 投票
0 回答
423 浏览

cocoa - 我必须保留哪些与 NSXPCConnection 相关的对象?

我在文档中找不到有关对象生命周期管理的任何提示。

  1. 在 XPC 服务中,我是否必须保持对 的强引用NSXPCListener,或者resume调用是否有效地处理了这个问题?

    我正在使用 Swift 和连接创建对象从文件中获取大部分内容main.swift

    我有预感,dependencies对象(NSXPCListener在设置期间创建)应该保持对侦听器对象的强引用。但是resume据说该方法像操作队列一样工作。

  2. 相反,客户需要保持NSXPCConnection周围吗?

  3. 在 XPC 服务中,在传入连接时,设置exportedObject是否在连接期间保留该对象,还是我必须自己保留一个强引用?

  4. 因此:当多个连接进来时,我应该维护一个exportedObjects 列表吗?

  5. 在服务客户端中,我应该获得remoteObjectProxy一次并保留它,还是应该为每次调用重新获得一个代理对象?

    我的特殊 XPC 服务是一个始终运行的启动进程,而不是一次性的,客户端应用程序本身也可能在后台运行几个小时。我担心将代理对象保留到后台服务以进行潜在的长期通信是否安全。

    如果后台服务崩溃,launchd 会重启它们。现在,如果我的服务是“按需启动”服务,那么对代理对象的消息调用是否会在必要时重新启动,获取代理对象会这样做,还是仅重新连接才能实现?

谢谢你帮我解决这个问题!