P.S. гарантия доставки осуществляется либо обратным вызовом со стороны клиента при получении сообщения. Например пришло сообщение {'id': 123, 'message': 'hello'}, в ответ в какой нибудь канал клиент должен отослать событие например {'event':'read', 'id': 123}. и пока сервер не получит это сообщение о прочтении - будет продолжать раз в какое-то время его отправлять заново.
Если вам не подходит гугл, то попробуйте Project OSRM, когда-то давно пытались его использовать для службы такси. Я не уверен что там есть морские пути, но потестите, там есть демка. Если и этот не подойдет - скорее всего вы не найдете в открытом доступе подобных проектов.
UPD:
Supports car, bicycle, walk modes; easily customized through profiles.
Я в objective c не шарю, но могу предположить следующие возможные решения:
возможно все маркеры добавляются, просто с одними координатами и накладываются друг на друга, из за чего кажется что он один. вывод сделал на основе того что у вас все переменные в цикле начинаются со звездочек, а координаты почему то нет (опять же не кидать камнями - не шарю)