首页 > 代码库 > phonegap ios插件开发及无限后台运行解决

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];  
NSThread *thread=[[NSThread alloc]initWithTarget:selft selector:@selector(doInBackground:)object:argumetns];//doInBackground是在新得线程中要执行的方法[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;  
#import<Foundation/Foundation.h>#import<Cordova/CDVPlugin.h>@Interface DisplayNumber:CDVPlugin-(void) setNumber:(CDVInvokeURLCommand) command;@end;

 

 

2.在config.xml中启用插件

  添加<feature name="Demo">

              <param name=‘ios-package‘  value=http://www.mamicode.com/‘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. }  
var Demo=function(){   }  Demo.prototype={  method:function(fun1,fun2,params){cordova.exec(fun1//成功时调用,fun2,‘插件名‘,‘插件的方法名‘,[params//参数数组]);}}

 

若我们想使用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  
#import <Cordova/CDVViewController.h>#import <Cordova/CDVCommandDelegateImpl.h>#import <Cordova/CDVCommandQueue.h>#import <AVFoundation/AVFoundation.h>@interface MainViewController : CDVViewController{    AVAudioPlayer *audioPlayer;}@property(nonatomic) AVAudioPlayer * audioPlayer;@end@interface MainCommandDelegate : CDVCommandDelegateImpl@end@interface MainCommandQueue : CDVCommandQueue@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. }  
- (void)viewDidLoad{    [super viewDidLoad];    // Do any additional setup after loading the view from its nib.    dispatch_queue_t dispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);    dispatch_async(dispatchQueue, ^(void) {        NSError *audioSessionError = nil;        AVAudioSession *audioSession = [AVAudioSession sharedInstance];        if ([audioSession setCategory:AVAudioSessionCategoryPlayback error:&audioSessionError]){            NSLog(@"Successfully set the audio session.");        } else {            NSLog(@"Could not set the audio session");        }                        NSBundle *mainBundle = [NSBundle mainBundle];        NSLog(@"%@",mainBundle);        NSString *filePath = [mainBundle pathForResource:@"love" ofType:@"wav"];        NSData *fileData = http://www.mamicode.com/[NSData dataWithContentsOfFile:filePath];"AA%@",filePath);        self.audioPlayer = [[AVAudioPlayer alloc] initWithData:fileData error:&error];                if (self.audioPlayer != nil){            self.audioPlayer.delegate = self;                        [self.audioPlayer setNumberOfLoops:-1];            if ([self.audioPlayer prepareToPlay] && [self.audioPlayer play]){                NSLog(@"Successfully started playing...");            } else {                NSLog(@"Failed to play.");            }        } else {            NSLog(@"Failed to play.");        }    }); }

 

说明: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. }  
-(void) applicationDidEnterBackground:(UIApplication *)application{//    [NSRunLoop currentRunLoop];//    //    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;//           }//       });//   });//    //    [[UIApplication sharedApplication] setKeepAliveTimeout:600 handler:^{//        NSLog(@"KeepAlive");//    }];    MainViewController *mvc=[[MainViewController alloc] init];    [mvc viewDidLoad];}

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

 

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

phonegap ios插件开发及无限后台运行解决