Заставить приложение перезапускаться на взломанном устройстве
Возможно ли, что мое iOS-приложение может автоматически перезапускаться каждый раз, когда пользователь получает доступ к своему домашнему экрану? Это для взломанного устройства - приложение не предназначено для магазина приложений.
В общем, как я могу сделать так, чтобы мое приложение перезагружалось при определенных действиях пользователя вне приложения?
2 ответа
акселерометр
Если все, что вы хотите сделать, это запустить приложение, когда вы столкнетесь с определенными условиями акселерометра, вы можете использовать Activator
для этого. Activator - отличное приложение от rpetrich, доступное на Cydia бесплатно. Это позволяет вам настроить ваше устройство для запуска любого приложения (или переключения), когда предпринимаются определенные действия пользователя. Это может быть нажатие кнопки "Домой", нажатие кнопки питания / блокировки или тряска акселерометра.
Если базовая встряска - это не то, что вам нужно, или вы создаете приложение для многих пользователей и не хотите, чтобы им приходилось настраивать Activator самостоятельно, то вам, вероятно, нужно написать некоторый код самостоятельно.
Например, вы можете написать Launch Daemon, в дополнение к вашему основному UI-приложению, и иметь демон запуска для мониторинга акселерометра.
Когда вы обнаружите интересующий вас вид движения, вы можете запустить приложение с open
командование Если это только для вашего собственного использования, просто загрузите open
пакет от Cydia. Если это для публикации другим, убедитесь, что ваше приложение зависит от open
чтобы убедиться, что он установлен. Например, если упаковка в пакет Debian .deb, файл DEBIAN/control может иметь следующее:
Depends: open
чтобы пользователи, устанавливающие ваше приложение, также автоматически получали open
, в котором нуждается ваше приложение.
отпереть
Другая ваша проблема касается запуска приложения, когда пользователь разблокирует телефон. Опять же, я бы использовал ваш Launch Daemon для прослушивания этого условия. На iOS 5 я вижу это уведомление, когда я разблокирую телефон:
Уведомление перехвачено: com.apple.springboard.lockstate
(Я обнаружил это, запустив notificationWatcher
утилита из командной строки, пока SSH'd в мой телефон. NotificationWatcher также доступен от Cydia, как часть пакета Erica Utilities Эрики Садун)
Итак, я бы запустил ваш демон запуска для получения уведомлений Дарвина о "com.apple.springboard.lockstate"
, Что-то вроде этого:
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), //center
self, // observer: can be NULL if callback doesn't need self
onLockStateChanged, // callback
CFSTR("com.apple.springboard.lockstate"), // name
NULL, // object
CFNotificationSuspensionBehaviorDeliverImmediately);
где функция обратного вызова здесь:
static void onLockStateChanged(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo) {
// if you need access to member data (ivars):
MyLaunchDaemon* this = (MyLaunchDaemon*)observer;
//if (userInfo != nil) {
// CFShow(userInfo);
//}
NSDictionary* info = (NSDictionary*)userInfo;
// I'm not sure if the userInfo object has any useful
// description for the lock state event
if (/* unlocked */) {
// force app to open, or resume from the background
system("/usr/bin/open com.mycompany.MyAppName");
}
}
Я вижу это же уведомление, когда экран заблокирован или разблокирован, поэтому вам может потребоваться, чтобы демон запуска отслеживал заблокированное / разблокированное состояние или проверил userInfo
объект, чтобы увидеть, если это говорит вам, является ли это событие блокировки или разблокировки. Я уверен, что есть и другие способы.
Обновление: если вам нужна помощь в определении того, происходит ли уведомление, когда экран заблокирован или разблокирован, вы можете увидеть мое Обновление 2 в этом другом ответе SO. notify_get_state()
может использоваться для определения, является ли событие включенным или выключенным.
Установите значение UIApplicationExitsOnSuspend
ДА в файле Info.plist вашего приложения.
UIApplicationExitsOnSuspend (Boolean - iOS) указывает, что приложение должно быть прервано, а не перемещено в фоновый режим при его выходе. Приложения, связанные с iOS SDK 4.0 или более поздней версии, могут включать этот ключ и устанавливать для него значение YES, чтобы избежать автоматического включения фонового выполнения и приостановки работы приложения.