Erw*_*win 52 iphone apple-push-notifications ios4
这样的问题已被多次询问,但我有一些特定的情况正在发生.
当我的应用程序处于活动状态并且我收到PUSH消息时,我成功地能够解析自定义有效负载等.
但是当我的应用程序在后台并且PUSH到达时,用户必须单击"查看/打开"按钮才能获得didReceiveRemoteNotification被叫,然后didFinishLaunchingWithOptions被调用.
我需要让我的应用程序决定是否必须在后台提示用户使用UIAlert,或者根据某些本地设置禁止推送消息.
任何帮助,将不胜感激,
Bog*_*tyr 150
您的应用需要处理所有可能的推送通知交付状态:
您的应用刚刚推出
你的应用程序只是从背景到前景
您的应用已在前台运行
您无法在交付时选择使用哪种演示方法来呈现推送通知,该推送通知在通知本身中编码(可选警报,徽章编号,声音).但是,由于您可能控制了推送通知的应用程序和有效负载,因此您可以在有效负载中指定是否已经向用户显示了警报视图和消息.只有在应用程序已经在前台运行的情况下才知道用户不是通过警报或定期从主屏幕启动应用程序.
你可以使用这段代码判断你的应用程序是否只是在didReceiveRemoteNotification中被带到了前台:
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
if ( application.applicationState == UIApplicationStateActive )
// app was already in the foreground
else
// app was just brought from background to foreground
...
}
Run Code Online (Sandbox Code Playgroud)
San*_*mar 14
通过content-available = 1您的有效负载,didReceiveRemoteNotification即使在后台也会调用.例如
{
"alert" : "",
"badge" : "0",
"content-available" : "1",
"sound" : ""
}
Run Code Online (Sandbox Code Playgroud)
Alb*_*toC 14
当应用程序处于后台时,您必须执行多项操作才能管理收到的推送通知.
首先,在服务器端,您必须设置{"aps":{"content-available" : 1... / $body['aps']['content-available'] =1;推送通知有效负载.
其次,在你的Xcode项目中,你必须支持"远程通知".它是通过转到项目的目标 - >功能,然后启用功能切换,并选中远程通知复选框.
第三,不必使用didReceiveRemoteNotification,你必须打电话 application:didReceiveRemoteNotification:fetchCompletionHandler:,这将允许你在接收通知时在后台执行你想要的任务:
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
if(application.applicationState == UIApplicationStateInactive) {
NSLog(@"Inactive - the user has tapped in the notification when app was closed or in background");
//do some tasks
[self manageRemoteNotification:userInfo];
completionHandler(UIBackgroundFetchResultNewData);
}
else if (application.applicationState == UIApplicationStateBackground) {
NSLog(@"application Background - notification has arrived when app was in background");
NSString* contentAvailable = [NSString stringWithFormat:@"%@", [[userInfo valueForKey:@"aps"] valueForKey:@"content-available"]];
if([contentAvailable isEqualToString:@"1"]) {
// do tasks
[self manageRemoteNotification:userInfo];
NSLog(@"content-available is equal to 1");
completionHandler(UIBackgroundFetchResultNewData);
}
}
else {
NSLog(@"application Active - notication has arrived while app was opened");
//Show an in-app banner
//do tasks
[self manageRemoteNotification:userInfo];
completionHandler(UIBackgroundFetchResultNewData);
}
}
Run Code Online (Sandbox Code Playgroud)
最后,您必须UIRemoteNotificationTypeNewsstandContentAvailability在设置时将此通知类型添加到通知设置中.
除此之外,如果你的应用程序在通知到达时关闭了,你必须管理它didFinishLaunchingWithOptions,并且只要用户点击推送通知:这样做的方式是:
if (launchOptions != nil)
{
NSDictionary *dictionary = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (dictionary != nil)
{
NSLog(@"Launched from push notification: %@", dictionary);
[self manageRemoteNotification:dictionary];
}
}
Run Code Online (Sandbox Code Playgroud)
当您通过点击推送通知启动应用程序时,launchOptions为!= nil,如果您通过点击图标来访问它,则launchOptions将为== nil.
我希望它会有用.这是Apple解释的.
需要记住的一点是,当您的推送消息到达用户的iPhone并且他们点击"取消"时,除了图标徽章编号(他们将由操作系统处理),您将无法进入 - 了解此推送活动的背景应用程序,并采取任何进一步的行动.
| 归档时间: |
|
| 查看次数: |
66555 次 |
| 最近记录: |