2016-04-02 23 views
1

截至2016年,Apple docs在這是陳舊的,不工作。例如,他們提到「保留」,但在XCode 7.1中默認使用ARC並且不支持「保留」。我在網上嘗試過各種示例,但都沒有成功。如何在OSX上對稱爲分佈式對象的IPC機制進行編碼,其中客戶機應用程序可以在服務器應用程序上調用類方法(例如,特別是在LaunchDaemon中構成的,但不是必需的)?如何使用Objective C在OSX上執行分佈式對象?

回答

3

這裏有一個代碼示例讓你去。 server.mm項目最好是將其加載到LaunchDaemon中。我以root用戶的身份運行了一些測試,並確保以「mike」運行的客戶端應用程序以「root」身份運行守護程序中的代碼。所以,它可以啓用特權提升。請注意,此IPC不提供任何協議加密或認證挑戰 - 所以,您自己決定添加。您可能可以使用AES256 + Base64編碼加密的密鑰/列表,XML或JSON消息,並在發送和接收時使用一個長而艱難的密碼短語。請記住,在特權提升的情況下,您必須實施一些保護機制。

首先啓動服務器,它將坐在那裏等待連接。接下來啓動客戶端,它將建立連接,將數據傳遞給樣本類方法,等待並接收消息,然後顯示並關閉。服務器還會顯示連接已完成,以及在發送響應之前服務器上收到的內容。

請注意,這是一個同步示例,這意味着您調用類方法並等待響應。如果您希望它是異步的,那麼您應該閱讀oneway keyword上的Apple文檔。你把它放在類方法聲明中的客戶端和服務器端。請注意,關鍵字oneway實際上最適用於返回void的類方法,因爲您無法獲得對異步類方法的響應。因此,您需要進行異步調用來啓動任務,然後使用同步調用來獲取您啓動的任務的狀態更新。所以,這裏的是將有oneway關鍵字類方法聲明的例子說:

- (oneway void)runTaskAsync:(NSString *)sParam; 

而現在,代碼...

server.m

#import <Foundation/Foundation.h> 

#define cat stringByAppendingString 

@interface MyService : NSObject { 
    NSConnection *connection; 
} 
@end 

@implementation MyService 

- (NSString *)testResponse:(NSString *)s { 
    NSLog(@"...connection:%@", s); 
    s = [s cat:@"-response"]; 
    return s; 
} 

- (void)runService { 
    connection = [[NSConnection alloc] init]; 
    [connection setRootObject:self]; 
    [connection registerName:@"com.acme.myservice"]; 
    [[NSRunLoop currentRunLoop] run]; 
} 

@end 

int main (int argc, const char *argv[]) { 
    @autoreleasepool { 
     NSLog(@"ACME MyService 1.0\n"); 
     MyService *svc = [[MyService alloc] init]; 
     [svc runService]; 
    } 
    return 0; 
} 

client.m

#import <Foundation/Foundation.h> 

int main (int argc, const char *argv[]) { 
    @autoreleasepool { 
     NSLog(@"building proxy object"); 
     id proxy = [NSConnection rootProxyForConnectionWithRegisteredName:@"com.acme.myservice" host:nil]; 
     NSLog(@"calling test response thru proxy object"); 
     NSString *sResult = [proxy testResponse:@"sent"]; 
     NSLog(@"RESULT=%@", sResult); 
    } 
    return 0; 
} 
+0

這不需要是Objective-C++,據我所知它不使用任何C++特性。 – tbodt

相關問題