我最近更新到Xcode 7并将我的iPhone升级到iOS 9.我已经开发并发布了一个iOS应用程序,它在最新版本的iOS 8和Xcode 6上运行得非常好.
在尝试更新iOS 9支持的应用程序的过程中,我得到了最令人费解的奇怪错误,让我感到困惑.
我已经通过Xcode自动完成了所有语法修正,现在我的应用程序正确构建.它起初甚至运行良好.
我有一个按钮,通过WebView分割到视图控制器.此视图控制器加载一个链接,该链接将显示来自youtube的图像,网站或视频.内容一如既往地加载完美.但是,当我单击"后退"按钮(我在导航堆栈上)时,程序将崩溃并重新启动模拟器(和我的iPhone)并将我发送到锁定屏幕.
在Xcode中,我收到以下消息:
XPC连接中断.终止,因为没有系统应用程序.
顺便说一下,我的应用程序中集成了Flurry分析,不确定这是不是问题.
我该如何解决这个问题?我对XPC连接的搜索似乎没有返回类似于我的问题.我甚至不知道XPC连接是什么,所以为什么这在我的应用程序中呢?
编辑:我找到了解决问题的方法.我不能说这是一个修复.
当设置为true时,在使用方法self.navigationController?.popViewControllerAnimated期间发生了崩溃.我碰巧将此设置为false,并且崩溃停止(现在转换看起来很糟糕).
我不知道为什么会这样,只会增加我的困惑.
根据Apple的说法,Lion中引入的新XPC服务API提供了一种轻量级机制,用于与Grand Central Dispatch(GCD)集成并启动的基本进程间通信.
似乎可以将此API用作一种IPC,如POSIX IPC,但是,我找不到如何做到这一点.
我正在尝试使用XPC API传递两个进程,因此我可以在它们之间传递消息,但我总是在服务器端出现"XPC连接无效"错误.
我不想要XPC服务,我只想使用客户端 - 服务器架构交换消息.
我使用两个类似BSD的进程,所以没有Info.plist或者其他什么......
我一直关注这个讨论http://lists.macosforge.org/pipermail/launchd-dev/2011-November/000982.html但是这个主题看起来有点模糊和无证.
谢谢!
我在我的Mac OS X Yosemite控制台中看到了这个:
AppleEvents: Send port for process has no send right,
port=( port:30743/0x7817 rcv:1,send:0,d:0 limit:5)
(findOrCreate()/AEMachUtils.cp #526)
com.apple.NSXPCConnection.user.1963
Run Code Online (Sandbox Code Playgroud)
我正在开发一个XPC服务,它处理来自Mac OS App运行在同一个客户端上的客户端的进程间通信Mac.
显然错误来自:
(findOrCreate()方法/AEMachUtils.cp#526(Line#?)
该XPC服务接收请求并调用正确的方法来处理这个请求,但每次我看到上面的警告.@protocol是:
- (oneway void)doService:(NSString *)aString withReply:(void (^)(NSString *))reply;
Run Code Online (Sandbox Code Playgroud)
我再也没有看到回复NSString.- (单程void)是否与此有关?该错误出现在服务的Console跟踪stderr中XPC.错误是说我需要赋予发件人进程权限吗?如果是这样的话?
在此先感谢您的考虑.此致,AK
我通过从主应用程序发送消息成功创建了XPC服务并与XPC服务进行通信.但我想知道的是,它是否可以启动从XPC服务到主应用程序的通信.在苹果的文档说,XPC是双向的.如果有人可以通过一个例子指出我正确的方向,将不胜感激.
请注意,
我在前两个成功了,但在第三个上找不到任何资源.
谢谢.:)
我有一个窗口应用程序,并添加一些功能,我需要另一个应用程序,它在登录时启动并将数据同步到服务器(如果可用).
我尝试过使用NSDistributionNotification但它在沙盒应用程序中几乎没用.我查了一下XPC,希望它可以工作,但我不知道如何让它与助手一起工作.到目前为止,我已经使用XPC做到了这一点.
主要应用
NSXPCInterface *remoteInterface = [NSXPCInterface interfaceWithProtocol:@protocol(AddProtocol)];
NSXPCConnection *xpcConnection = [[NSXPCConnection alloc] initWithServiceName:@"com.example.SampleService"];
xpcConnection.remoteObjectInterface = remoteInterface;
xpcConnection.interruptionHandler = ^{
NSLog(@"Connection Terminated");
};
xpcConnection.invalidationHandler = ^{
NSLog(@"Connection Invalidated");
};
[xpcConnection resume];
NSInteger num1 = [_number1Input.stringValue integerValue];
NSInteger num2 = [_number2Input.stringValue integerValue];
[xpcConnection.remoteObjectProxy add:num1 to:num2 reply:^(NSInteger result) {
NSLog(@"Result of %d + %d = %d", (int) num1, (int) num2, (int) result);
}];
Run Code Online (Sandbox Code Playgroud)
XPC服务
In main () ...
SampleListener *delegate = [[SampleListener alloc] init];
NSXPCListener *listener = [NSXPCListener serviceListener];
listener.delegate = delegate; …Run Code Online (Sandbox Code Playgroud) 是否可以使用Foundation.framework(NSXPCConnection等)中的XPC API运行同一XPC服务的多个实例?这些文档没有提供太多关于此事的见解.
编辑:做了一个快速测试,似乎只有一个服务实例正在运行,即使我创建了两个XPC连接.有没有办法让它运行另一个实例?
public class BLE: NSObject, CBCentralManagerDelegate {
var centralManager:CBCentralManager!
public override init() {
super.init()
self.centralManager = CBCentralManager.init(delegate: self, queue: nil)
}
public func centralManagerDidUpdateState(_ central: CBCentralManager) {
switch central.state {
case .unknown:
print("unknown")
case .resetting:
print("resetting")
case .unsupported:
print("unsupported")
case .unauthorized:
print("unauthorized")
case .poweredOff:
print("powered off")
case .poweredOn:
print("powered on")
self.centralManager.scanForPeripherals(withServices: nil, options: nil)
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的代码,每当我运行它时,它就会给我消息
“ [CoreBlueooth] XPC连接无效”
我确实尝试将NSBluetoothPeripheralUsageDescription添加到我的info.plist文件中,但这没有用。
不过,奇怪的是,如果我直接初始化CBCentralManager而不是使用类,则一切正常。
仅当我尝试通过创建BLE类或任何其他类的on对象初始化CBCentralManager时,才会出现此问题。
我有一个简单的Cocoa图像预览应用程序.用户使用a选择文件NSOpenPanel,应用程序使用Quick Look API生成预览图像.
我想将预览生成移动到单独的XPC服务中.如果没有应用程序沙盒,一切正常,但在为父应用程序和XPC服务启用应用程序沙盒后,XPC服务将被拒绝对用户所选文件的读取权限.
允许父应用程序读取文件(因为它是通过NSOpenPanel选择的).
如何将用户选择的文件的"文件读取"权限从父应用程序传输到XPC进程,以便XPC进程可以读取文件以生成预览?
我的XPC服务通过其权利请求文件读取访问,我将以下密钥添加到XPC服务Info.plist,但这没有帮助:
JoinExistingSession = YES
Run Code Online (Sandbox Code Playgroud) 我正在为OS X开发Finder Sync Extension,并希望使用后台XPC服务.
我可以在主应用程序中启动它并启动XPC并正确运行但是当我尝试从Finder Sync访问它时没有任何反应.finder sync和XPC都是他们自己的捆绑包,所以这可能就是原因所在.我想要的是寻找器同步与XPC谈论文件的状态和主应用程序与finder同步和XPC谈论要观看的文件夹列表.
有人有运气吗?是否有更好的方式来进行随需应变的后台服务?是否可以在两个XPC服务之间进行通信?
我有一个沙盒的应用程序,并包含一个帮助器,提供一些UI(作为一个全屏窗口,但也可以是一个状态项或类似的).
这很有用......大多数时候.但有时却没有; 它只是默默地无法启动帮助器.
由于帮助程序有UI,我用SMLoginItemSetEnabled它来加载它,然后NSXPCConnection与它进行通信.但有时SMLoginItemSetEnabled无法启动它,同时仍然返回YES.
这似乎是由于应用程序在机器某处的旧版本构建; 这似乎混淆了登录机制.删除旧应用程序修复了它,但我不能合理地期望用户这样做(有些人喜欢保留旧版本).
我可以通过比较-[NSWorkspace URLForApplicationWithBundleIdentifier:]应用程序包中帮助程序的URL 的结果来检测这种情况,但是不得不要求用户删除其他应用程序并不是一个非常优雅的解决方案.
是否有任何方法可以SMLoginItemSetEnabled始终使用当前应用程序包中的登录项,而不是磁盘上其他位置的随机项?
或者在最近的OS版本中有任何改变,以支持更优雅的UI帮助程序机制?
我在这里和其他地方已经阅读了很多关于这个主题的许多其他问题,看起来这个笨重的机制仍然是最好的解决方案,但也许我错过了一些东西.
xpc ×10
cocoa ×6
macos ×5
objective-c ×3
sandbox ×2
applescript ×1
findersync ×1
helper ×1
ios9 ×1
ipc ×1
iphone ×1
osx-lion ×1
swift ×1
xcode7 ×1