Попробуйте слабую ссылку UIKit. Добавьте в ваши другие ссылки флаги:
-all_load -ObjC -weak_framework UIKit
Если вы нацелены на устройства до 3.1, но ссылаетесь на класс, который существует только в 3.2, вы не можете ссылаться на них по символу, вы должны использовать NSClassFromString. Но есть случаи, когда это невозможно, например, если вы подкласса такого класса (скажем, UIPopoverController). В этих случаях вы должны использовать слабую ссылку UIKit. При слабом связывании фреймворка динамический загрузчик пытается разрешить все символы при запуске, в случае сбоя устанавливается значение NULL.
Я предполагаю, что константа UIScreenDidConnectNotification не помечена (ошибка), поэтому вам нужно использовать тот же обходной путь.
У слабой связи есть и обратная сторона. Так как он должен делать это при запуске, динамически, время запуска принимает удар. Вам придется проверить, не слишком ли это медленно для вас.
Еще один способ слабого связывания фрейма: выполните «Get Info» для своей цели и на вкладке General вы увидите список фреймворков. Измените тип для UIKit на Слабый.
Кстати, использование #ifdef для проверки не работает, потому что #ifdef являются конструкциями времени компиляции, поэтому UI_USER_INTERFACE_IDIOM всегда будет определяться, потому что вы строите с использованием 3.2 SDK