0

我正在创建一个项目,我必须在其中更改 main.m 文件,以便 UIApplication 不会立即出现,所以我从 main.m 中删除了以下行

int retVal = UIApplicationMain(argc, argv, nil, nil);

并从 AppDelegate 中删除了这些行

- (void)applicationDidFinishLaunching:(UIApplication *)application {    

    // Override point for customization after application launch
    [window makeKeyAndVisible];
}

我已经添加了一些我的行。现在 UIWindow 默认情况下不会出现,这是正确的。但是现在在我的代码执行之后,我想创建一个窗口并显示一些消息。

main.m 中没有 UIApplication 时如何创建 UIWindow?

4

4 回答 4

4

如果要从守护程序启动应用程序,请使用SBSLaunchApplicationWithIdentifier.

BOOL SBSLaunchApplicationWithIdentifier(NSString* identifier,
                                        BOOL      please_pass_NO_here);

如果要启动 URL,请使用-[UIApplication openURL:]或较低级别的GSEventSendApplicationOpenURL.

mach_port_t GSGetPurpleSystemEventPort();
void GSEventSendApplicationOpenURL(CFURLRef url, mach_port_t port);

如果您只想显示警报,请使用CFUserNotification. (是的,它适用于 iPhoneOS。)

http://developer.apple.com/mac/library/documentation/CoreFoundation/Reference/CFUserNotificationRef/Reference/reference.html

于 2010-01-07T15:42:03.887 回答
1

最有可能的是,不启动 UIKit 不是您正在寻找的解决方案。尝试不显示任何 UI(不要从 中返回applicationDidFinishLaunching:)并在其中执行您需要执行的操作(或在其中调用的操作中)。或者,您可以只显示一个带有UIActivityIndicatorView.

另外,请注意,如果您的应用程序在启动后 20 秒内没有完全启动(显示某种 UI 并响应事件),SpringBoard 或操作系统将自动退出您的应用程序。此外,用户不喜欢等待:)。

编辑:由于您没有制作 UIKit 应用程序,请停止梦想能够在中间启动 UIKit:您不能。这需要一个单独的组件挂钩 SpringBoard 来完成。

于 2010-01-06T04:02:42.747 回答
0

你为什么要从守护进程打开一个窗口?这似乎是一个非常糟糕的主意,而且正如您所指出的那样,实际上很难做到。

相反,创建一个应用程序来执行您想要执行的操作,并在您想要显示一个窗口时从守护程序启动它 - 通过 URL 处理或其他方式。但基本上,该应用程序和您的守护程序一旦启动并运行就可以进行通信,并且它可以在守护程序域之外完成所有 UI 工作。

于 2010-01-06T06:21:03.060 回答
0

感谢 KennyTM 的出色建议,我实现了我想要做的事情。

这就是我所做的

1)我创建了我的应用程序,在其中我为我的应用程序做了所有的事情,然后将所有这些设置写入一个文本文件并让我的应用程序创建并将该 txt 文件放置到 /private/var/mobile/SomeFile.txt (这是作为移动用户,您的应用可以在不影响权限的情况下进行编写)

2)然后我在xcode中创建了另一个应用程序,(基于窗口),删除了委托(h / m)文件并编写了我自己的主要功能,在其中我从我的另一个应用程序创建并在第一步中写入的文件中读取(/私人/var/mobile/SomeFile.txt)。

3)我创建了一个 plist(您可以在此处找到有关创建 LaunchDaemon 的帮助http://www.tuaw.com/2008/02/21/tuaw-responds-iphone-lojack/

4)我在第 2 步中每 60 秒(1 分钟)创建该 plist 来读取我的应用程序,如果条件为真,则第 2 步中的应用程序将使用 CFUserNotificationDisplayAlert 显示警报(感谢 KennyTM 的指导)。

我目前遇到的唯一问题是我必须手动将 launchDaemon 放在 /Library/LaunchDaemons 目录中,但使用 root 进行 SSH,因为我无法 / 我的应用程序无法写入该目录。

于 2010-01-28T06:40:14.170 回答