Заставить приложение перезапускаться на взломанном устройстве

Возможно ли, что мое 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, чтобы избежать автоматического включения фонового выполнения и приостановки работы приложения.

Другие вопросы по тегам