Здесь есть несколько вариантов:
1) Создайте уровень абстракции платформы, чтобы вы могли записывать свой код в PAL, и PAL на каждой платформе делает правильные вещи. Проблема с этим в том, что PAL будет напоминать наименьший общий знаменатель, если вы не готовы заглушить функции, которые ничего не делают на платформах, которые их не поддерживают. Ваша общая логика приложения может быть затем написана на любом подходящем языке - например, C ++.
2) Создайте свой общий код в чем-то вроде C ++ и свой код для конкретной платформы в платформе, специфичной для платформы (.NET / Obj-C). Это позволяет вам иметь общую логику приложения в виде библиотеки, в которую загружается код для конкретной платформы.
3) Гибрид из (1) и (2) с использованием пар # ifdef / # endif для извлечения соответствующих частей. Я не рекомендую это - это больно.
4) Напишите код для каждой платформы полностью независимо и поделитесь дизайном, алгоритмами и цифровыми ресурсами (растровые изображения, значки, звуки и т. Д.). Да, больше для обслуживания, но дает вам лучший опыт на каждой платформе.
5) Веб-приложение, предложенное OMG_Peanuts. Это быстрый выигрыш, но мало или вообще не зависит от платформы.