Добавление 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?


person raziiq    schedule 06.01.2010    source источник
comment
Это кажется ДЕЙСТВИТЕЛЬНО плохой идеей.   -  person Grant Paul    schedule 06.01.2010


Ответы (4)


Если вы хотите запустить приложение из демона, используйте 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.)

http://developer.apple.com/mac/library/documentation/CoreFoundation/Reference/CFUserNotificationRef/Reference/reference.html

person kennytm    schedule 07.01.2010
comment
Waoo это что-то действительно обнадеживающее. Я обязательно попробую. Одна вещь, которую я хочу спросить здесь, это то, что на самом деле я написал свой LaunchDaemon как сценарий bash, который отлично работает, если я просто регистрирую файл с некоторыми входными данными, но всякий раз, когда я пытаюсь открыть приложение, используя /Applications/Appname.app/AppName , Ничего не произошло. Могу ли я в любом случае открыть приложение с помощью Bash Script в iPhoneOS? - person raziiq; 10.01.2010
comment
Вам нужно передать идентификатор, например. @com.yourcompany.appname. - person kennytm; 10.01.2010
comment
Спасибо за ответ. Да, я знаю, что должен передать идентификатор классу, который вы сказали мне ранее, я обязательно попробую, но в этом случае я спрашивал, есть ли в bash Scripting способ открыть приложение с помощью какой-либо команды сценария bash? - person raziiq; 10.01.2010
comment
Нет. (Однако вы можете найти идентификатор пакета из Info.plist по этому пути.) - person kennytm; 10.01.2010
comment
да спасибо, я могу попробовать это. Кстати, вы знаете какой-нибудь пример, использующий вышеупомянутые вещи, которые вы упомянули? - person raziiq; 10.01.2010
comment
Используйте NSBundle для получения идентификатора пакета, просто погуглите, как это сделать; как вызвать SBSLaunchApplicationWithIdentifier тривиально из прототипа функции. - person kennytm; 10.01.2010
comment
Хорошо. Итак, в двух словах, вы говорите создать приложение в xcode, где я использую ту же логику UIApplication (такую ​​же, как при использовании шаблона WindowBased), а затем использую SBSLaunchApplicationWithIdentifier для запуска приложения или, в моем случае, моего приложения. Итак, в основном у меня будет два приложения, одно как LaunchDaemon и одно, которое будет запускать LaunchDaemon, верно? - person raziiq; 10.01.2010
comment
Верно. SBSLaunchApplicationWithIdentifier можно вызывать из чего угодно, но запускаемое приложение должно быть приложением на основе UIKit. - person kennytm; 10.01.2010
comment
хм Хорошо. Значит, даже если я напишу свой собственный main, как я только что написал в своем 1-м посте, я смогу получить доступ к SBSLaunchApplicationWithIdentifier? Если это так, то это не будет так сложно. - person raziiq; 10.01.2010
comment
Да. Но не забудьте добавить право com.apple.springboard.launchapplications в консольное приложение, иначе вы не сможете использовать SBSLaunchApplicationWithIdentifier. - person kennytm; 10.01.2010
comment
Что вы имеете в виду под этим Но не забудьте добавить право com.apple.springboard.launchapplications в ваше консольное приложение, иначе вы не сможете использовать SBSLaunchApplicationWithIdentifier Как это сделать? Извините за столько вопросов, пожалуйста, потерпите меня. - person raziiq; 10.01.2010
comment
telesphoreo.org/pipermail/iphone-python/2008-сентябрь/ (подумайте о python как о консольном приложении, которое будет запускать приложение.) - person kennytm; 10.01.2010
comment
Спасибо большое за вашу помощь. В настоящее время я пишу свое приложение, и я опубликую свой отзыв. Надеюсь на вашу помощь в будущем. - person raziiq; 10.01.2010

Скорее всего, не запускать UIKit — это не то решение, которое вы ищете. Попробуйте просто не показывать какой-либо пользовательский интерфейс (не возвращайтесь из applicationDidFinishLaunching:) и делайте то, что вам нужно, там (или в чем-то, что вызывается оттуда). Или вы можете просто показать красивый загрузочный экран с UIActivityIndicatorView.

Также обратите внимание, что если ваше приложение не запустилось полностью в течение 20 секунд после запуска (показывая какой-то пользовательский интерфейс и реагируя на события), SpringBoard или ОС автоматически закроют ваше приложение. Кроме того, пользователи не любят ждать :).

Редактировать: поскольку вы не создаете приложение UIKit, перестаньте мечтать о возможности запустить UIKit в середине: вы не можете. Для этого требуется отдельный компонент, подключающий SpringBoard.

person Grant Paul    schedule 06.01.2010
comment
Спасибо за ответ. На самом деле я создаю LaunchDaemon. Итак, я подумал, что если я создам приложение UIA, оно займет много памяти, так как оно все время работает в фоновом режиме, поэтому я написал свой собственный файл main.m. Любое предложение о том, как это сделать? - person raziiq; 06.01.2010
comment
Вы не можете создать фоновый демон как приложение на iPhone OS. Вам нужно сделать джейлбрейк телефона. - person Nimrod; 06.01.2010
comment
И это совершенно нормально для меня, но если это так, то вам вообще не следует делать НИКАКОЙ UIKit. - person Grant Paul; 06.01.2010
comment
Конечно, когда я говорю о демонах, я разрабатываю для взломанного iPhone. - person raziiq; 06.01.2010

ПОЧЕМУ вы пытаетесь открыть окно из демона? Это кажется супер-плохой идеей, и, как вы заметили, ее трудно реализовать.

Вместо этого создайте приложение, которое будет делать то, что вы хотите, и запустите его из демона, когда вы хотите показать окно — либо с помощью обработки URL-адресов, либо каким-либо другим способом. Но в основном это приложение и ваш демон могут взаимодействовать, когда оно запущено и работает, и оно может выполнять все действия с пользовательским интерфейсом вне домена демона.

person Kendall Helmstetter Gelner    schedule 06.01.2010
comment
Любой пример того, как подключиться к Springboard? - person raziiq; 06.01.2010

я добился того, что пытался сделать, благодаря KennyTM за его замечательные советы.

Это то, что я сделал

1) я создал свое приложение, в котором я сделал все для своего приложения, а затем записал все эти настройки в текстовый файл и заставил свое приложение создать и поместить этот текстовый файл в /private/var/mobile/SomeFile.txt (это место, где как мобильный пользователь ваше приложение может писать, не возясь с разрешениями)

2) Затем я создал еще одно приложение в xcode (на основе окна), удалил файлы делегата (h/m) и написал свою собственную основную функцию, в которой я прочитал из файла, созданного моим другим приложением, и написал на 1-м шаге (/ частный/var/мобильный/SomeFile.txt).

3) Я создал plist (Вы можете найти помощь по созданию LaunchDaemon здесь http://www.tuaw.com/2008/02/21/tuaw-responds-iphone-lojack/)

4) Я сделал этот plist для чтения моего приложения на шаге 2 каждые 60 секунд (1 мин), и если условие истинно, приложение на 2-м шаге будет отображать предупреждение с использованием CFUserNotificationDisplayAlert (спасибо KennyTM за его руководство).

Единственная проблема, с которой я сейчас сталкиваюсь, заключается в том, что я должен поместить этот launchDaemon в каталог /Library/LaunchDaemons вручную, но SSH с использованием root, потому что я не могу / мое приложение не может писать в этот каталог.

person raziiq    schedule 28.01.2010