2017-11-21 3 views
0

Ich bin auf XCode 9, OSX nicht iOS, Objective-C.NSXPCConnection Debugging-Unterbrechung/Invalidierung

Ich habe einen XPC-Dienst, um mit anderen Anwendungen zu sprechen. XPC Services sind für mich völlig neu. Ich habe die Dokumentation und Artikel gelesen, die ich gefunden habe - ich brauche immer noch Hilfe.

// NSXPC Connection stored as ivar 
self.bridgeagent = [[NSXPCConnection alloc] initWithServiceName:@"com.myid.myapp.bridgeagent"]; 
self.bridgeagent.remoteObjectInterface = [NSXPCInterface interfaceWithProtocol:@protocol(bridgeagentProtocol)]; 
self.bridgeagent.exportedInterface = [NSXPCInterface interfaceWithProtocol:@protocol(bridgeagentProxyProtocol)]; 
self.bridgeagent.exportedObject = self; 

[self.bridgeagent setInvalidationHandler:^{ 
    NSLog(@"Bridgeagent invalidation handler!"); 
}]; 

[self.bridgeagent setInterruptionHandler:^{ 
    NSLog(@"Bridgeagent interruption handler!"); 
}]; 

[self.bridgeagent resume]; 

Der Service wird wie folgt aufgerufen:

// openFile method is listed in corresponding protocol 
[[self.bridgeagent remoteObjectProxyWithErrorHandler:^(NSError * _Nonnull error) { 
NSLog(@"bridgeagent.openFile errorHandler: %@",error); 
}] openFile:parameters withReply:^(NSDictionary *returnParameters) { // do something with result }]; 

Der Aufruf funktioniert und der Service macht seinen Job. Wie dem auch sei - jetzt, wo der Service funktioniert, möchte ich daran arbeiten, ihn stabiler zu machen (auch wenn ich momentan keine Probleme habe).

Kann mir jemand

  1. die Differenz zwischen Unterbrechung und Ungültigkeits erklären (verstehe es nicht, wenn der eine oder andere geschieht)
  2. wenn es eine bewährte Methode ist, beide Fälle zu behandeln
  3. wie beide Fälle zu erzwingen (zum Debuggen)

Hilfe Vielen Dank für

Antwort

0

Antwort auf Frage 1:

[self.xpcConnection setInterruptionHandler:^{ 
    // Connection interrupted. Backend (service) may have crashed. 
    // connection used to work but suddenly terminated 
}]; 

[self.xpcConnection setInvalidationHandler:^{ 
    // No one is listening. Is the backend running? 
    // connection cannot be established 
}]; 

Antwort auf Frage 3:

Unterbrechung: Backend-Ausgang in der Mitte einer Transaktion machen (kurz vor Antwort gesendet wird)

Ungültigkeits: don 't Start Backend (Service) überhaupt

Antwort zu Frage 2:

Ich habe gehört, dass im Falle "Unterbrechung" Sie versuchen sollten, die Verbindung wiederherzustellen. Dies kann nützlich sein, wenn Ihr Dienst ein Start-Agent ist, der bei einem Absturz von launchd neu gestartet wird.

Eigentlich in meinem Programm, ich handle nicht auf diese Fälle, sondern einfach eine Warnmeldung an die Befehlszeile ausgeben. Mein Frontend ist ein CLI-Programm. Alternativ könnten Sie diese Warnung in einer Protokolldatei protokollieren, zum Beispiel mit syslog. Siehe 'man 3 syslog'. In meiner App verwende ich meine eigene Logdatei mit konfigurierbaren Ausführlichkeit UND Syslog.

freundlichen Grüßen

Robert