【发布时间】:2011-01-01 04:13:27
【问题描述】:
我正在向我的 iPhone 应用程序发送推送通知,并且我希望根据应用程序是否已经启动来执行不同的指令集。我是 iPhone 开发的新手,虽然我怀疑 UIApplication 或我项目的 AppDelegate 类有解决方案,但我还没有找到好的答案。有没有简单的方法来检查这个?
【问题讨论】:
标签: iphone iphone-sdk-3.0 push-notification
我正在向我的 iPhone 应用程序发送推送通知,并且我希望根据应用程序是否已经启动来执行不同的指令集。我是 iPhone 开发的新手,虽然我怀疑 UIApplication 或我项目的 AppDelegate 类有解决方案,但我还没有找到好的答案。有没有简单的方法来检查这个?
【问题讨论】:
标签: iphone iphone-sdk-3.0 push-notification
这是处理应用的活动/非活动状态的更合适的方法。
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
// check for the app state
UIApplicationState state = [application applicationState];
if (state == UIApplicationStateActive) {
//the app is in the foreground, so here you do your stuff since the OS does not do it for you
//navigate the "aps" dictionary looking for "loc-args" and "loc-key", for example, or your personal payload)
}
application.applicationIconBadgeNumber = 0;
}
didReceiveRemoteNotification: 在应用程序运行时被调用,是的,但是当它被挂起时,iOS 负责放置徽章等。如果应用程序在前台,操作系统什么也不做,并且只需致电您的didReceiveRemoteNotification:。
【讨论】:
根据您所说的“已启动”,您正在寻找:
使用一个标志,当应用程序变为活动状态时设置为 true,当应用程序不活动时设置为 false。
标志(在头文件 [.h] 中):
BOOL applicationIsActive;
代码(在实现文件 [.m] 中):
- (void)applicationDidBecomeActive:(UIApplication *)application {
applicationIsActive = YES;
}
- (void)applicationWillResignActive:(UIApplication *)application {
applicationIsActive = NO;
}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
if (applicationIsActive) {
// Handle notification in app active state here
}
else {
// Handle notification in app suspended state here
}
这是因为当应用程序被挂起时,操作系统会在“唤醒”过程中调用“applicationDidBecomeActive”之前调用“applicationDidReceiveRemoteNotification”。
“完整”的答案实际上是凯文的答案加上这个答案。
希望这会有所帮助。
【讨论】:
UIApplication 委托有方法
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
你需要实现的。这会在应用程序运行时收到通知。
如果您的应用当前未运行并且收到通知,则可以使用
启动您的应用- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
包含在 launchOptions 字典中的通知详细信息。如果字典为 nil,则用户正常点击应用程序图标。
【讨论】:
如果您要在小于 4 的 iOS 上检查 applicationState,则需要检查 applicationState 是否受支持:
if ([application respondsToSelector:@selector(applicationState)] ){
// Safe to check applicationState
UIApplicationState state = [application applicationState];
}
【讨论】:
Apple 的推送通知文档解释了这一点:
但是,有两种情况 applicationDidFinishLaunching: 不是一个合适的实现站点:
- 通知到达时应用程序正在运行。
- 通知负载包含应用程序可以使用的自定义数据。
在第一种情况下,当 iPhone OS 收到远程通知时应用程序正在运行,如果你想立即下载数据,你应该实现 UIApplicationDelegate 的 application:didReceiveRemoteNotification: 方法。下载后,请务必从应用程序图标中删除徽章。 (如果您的应用程序经常向其提供者检查新数据,则可能不需要实现此方法。)
这意味着如果你的 application:didReceiveRemoteNotification: 委托方法被调用,你的应用程序正在运行。
【讨论】: