zoukankan      html  css  js  c++  java
  • phonegap ios插件开发及无限后台运行解决

    1.首先开发插件:因为我的项目前需要所以要做(根据情况)

       在项目的plugins文件中新建obj c文件。如

       Demo,此时会产生出Demo.h和Demo.m两个文件。

       .h文件主要就是定义一些方法,类似java中的接口.(要继承CDVPlugin)

       .m文件是对h文件夹的实现,在插件执行时会进入相应的函数,切记:此函数要易执行长时的内容,此时uithread处于阻塞状态。不用我们可以启动一个线程在函数中,启动线的的的函数如下:

    Java代码  收藏代码
    1. NSThread *thread=[[NSThread alloc]initWithTarget:selft selector:@selector(doInBackground:)object:argumetns];  
    2. //doInBackground是在新得线程中要执行的方法  
    3. [thread start];  

    我这里简单很一些code:

    Java代码  收藏代码
    1. #import<Foundation/Foundation.h>  
    2. #import<Cordova/CDVPlugin.h>  
    3. @Interface DisplayNumber:CDVPlugin  
    4. -(void) setNumber:(CDVInvokeURLCommand) command;  
    5. @end;  

    2.在config.xml中启用插件

      添加<feature name="Demo">

                  <param name='ios-package'  value='Demo'/>

            </feature>

     这里说明一下:value值是我们前面定义的类名,面feature中的name指得是我们前面再写js时,要调用的插件的名子,如果不明白,写个写成同一个名也行。(我就是这样做的)

    3 编辑写插件js

      

    Java代码  收藏代码
    1. var Demo=function(){  
    2.    
    3.   }  
    4.   Demo.prototype={  
    5.   method:function(fun1,fun2,params){cordova.exec(fun1//成功时调用,fun2,'插件名','插件的方法名',[params//参数数组]);  
    6. }  
    7. }  

    若我们想使用Demo插件,简单的可以写成new Demo().method(fun1,fun2,params);//很简单

    说明一下:我们也可以在插件的js里的new Demo()给一个变量,我们再调用时就不用再new 一个。

    关于后台无限运行的解决(网上也有很多解决方案)

    1. Info.plist文件中新增:Required Background modes (是一个数组形式的建值),在item0后的value设置成为 App plays audio or streams audio/video using AirPlay。

    2.在Classes文件夹下找到MainViewController.h,

    Java代码  收藏代码
    1. #import <Cordova/CDVViewController.h>  
    2. #import <Cordova/CDVCommandDelegateImpl.h>  
    3. #import <Cordova/CDVCommandQueue.h>  
    4. #import <AVFoundation/AVFoundation.h>  
    5.   
    6. @interface MainViewController : CDVViewController{  
    7.     AVAudioPlayer *audioPlayer;  
    8. }  
    9. @property(nonatomic) AVAudioPlayer * audioPlayer;  
    10. @end  
    11.   
    12. @interface MainCommandDelegate : CDVCommandDelegateImpl  
    13. @end  
    14.   
    15. @interface MainCommandQueue : CDVCommandQueue  
    16. @end  

     接着修改MainViewController.m文件,找到viewDidLoad方法,修改为:

    Java代码  收藏代码
    1. - (void)viewDidLoad  
    2. {  
    3.     [super viewDidLoad];  
    4.     // Do any additional setup after loading the view from its nib.  
    5.     dispatch_queue_t dispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);  
    6.     dispatch_async(dispatchQueue, ^(void) {  
    7.         NSError *audioSessionError = nil;  
    8.         AVAudioSession *audioSession = [AVAudioSession sharedInstance];  
    9.         if ([audioSession setCategory:AVAudioSessionCategoryPlayback error:&audioSessionError]){  
    10.             NSLog(@"Successfully set the audio session.");  
    11.         } else {  
    12.             NSLog(@"Could not set the audio session");  
    13.         }  
    14.           
    15.           
    16.         NSBundle *mainBundle = [NSBundle mainBundle];  
    17.         NSLog(@"%@",mainBundle);  
    18.         NSString *filePath = [mainBundle pathForResource:@"love" ofType:@"wav"];  
    19.         NSData *fileData = [NSData dataWithContentsOfFile:filePath];  
    20.         NSError *error = nil;  
    21.         NSLog(@"AA%@",filePath);  
    22.         self.audioPlayer = [[AVAudioPlayer alloc] initWithData:fileData error:&error];  
    23.           
    24.         if (self.audioPlayer != nil){  
    25.             self.audioPlayer.delegate = self;  
    26.               
    27.             [self.audioPlayer setNumberOfLoops:-1];  
    28.             if ([self.audioPlayer prepareToPlay] && [self.audioPlayer play]){  
    29.                 NSLog(@"Successfully started playing...");  
    30.             } else {  
    31.                 NSLog(@"Failed to play.");  
    32.             }  
    33.         } else {  
    34.             NSLog(@"Failed to play.");  
    35.         }  
    36.     });  
    37.    
    38. }  

    说明:love.wav文件是other Sources下的文件。

    接着修改AppDelegate.m文件,新增方法:

    Java代码  收藏代码
    1. -(void) applicationDidEnterBackground:(UIApplication *)application{  
    2. //    [NSRunLoop currentRunLoop];  
    3. //      
    4. //    UIApplication *app=[UIApplication sharedApplication];  
    5. //    __block UIBackgroundTaskIdentifier bgTask;  
    6. //    bgTask=[app beginBackgroundTaskWithExpirationHandler:^{  
    7. //        dispatch_async(dispatch_get_main_queue(), ^{  
    8. //            if(bgTask!=UIBackgroundTaskInvalid){  
    9. //                bgTask=UIBackgroundTaskInvalid;  
    10. //            }  
    11. //        });  
    12. //    }];  
    13. //     
    14. //   dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
    15. //       dispatch_async(dispatch_get_main_queue(), ^{  
    16. //           if(bgTask!=UIBackgroundTaskInvalid){  
    17. //               bgTask=UIBackgroundTaskInvalid;  
    18. //           }  
    19. //       });  
    20. //   });  
    21. //      
    22. //    [[UIApplication sharedApplication] setKeepAliveTimeout:600 handler:^{  
    23. //        NSLog(@"KeepAlive");  
    24. //    }];  
    25.     MainViewController *mvc=[[MainViewController alloc] init];  
    26.     [mvc viewDidLoad];  
    27.   
    28. }  

     网上也有很多,发现在模拟器下可以长时间运行,但在真实机下并不能运行。发现还是长时间播放一个无声的音频文件好一点.

     -------------------如果有什么不好的地方,请指教。

  • 相关阅读:
    (五)SpringCloud学习系列-构建部门微服务消费者Module
    (四)SpringCloud学习系列-构建部门微服务提供者Module
    (三)SpringCloud学习系列-Rest微服务构建
    git提交 显示作者名不是自己
    linux一些常见命令
    支付宝退款demo
    ffmpeg截取视频
    excel导入数据到mysql
    二分法与冒泡排序
    mysql的级联删除
  • 原文地址:https://www.cnblogs.com/lovewx/p/3968287.html
Copyright © 2011-2022 走看看