Добавление UIWindow в xcode iPhone SDK
Вопрос
Я создаю проект, в котором мне нужно изменить файл main.m, чтобы UIApplication не появлялся сразу, поэтому я удалил следующую строку из main.m
int retVal = UIApplicationMain(argc, argv, nil, nil);
и удалил эти строки из AppDelegate
- (void)applicationDidFinishLaunching:(UIApplication *)application {
// Override point for customization after application launch
[window makeKeyAndVisible];
}
И я добавил несколько своих строк.Теперь UIWindow не отображается по умолчанию, и это правильно.Но теперь, после выполнения моего кода, я хочу создать окно и отобразить какое-нибудь сообщение.
Как создать UIWindow, если в main.m нет UIApplication?
Решение
Если вы хотите запустить приложение из демона, используйте SBSLaunchApplicationWithIdentifier
.
BOOL SBSLaunchApplicationWithIdentifier(NSString* identifier,
BOOL please_pass_NO_here);
Если вы хотите запустить URL-адрес, используйте -[UIApplication openURL:]
или нижний уровень GSEventSendApplicationOpenURL
.
mach_port_t GSGetPurpleSystemEventPort();
void GSEventSendApplicationOpenURL(CFURLRef url, mach_port_t port);
Если вы просто хотите отобразить предупреждение, используйте CFUserNotification
.(Да, это работает на iPhoneOS.)
Другие советы
Скорее всего, отказ от запуска UIKit — не то решение, которое вы ищете.Попробуйте просто не показывать какой-либо интерфейс (не возвращайтесь из applicationDidFinishLaunching:
) и делайте там то, что вам нужно (или в чем-то, что называется отсюда).Или вы можете просто показать красивый экран загрузки с UIActivityIndicatorView
.
Также обратите внимание, что если ваше приложение не запустилось полностью в течение 20 секунд после запуска (отображается какой-то пользовательский интерфейс и реагирует на события), SpringBoard или операционная система автоматически закроют ваше приложение.Кроме того, пользователи не любят ждать :).
Редактировать:Поскольку вы не создаете приложение UIKit, перестаньте мечтать о возможности запуска UIKit посередине:ты не можешь.Для этого требуется отдельный компонент, подключающий SpringBoard.
Почему вы пытаетесь открыть окно с помощью демона?Это кажется очень плохой идеей, и, как вы заметили, ее трудно реализовать.
Вместо этого создайте приложение, которое будет делать то, что вы хотите, и запускайте его из демона, когда вы хотите показать окно — либо через обработку URL-адресов, либо каким-либо другим способом.Но в основном это приложение и ваш демон могут взаимодействовать, когда оно запущено и работает, и оно может выполнять все действия пользовательского интерфейса вне домена демона.
Я добился того, чего пытался, благодаря KennyTM за его замечательные советы.
Это то, что я сделал
1) я создал свое приложение, в котором сделал все для своего приложения, а затем записал все эти настройки в текстовый файл и заставил свое приложение создать и поместить этот текстовый файл в /private/var/mobile/SomeFile.txt (это место, где ваше приложение, будучи мобильным пользователем, может писать, не заморачиваясь с разрешениями)
2) Затем я создал другое приложение в xcode (на основе окон), удалил файлы делегата (h/m) и написал свою собственную основную функцию, в которой я прочитал из файла, созданного и записанного моим другим приложением на первом шаге (/ частный/var/mobile/SomeFile.txt).
3) Я создал список (помощь по созданию LaunchDaemon можно найти здесь). http://www.tuaw.com/2008/02/21/tuaw-responds-iphone-lojack/)
4) Я создал этот список для чтения моего приложения на шаге 2 каждые 60 секунд (1 минута), и если условие истинно, приложение на втором шаге будет отображать оповещение с использованием CFUserNotificationDisplayAlert (спасибо KennyTM за его руководство).
Единственная проблема, с которой я сейчас сталкиваюсь, заключается в том, что мне нужно вручную поместить этот launchDaemon в каталог /Library/LaunchDaemons, но SSH, используя root, потому что я не могу / мое приложение не может писать в этот каталог.