LightMessaging

From iPhone Development Wiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

LightMessaging is an inter-process communication framework by Ryan Petrich. According to its GitHub page, it is a "simple low-level replacement for CFMessagePort". It is usually used as an API to RocketBootstrap.

Why should I use this?

  • Ryan Petrich.
  • Everyone else is using it.

How to integrate this library with your project

Grab the headers from rpetrich/LightMessaging, and #import <LightMessaging/LightMessaging.h>. In most use cases, be sure to also include the headers/library from RocketBootstrap as well (instructions here).

Server

It is recommended that this is done in somewhere better designed to act as a server, such as SpringBoard or a daemon.

Starting the Server

LMStartService("net.iphonedevwiki.some.server", CFRunLoopGetCurrent(), (CFMachPortCallBack)some_callback);

The Callback

void some_callback(CFMachPortRef port,
                   LMMessage *request,
                   CFIndex size,
                   void *info)
{
    // get the reply port
    mach_port_t replyPort = request->head.msgh_remote_port;
    // sanity check
    if(size < sizeof(LMMessage)) {
        LMSendReply(replyPort, NULL, 0);
        LMResponseBufferFree((LMResponseBuffer *)request);
        return;
    }
    
    // get the data you recieved
    void *data = LMMessageGetData(request);

    // send some data back
    const char *msg = "lol";
    LMSendReply(replyPort, msg, strlen(msg) + 1);

    // free the response buffer??
    LMResponseBufferFree((LMResponseBuffer *)request);
}

Client

This can be run anywhere that has the appropriate permissions to send/receive data on a message port.

// setup connection
LMConnection connection = {
    MACH_PORT_NULL,
    "net.iphonedevwiki.some.server"
};

//send message
LMResponseBuffer buffer;
const char *msg = "lol wtf";
SInt32 messageId = 0x1111; // this is arbitrary i think
LMConnectionSendTwoWay(&connection, messageId, msg, strlen(msg) + 1, &buffer);
LMMessage *response = &(buffer.message);

// do whatever you want !!!!
const char *data = LMMessageGetData(response);

Type helpers

There are some cool helper functions for if you want to send Images / PropertyLists / etc instead of just strings. Look at the header file or other examples to see how to use them.


Examples

External links