iOS,APP退到后台,获取推送成功的内容并且语音播报内容。

老铁,我今天忙了一下午就为解决这个问题,网上有一些方法,说了一堆关于这个挂到后台收到推送并且获得推送内容的问题,有很多人都说APP挂到后台一会就被杀死。但实际上可以有办法解决的。


WechatIMG3.jpeg
WechatIMG3.jpeg

“后台应用刷新”便是我们问题的主角,它可以有效的阻止APP挂在后台被杀死。关于如何实现上面的问题,还听我细细说来。
首先我不就说如何集成推送的内容,直接说如何在挂到后台获取推送内容的方法。
1.首先需要打开三个开关,第一个和最后两个。


开关
开关

如果你的需求没有语音,第一个可以关掉。无所谓的。

然后在AppDelegate里需要添加一个方法,这个方法就是APP挂到后台也不会被杀死的方法

老铁,我今天忙了一下午就为解决这个问题,网上有一些方法,说了一堆关于这个挂到后台收到推送并且获得推送内容的问题,有很多人都说APP挂到后台一会就被杀死。但实际上可以有办法解决的。

“后台应用刷新”便是我们问题的主角,它可以有效的阻止APP挂在后台被立即杀死。关于如何实现上面的问题,还听我细细说来。
首先我不就说如何集成推送的内容,直接说如何在挂到后台获取推送内容的方法。
1.首先需要打开三个开关,第一个和最后两个。


开关
开关

如果你的需求没有语音,第一个可以关掉。无所谓的。

然后在AppDelegate里需要添加一个方法,这个方法就是APP挂到后台也不会被杀死的回调方法:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(nonnull void (^)(UIBackgroundFetchResult))completionHandler {
    //回调
    NSLog(@"Received remote notification with userInfo %@", userInfo);
    
    NSString * price =[NSString stringWithFormat:@"%@",[userInfo objectForKey:@"amount"]];
  
    completionHandler(UIBackgroundFetchResultNewData);
    
    //语音播报
    
    AVSpeechUtterance *utterance = [AVSpeechUtterance speechUtteranceWithString:[NSString stringWithFormat:@"阿狸钱包提醒您:已收款%@元",price]];
    
    AVSpeechSynthesizer *synth = [[AVSpeechSynthesizer alloc] init];
    
    [synth speakUtterance:utterance];
    
}

你以为这样就完事了吗?这样肯定没声音,但是你却能拿到推送给你的数据,接下来还有几个方法。都要在AppDelegate里实现:

- (void)applicationWillTerminate:(UIApplication *)application {
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
    
    UIApplication*   app = [UIApplication sharedApplication];
    __block    UIBackgroundTaskIdentifier bgTask;
    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        dispatch_async(dispatch_get_main_queue(), ^{
            if (bgTask != UIBackgroundTaskInvalid)
            {
                bgTask = UIBackgroundTaskInvalid;
            }
        });
    }];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        dispatch_async(dispatch_get_main_queue(), ^{
            if (bgTask != UIBackgroundTaskInvalid)
            {
                bgTask = UIBackgroundTaskInvalid;
            }
        });
    });

}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{
    NSError *setCategoryErr = nil;
![Uploading WechatIMG395_980830.jpeg . . .]    NSError *activationErr  = nil;
    [[AVAudioSession sharedInstance]
     setCategory: AVAudioSessionCategoryPlayback
     error: &setCategoryErr];
    [[AVAudioSession sharedInstance]
     setActive: YES
     error: &activationErr];

    return YES;
}

哦对了,完成上面还是不能拿到推送内容,因为少了一个推送里很重要的字段,而这个字段就是服务器推送内容里必须要加的内容那就是:

WechatIMG395.jpeg
WechatIMG395.jpeg

"content-avilable" =1 这个字段千万千万千万不能少。
如果你的服务器开发小哥哥不知道怎么传,来,我把后端的demo也粘贴给你。


WechatIMG201.png
WechatIMG201.png

以上便能实现所谓的APP挂到后台也能接受到推送内容并且语音播放的解决方法!希望能帮到你们。我之所以写这篇文章是因为,网上没有一个解决方法够详细,很多人都很迷茫(包括我)。

好了,废话不多说了,如果你觉得这篇文章轻松的解决了你的问题,麻烦点赞+关注+评论!

加QQ群:543911881 (记得备注,么么哒)点赞+关注+评论!!!最好能打赏哈哈哈~



作者:Sylars
链接:http://www.jianshu.com/p/c06133d576e4
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
原文地址:https://www.cnblogs.com/feng9exe/p/7521252.html