phonegap ios插件开发及无限后台运行解决
1.首先开发插件:因为我的项目前需要所以要做(根据情况)
在项目的plugins文件中新建obj c文件。如
Demo,此时会产生出Demo.h和Demo.m两个文件。
.h文件主要就是定义一些方法,类似java中的接口.(要继承CDVPlugin)
.m文件是对h文件夹的实现,在插件执行时会进入相应的函数,切记:此函数要易执行长时的内容,此时uithread处于阻塞状态。不用我们可以启动一个线程在函数中,启动线的的的函数如下:
- NSThread *thread=[[NSThread alloc]initWithTarget:selft selector:@selector(doInBackground:)object:argumetns];
- //doInBackground是在新得线程中要执行的方法
- [thread start];
NSThread *thread=[[NSThread alloc]initWithTarget:selft selector:@selector(doInBackground:)object:argumetns];
//doInBackground是在新得线程中要执行的方法
[thread start];
我这里简单很一些code:
- #import<Foundation/Foundation.h>
- #import<Cordova/CDVPlugin.h>
- @Interface DisplayNumber:CDVPlugin
- -(void) setNumber:(CDVInvokeURLCommand) command;
- @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
- var Demo=function(){
- }
- Demo.prototype={
- method:function(fun1,fun2,params){cordova.exec(fun1//成功时调用,fun2,'插件名','插件的方法名',[params//参数数组]);
- }
- }
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,
- #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
#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方法,修改为:
- - (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.");
- }
- });
- }
- (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文件,新增方法:
- -(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];
- }
-(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插件开发及无限后台运行解决的更多相关文章
- IOS高级开发~开机启动&无限后台运行&监听进程
一般来说, IOS很少给App后台运行的权限. 仅有的方式就是 VoIP. IOS少有的为VoIP应用提供了后台socket连接,定期唤醒并且随开机启动的权限.而这些就是IOS上实现VoIP App的 ...
- IOS开发~开机启动&无限后台运行&监听进程
非越狱情况下实现: 开机启动:App安装到IOS设备设备之后,无论App是否开启过,只要IOS设备重启,App就会随之启动: 无限后台运行:应用进入后台状态,可以无限后台运行,不被系统kill: 监听 ...
- 原创翻译:iOS 应用程序 蓝牙后台运行
默认情况下,普通的CoreBluetooth 任务中的大多数,无论是Central还是peripheral ,在后台或者挂起状况下都是无法进行的.也就是说,你可以通过宣布你的应用程序支持后台处理模式来 ...
- iOS保持App真后台运行
https://www.jianshu.com/p/d466f2da0d33 在我看来,苹果系统与安卓系统最直观的区别就是后台处理方式了吧,安卓手机一旦开启了很多app放到后台,即使前台什么也不做,就 ...
- IOS开发使用GCD后台运行
什么是GCD Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法.该方法在Mac OS X 10.6雪豹中首次推出,并随后被引入到了iOS4.0中.GCD ...
- Delphi IOS 蓝牙锁屏后台运行
Delphi IOS 后台运行 同样的程序,编译成android,锁屏后继续运行正常,蓝牙通讯正常,但在IOS下锁屏后程序的蓝牙就中断通讯了? IOS的机制就是这样,锁屏就关闭了. 音乐播放器是怎么做 ...
- MongoDB服务重启及后台运行解决方法
1 在MongoDB 安装目录下 新建一个test文件夹 mkdir /test 2 切换到MongoDB的安装目录(可通过 find -name 'mongod'命令查找安装目录)下 执行: bin ...
- ios GCD简单介绍 后台运行~
本从实践出发简单说明: 首先,gcd是Grand Central Dispatch的缩写,意为多线程优化技术,是苹果为多核处理优化的技术.使用简单.清晰. 多线程就分同步.异步方法如下: //异步线程 ...
- iOS无限后台加速耗电的问题
背景 总所周知,iPhone的电池容量本身比较小.所以iOS系统本身为了弥补这一短板做出了一个重大的优化 —— 『伪后台』. 这一机制是在iPhone在续航上发挥重大的作用,但是也因为『伪后台』限制了 ...
随机推荐
- sql语句大全~·留着有用
一.基础 1.说明:创建数据库CREATE DATABASE database-name 2.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备 ...
- 剑指Offer30 从1到n整数出现1的个数
/************************************************************************* > File Name: 30_NumerO ...
- 一个Itextsharp 批量添加图片到pdf 方法
这里我就直接把我的页面贴进来了 using System; using System.Collections.Generic; using System.Web; using System.Web.U ...
- WPF 多语言 多资源 多皮肤 处理方案
同时兼容这么多需求的解决方案 我想到的 只有通过 动态切换加载资源字典 前端用绑定的模式 达到托管最大化 多语言举例 我编辑了 两个 语言包 一个中文 一个英文 (语言包这个最好用T4 写个模板, ...
- 浅谈实现placeholder效果的几种方案
placeholder是html5<input>的一个属性,它提供可描述输入字段预期值的提示信息(hint), 该提示会在输入字段为空时显示.高端浏览器支持此属性(ie10/11在获得焦点 ...
- 如何提高手机APP的用户体验?
详细内容请点击 随着移动互联网如日中天,如火如荼的时候,手机APP开发日益高涨了起来,关于手机APP的用户体验,也是一个老话长谈的话题.从事这行业也很久了,以下是我个人在工作中的一些关于APP的用户体 ...
- .NET DLL 保护措施详解(四)各操作系统运行情况
我准备了WEB应用程序及WinForm应用程序,分别在WIN SERVER 2012/2008/2003.Win7/10上实测,以下为实测结果截图: 2012 2008 2003 WIN7 WIN10 ...
- 慎用memset();
<span style="font-family: Arial, Helvetica, sans-serif;">void *(memset) (void *s,int ...
- iOS UIView常用方法和属性
UIView常用方法 addSubView: // 添加子视图 insertSubview: atIndex // 视图插入到指定索引位置 insertSubview:aboveSubview: // ...
- Part 36 to 39 Talking about Delegates in c#
Part 36 Delegates in c# Part 37 Delegates usage in c# class Progim { public static void Main() { Lis ...