阅读APNS文档后,我已在我的应用程序中实现了apns。一切正常,但我有一个问题。 我不知道是否有可能,但是当我的应用程序处于后台并收到apns通知时,我想执行任务。
这是我在通知中的字典:
aps =
{
alert = "message";
sound = "default";
};
如果我的应用程序在前台,我执行此代码:
- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo
{
[HTTPConnection sendGetToUrl:[NSURL URLWithString:stringUrl]];
NSLog(@"Received notification: %@", userInfo);
}
但是,当应用程序处于后台时,apns不会执行“didReceiveRemoteNotification”,所以我想执行该方法:
[HTTPConnection sendGetToUrl:[NSURL URLWithString:stringUrl]];
如果我在后台收到apns通知。
有什么办法吗?
非常感谢!
答案 0 :(得分:6)
是的,自iOS 7起,这是可行的,您需要将remote-notification
添加到应用UIBackgroundModes
中的info.plist
。
然后在您的app委托中实施application:didReceiveRemoteNotification:fetchCompletionHandler:
。您将有30秒的时间来获取数据,如果您的应用需要更长时间,系统可能会终止您的数据。
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))handler {
NSString *stringURl = /* some URL */;
[HTTPConnection sendGetToUrl:[NSURL URLWithString:stringUrl]];
// Once done call handler with one of the result types:
// UIBackgroundFetchResultNewData, UIBackgroundFetchResultNoData, UIBackgroundFetchResultFailed
handler(UIBackgroundFetchResultNewData);
}
您必须在完成调用时通知系统,并通过调用处理程序获取数据。如文档所述,如果您成功获取任何数据,则需要告诉处理程序:
<强>处理程序强>
下载操作完成时要执行的块。 调用此块时,传入最佳的获取结果值 描述了下载操作的结果。你必须打电话给这个 处理程序,应该尽快这样做。有关可能的列表 值,请参阅
UIBackgroundFetchResult
类型。
答案 1 :(得分:2)
Source from Apple Documentation:
-(void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo
fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{
}
与应用程序不同:didReceiveRemoteNotification:方法,仅在您的应用程序运行时调用,无论您的应用程序状态如何,系统都会调用此方法。如果您的应用程序已暂停或未运行,在调用方法之前,系统会唤醒或启动您的应用并将其置于后台运行状态。
调用此方法时,您的应用程序最多有30秒的挂钟时间来执行下载操作并调用指定的完成处理程序块。实际上,您的应用程序应在下载所需数据后尽快调用处理程序块。如果您未及时致电处理程序,您的应用程序将被暂停。更重要的是,系统使用经过的时间来计算应用程序后台下载的功耗和数据成本。有关支持后续操作以响应推送通知的详细信息,请参阅App States and Multitasking中的“iOS App Programming Guide”。
Tom更新: 但是,如果用户强行退出,系统不会自动启动您的应用。在这种情况下,用户必须重新启动您的应用程序或重新启动设备,然后系统才会再次尝试自动启动您的应用。
答案 2 :(得分:0)
如果您的意思是,在用户点按通知后,您应该检查UIApplicationLaunchOptionsRemoteNotificationKey
中是否存在- (BOOL)application:didFinishLaunchingWithOptions:
,例如:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSDictionary *rNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if(remoteNotifDic)
{
NSString *myAlertString=rNotif[@"aps"][@"alert"];
//...
}
}