在越狱设备上自行重启应用程序

时间:2012-09-29 11:28:08

标签: ios objective-c jailbreak

每次用户访问主屏幕时,我的iOS应用都可以自动重启吗?这适用于越狱设备 - 该应用程序不适用于App商店。

一般情况下,如何根据应用程序外的特定用户操作重新启动应用程序?

2 个答案:

答案 0 :(得分:2)

加速度计

如果你想要做的就是在遇到某些加速计条件时让你的应用运行,你可以使用Activator。 Activator是一个很棒的应用程序,Ryan Petrich,可以在Cydia上免费获得。它允许您将设备配置为在执行某个用户操作时运行任何应用程序(或切换)。这可能是按钮按下,电源/锁定按钮按下或加速度计抖动。

enter image description here

如果基本摇晃不是你想要的,或者你正在构建一个应用程序给许多用户,并且不希望他们自己设置Activator,那么你可能需要自己写一些代码。

例如,您可以在主UI应用程序之外编写Launch Daemon,并启动启动守护程序monitor the accelerometer.

当您检测到您感兴趣的特定类型的动作时,您可以launch your UI app with the open command。如果这仅供您自己使用,请从Cydia下载open包。如果要发布给其他人,请确保您的应用依赖于open以确保其已安装。例如,如果在Debian .deb包中打包,则DEBIAN / control文件可能包含:

Depends: open

确保安装您应用的用户也会自动获得您应用所需的open

解锁

您的其他问题是在用户解锁手机时启动应用。再次,我会使用你的启动守护进程来监听这种情况。在iOS 5上,当我解锁手机时,我会看到此通知:

  

拦截通知:com.apple.springboard.lockstate

(我通过从命令行运行notificationWatcher实用程序检测到这一点,同时通过SSH连接到我的手机。也可以从Cydia获得NotificationWatcher,作为Erica Sadun的 Erica Utilities 的一部分包)

因此,我会为"com.apple.springboard.lockstate"启动您的启动守护程序register for Darwin notifications。像这样:

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 in this other SO answernotify_get_state()可用于确定事件是开启还是关闭事件。

答案 1 :(得分:0)

在应用的Info.plist文件中将UIApplicationExitsOnSuspend的值设置为YES。

  

UIApplicationExitsOnSuspend(Boolean - iOS)指定应用程序   应该终止而不是移动到后台   放弃。与iOS SDK 4.0或更高版本链接的应用可以包含此密钥   并将其值设置为YES以防止自动选择加入   后台执行和应用程序暂停。