Xcode 在应用程序处于后台时接收Apple推送通知

Xcode 在应用程序处于后台时接收Apple推送通知,xcode,ios8,push-notification,apple-push-notifications,Xcode,Ios8,Push Notification,Apple Push Notifications,我在iOS8应用程序中实现了推送通知。我正在尝试在收到通知后播放音频文件 当应用程序位于前台时,代码会播放音频,但当应用程序位于后台时,不会发生任何事情 我已尝试重新生成证书和配置文件。我已经确保应用程序在后台运行,也就是说,用户没有刷上去删除它。在后台模式下,我启用了远程通知、后台提取以及音频和播放 我已从我的AppDelegate.m文件中添加了代码段: - (BOOL)application:(UIApplication *)application didFinishLaunchingWi

我在iOS8应用程序中实现了推送通知。我正在尝试在收到通知后播放音频文件

当应用程序位于前台时,代码会播放音频,但当应用程序位于后台时,不会发生任何事情

我已尝试重新生成证书和配置文件。我已经确保应用程序在后台运行,也就是说,用户没有刷上去删除它。在后台模式下,我启用了远程通知、后台提取以及音频和播放

我已从我的
AppDelegate.m
文件中添加了代码段:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

// More code here ---------------------------------------------------
if (launchOptions) {
    NSDictionary *userInfo = [launchOptions valueForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
    NSDictionary *apsInfo = [userInfo objectForKey:@"aps"];

    if (apsInfo) { //apsInfo is not nil
        [self performSelector:@selector(playCarAlarmAudio)
                   withObject:nil
                   afterDelay:1];
    }

}

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) {
    [[UIApplication sharedApplication] registerForRemoteNotifications];
    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge
                                                                                         |UIUserNotificationTypeSound
                                                                                         |UIUserNotificationTypeAlert) categories:nil];

    [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
}
// More code here ---------------------------------------------------
}
处理推送通知的委托方法:

-(void) application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
NSLog(@"Failed to register for push");
}

-(void) application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
}

-(void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
    [self respondToEventNotification:userInfo];
}

-(void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {

//    [self respondToEventNotification:userInfo];
    [self playAlarmAudio];

}

-(void) respondToEventNotification : (NSDictionary *) userInfo {
if ([[UIApplication sharedApplication] applicationState] == UIApplicationStateBackground) {
                UILocalNotification *localNotification = [[UILocalNotification alloc] init];
                [localNotification setSoundName:@"alarm.mp3"];
                [localNotification setFireDate:[NSDate date]];
                [[UIApplication sharedApplication] scheduleLocalNotification:localNotification];

            }
            else if ([[UIApplication sharedApplication] applicationState] == UIApplicationStateActive) {
                [self playAlarmAudio];
            }
}
和播放警报:

-(void) playAlarmAudio {
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"alarm" ofType:@"mp3"];
    NSURL *fileUrl = [NSURL fileURLWithPath:filePath];
    self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileUrl error:nil];
    self.audioPlayer.numberOfLoops = 1;
    [self.audioPlayer play];
}

根据以下Apple文档,要播放的通知声音在通知负载字典()中指定:

通知有效负载

每个远程通知都包括一个有效负载。有效负载包含有关系统应如何向用户发出警报的信息以及您提供的任何自定义数据。在iOS 8及更高版本中,通知有效负载允许的最大大小为2 KB;苹果推送通知服务拒绝任何超过此限制的通知。(在iOS 8之前和OS X中,最大有效负载大小为256字节。)

对于每个通知,编写一个JSON字典对象(由RFC4627定义)。此词典必须包含由密钥aps标识的另一个词典。aps字典可以包含指定以下用户通知类型的一个或多个属性:

  • 要向用户显示的警报消息
  • 用于标记应用程序图标的数字
  • 演奏的声音

当我使用沙盒SSL证书时,应用程序似乎工作正常。这是为什么?当应用程序位于前台时,它可以响应通知并播放声音,但当它位于后台时,它将一直位于后台,直到用户选择通知激活应用程序。在此之前,该应用程序只能做后台工作,如下载数据等。但是,除非你的应用程序是音频或音乐播放器应用程序,否则不可能允许它在后台播放声音。当我使用苹果的沙盒SSL证书(用于开发)时,即使应用程序在后台,我也可以使用相同的代码。只有当我从沙箱切换到生产SSL时,才会出现此问题