0

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

一般来说,在给定应用程序外部的特定用户操作的情况下,如何让我的应用程序重新启动?

4

2 回答 2

2

加速度计

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

在此处输入图像描述

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

例如,除了您的主 UI 应用程序之外,您还可以编写一个Launch Daemon,并让启动守护程序监控加速度计。

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

Depends: open

以确保安装您的应用程序的用户也将自动获得open您的应用程序需要的。

开锁

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

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

(我通过notificationWatcher从命令行运行实用程序检测到这一点,而 SSH 连接到我的手机。Cydia 也提供 NotificationWatcher,作为 Erica Sadun 的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对象以查看是否告诉您这是锁定还是解锁事件. 我敢肯定还有其他方法。

更新:如果您需要帮助确定屏幕锁定或解锁时是否发生通知,您可以在其他 SO 答案中查看我的更新 2 。 可用于确定事件是打开还是关闭事件。notify_get_state()

于 2012-09-30T21:26:40.410 回答
0

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

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

于 2012-09-29T11:34:10.527 回答