老铁,我今天忙了一下午就为解决这个问题,网上有一些方法,说了一堆关于这个挂到后台收到推送并且获得推送内容的问题,有很多人都说APP挂到后台一会就被杀死。但实际上可以有办法解决的。
“后台应用刷新”便是我们问题的主角,它可以有效的阻止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;
}
哦对了,完成上面还是不能拿到推送内容,因为少了一个推送里很重要的字段,而这个字段就是服务器推送内容里必须要加的内容那就是:
"content-avilable" =1 这个字段千万千万千万不能少。
如果你的服务器开发小哥哥不知道怎么传,来,我把后端的demo也粘贴给你。
以上便能实现所谓的APP挂到后台也能接受到推送内容并且语音播放的解决方法!希望能帮到你们。我之所以写这篇文章是因为,网上没有一个解决方法够详细,很多人都很迷茫(包括我)。
好了,废话不多说了,如果你觉得这篇文章轻松的解决了你的问题,麻烦点赞+关注+评论!
加QQ群:543911881 (记得备注,么么哒)点赞+关注+评论!!!最好能打赏哈哈哈~
作者:Sylars
链接:http://www.jianshu.com/p/c06133d576e4
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。