From iPhone Development Wiki

LightMessaging is a work-in-progress inter-process communication header-only library by Ryan Petrich. According to its GitHub page, it is a "simple low-level replacement for CFMessagePort".

How to use this library

Headers are available from LightMessaging's GitHub project. If using Theos, place the headers in $THEOS/include/LightMessaging.

Include directive

#import <LightMessaging/LightMessaging.h>


LightMessaging uses RocketBootstrap by default, so be sure to have it set up (instructions here). To have LightMessaging not use RBS, add the following directive before including the LM header:



Use this directive (before including the LM header) to set the timeout:

#define LIGHTMESSAGING_TIMEOUT 500 // 500 ms timeout


This must be done in a non-sandboxed process. Typically, this is done in SpringBoard or a non-sandboxed daemon. If you put the server anywhere other than SpringBoard, then you must register the service in SpringBoard using rocketbootstrap_unlock. More info here.

Disclaimer: The server interface is not finished yet; it may change in a future version.

The Callback

void some_callback(CFMachPortRef port, LMMessage *message, CFIndex size, void *info) {
	// get the reply port
	mach_port_t replyPort = message->head.msgh_remote_port;

	// Check validity of message
	if (!LMDataWithSizeIsValidMessage(message, size)) {
		LMSendReply(replyPort, NULL, 0);
		LMResponseBufferFree((LMResponseBuffer *)message);
	// Get the data you received
	void *data = LMMessageGetData(message);
	size_t length = LMMessageGetDataLength(message);
	// Make it into a CFDataRef object
	CFDataRef cfdata = CFDataCreateWithBytesNoCopy(kCFAllocatorDefault, (const UInt8 *)data ?: (const UInt8 *)&data, length, kCFAllocatorNull);

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

	// Free the CFDataRef object
	if (cfdata) {
	// Free the response buffer
	LMResponseBufferFree((LMResponseBuffer *)message);

Starting the Server

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


This can be run anywhere; like a command line program, sandboxed process, daemon, etc.

// setup connection
LMConnection connection = {

//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.

(this section should be expanded)


External links