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

标签 ios objective-c jailbreak

我的 iOS 应用程序是否可以在用户每次访问其主屏幕时自动重启?这是针对越狱设备的——该应用不适用于应用商店。

一般来说,如果用户在应用外执行特定操作,我该如何重启我的应用?

最佳答案

加速度计

如果您只想让您的应用在遇到特定加速度计条件时运行,您可以为此使用 Activator。 Activator 是一个很棒的应用程序,作者 Ryan Petrich , 在 Cydia 上免费提供。它允许您将设备配置为在执行特定用户操作时运行任何应用程序(或切换)。这可能是按下主页按钮、按下电源/锁定按钮或加速度计震动。

enter image description here

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

例如,您可以写一个 Launch Daemon除了您的主 UI 应用程序, 并拥有启动守护程序 monitor the accelerometer.

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

Depends: open

确保安装您的应用的用户也会自动打开,这是您的应用所需要的。

解锁

您的其他问题涉及在用户解锁手机时启动应用程序。同样,我会使用您的 Launch Daemon 来监听这种情况。在 iOS 5 上,我在解锁手机时看到此通知:

Notification intercepted: com.apple.springboard.lockstate

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

所以,我要你的启动守护进程 register for Darwin notifications对于 “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 in this other SO answer . notify_get_state() 可用于确定事件是开启还是关闭。

关于ios - 让应用程序在越狱设备上自行重启,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12652297/

相关文章:

iphone - UIWebView 中的谷歌地图从核心传递数据

iphone - php -> JSON -> iPhone

iphone - 如何以编程方式判断 IBAction 是否已被代码或用户操作调用

ios - 在 XNU 内核上查找某个函数的指针的最佳方法是什么?

iphone - 如何将运行 iOS 5 的 iPhone 静音

iOS:当我需要在 View 对用户可见后执行某些操作时要覆盖哪个函数?

ios - 使用 Swift 发布 JSON

ios - 用户位置显示为注释

ios - (以编程方式/自动)删除 iOS 应用程序

ios - 离屏(不可见)TableViewCell 不动画