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=‘Demo‘/>

</feature>

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

3 编辑写插件js

Java代码  

  1. var Demo=function(){
  2. }
  3. Demo.prototype={
  4. method:function(fun1,fun2,params){cordova.exec(fun1//成功时调用,fun2,‘插件名‘,‘插件的方法名‘,[params//参数数组]);
  5. }
  6. }
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. @interface MainViewController : CDVViewController{
  6. AVAudioPlayer *audioPlayer;
  7. }
  8. @property(nonatomic) AVAudioPlayer * audioPlayer;
  9. @end
  10. @interface MainCommandDelegate : CDVCommandDelegateImpl
  11. @end
  12. @interface MainCommandQueue : CDVCommandQueue
  13. @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. NSBundle *mainBundle = [NSBundle mainBundle];
  15. NSLog(@"%@",mainBundle);
  16. NSString *filePath = [mainBundle pathForResource:@"love" ofType:@"wav"];
  17. NSData *fileData = [NSData dataWithContentsOfFile:filePath];
  18. NSError *error = nil;
  19. NSLog(@"AA%@",filePath);
  20. self.audioPlayer = [[AVAudioPlayer alloc] initWithData:fileData error:&error];
  21. if (self.audioPlayer != nil){
  22. self.audioPlayer.delegate = self;
  23. [self.audioPlayer setNumberOfLoops:-1];
  24. if ([self.audioPlayer prepareToPlay] && [self.audioPlayer play]){
  25. NSLog(@"Successfully started playing...");
  26. } else {
  27. NSLog(@"Failed to play.");
  28. }
  29. } else {
  30. NSLog(@"Failed to play.");
  31. }
  32. });
  33. }
- (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 = [NSData dataWithContentsOfFile:filePath];
        NSError *error = nil;
        NSLog(@"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. }
-(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];

}

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

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

时间: 2024-10-04 02:23:48

phonegap ios插件开发及无限后台运行解决的相关文章

《转载》IOS高级开发~开机启动&amp;无限后台运行&amp;监听进程

非越狱情况下实现: 开机启动:App安装到IOS设备设备之后,无论App是否开启过,只要IOS设备重启,App就会随之启动: 无限后台运行:应用进入后台状态,可以无限后台运行,不被系统kill: 监听进程:可获IOS设备运行除系统外的App(包括正在运行和后台运行): 配置项目 plist文件 添加: <key>UIBackgroundModes</key> <array> <string>voip</string> </array>

IOS高级开发~开机启动&amp;无限后台运行&amp;监听进程

一般来说, IOS很少给App后台运行的权限. 仅有的方式就是 VoIP. IOS少有的为VoIP应用提供了后台socket连接,定期唤醒并且随开机启动的权限.而这些就是IOS上实现VoIP App的关键. 苹果官方文档对于的描述就短短的一页(点击这里),很多细节没有提及. 这篇微博通过具体实现和查阅资料,补充了这些细节.并且列举出了在实现过程中可能遇到的问题, 作为参考. 博客: http://www.cnblogs.com/jhzhu 邮箱: [email protected] 作者: 知明

原创翻译:iOS 应用程序 蓝牙后台运行

默认情况下,普通的CoreBluetooth 任务中的大多数,无论是Central还是peripheral ,在后台或者挂起状况下都是无法进行的.也就是说,你可以通过宣布你的应用程序支持后台处理模式来允许你的一个应用程序把你从一个挂起状态中唤醒来执行某些蓝牙相关的事件. 即使你的应用程序支持一种或者两种CoreBluetooth后台执行模式,那么他也不会永远运行.在某些时候,系统也许由于当前的前台应用程序而终止你的应用程序来释放内存,这将会导致任何活跃的或者挂起的连接会丢失.在iOS7中,Cor

iOS开发之如何后台运行程序

首先判断是否支持多线程 UIDevice *device = [UIDevice currentDevice]; BOOL backgroundSupported = NO; if ([device respondsToSelector:@selector(isMultitaskSupported)]) { backgroundSupported = device.mulltitaskingSupported; } 声明你需要的后台任务Info.plist中添加UIBackgroundModes

iOS 项目一直在后台运行

我后来是这么解决不知道行不行,可以长期的在后台运行 首先我在xx-info.plist 里的 "Required background modes" 里加入"App provides Voice over IP services" 然后在delegate里加入以下代码,原理是进入后台时程序会在600秒那样结束任务,我做的就是在结束任务前新开一个任务,再结束旧任务,这样就一直的在后台运行,希望可能帮助到更多的人,我也查了很久才找到这个方法的. UIBackground

iOS保持App真后台运行

https://www.jianshu.com/p/d466f2da0d33 在我看来,苹果系统与安卓系统最直观的区别就是后台处理方式了吧,安卓手机一旦开启了很多app放到后台,即使前台什么也不做,就是切换一下系统界面都会觉得卡;苹果手机不论开多少app在后台都感觉很流畅. 这是因为安卓默认处理app为真后台,可以一直在后台处理操作; 而iOS为了让设备尽量省电,减少不必要的开销,保持系统流畅,因而对后台机制采用墓碑式的“假后台”.除了系统官方极少数程序可以真后台,一般开发者开发出来的应用程序后

iOS保持长时间后台运行

最近做一个项目,需要让app在后台长时间运行,鉴于此项目是属于音乐类的,曾经也有听过别人说可以在app进入后台后向系统申请一个Background Task, 但是这个Task只能让app保持180s的运行时间,app就会进入休眠状态.但是可以在此Task结束时持续播放一段静默音乐,使得app一直处于‘前台’. 要播放音乐,记得勾选以下: 上代码吧(最下面有demo下载): 环境:Xcode6.1.1 & iOS SDK 8.1 demo下载地址

IOS 后台运行申请更多的时间

当应用程序进入后台时,系统会自动回调应用程序委托的applicationDidEnterBackground:方法. 应用可以在该方法中完成转入后台前需要做的准备工作,所有的应用需要做以下事情. 释放所有可以释放的内存. 保存用户数据或状态信息,所有没写入磁盘的文件或信息,在进入后台之前,都应该写入磁盘,因为程序可能在后台被杀死. 进入后台时释放内存 当程序进入后台之后,为了确保获得最佳的用户体验,建议释放那些占用内存较大且可以重新获取的资源—- 这是因为当应用处于后台时,iOS系统会优先终止那

关于这几天使用IOS的AsyncSocket完成无限后台的过程

这几天用了下ASyncSocket完成前后台即时通讯,当时有想过用消息推送的技术实现的,可是后来想到消息推送的不可靠性还是算了.于是使用了tcp/ip实现后台主动发送数据给前台的功能. 最开始设计后台的时候,我有考虑到数据量比较大的问题,所以数据大的时候我会使用分包和组包的功能去实现.TCP/IP在传输数据的时候,一般不会大于1500字节,所以我每512字节分了 一个包.然后当一次性数据包接收太多的时候,就出现了粘包的问题.因为我在数据传输的时候使用的是json,每一个分包都是由{}括起来的,所