zoukankan      html  css  js  c++  java
  • 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
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    Oracle通过透明网关连接SQL SERVER
    无法初始化链接服务器 "(null)" 的 OLE DB 访问接口 "Microsoft.Jet.OLEDB.4.0" 的数据源
    DBGrid应用
    C#学习之C#3.0语言功能
    windows 下 java 环境配置
    discuz UCenter对接遇到问题总汇
    mysql 备份之mysqldump 常用命令
    struts2与FreeMarker 简单配置实现
    hessian 简单实现
    jquery ui
  • 原文地址:https://www.cnblogs.com/feng9exe/p/7521252.html
Copyright © 2011-2022 走看看