`
zhaole609
  • 浏览: 338094 次
  • 性别: Icon_minigender_1
  • 来自: 河南
社区版块
存档分类
最新评论

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];

 

我这里简单很一些code:

#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//参数数组]);
}
}

 

若我们想使用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

 

 接着修改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.");
        }
    });
 
}

 

说明: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];

}

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

 

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

分享到:
评论

相关推荐

    android phonegap震动,声音,Dialog

    2 进入到phonegap工程下的plugins 文件夹当中 ,使用命令行下载官方插件 ;(输入命令: cordova plugin add org.apache.cordova.vibration) 4 添加生成 android或者IOS 工程 ;android命令如下cordova platform add ...

    cordova-plugin-background-task:适用于Apache Cordova的Cordova PhoneGap后台任务插件> = 3.0.0

    Apache Cordova的后台任务插件允许您在应用程序处于活动状态时以及暂停应用程序后3分钟运行JavaScript。安装 cordova plugin add https://github.com/leecrossley/cordova-plugin-background-task.git你不需要引用...

    cordova-plugin-background:科尔多瓦插件背景

    Cordova 后台插件 插件可防止应用程序在后台进入睡眠状态。 大多数移动操作系统都具有多任务处理能力,但大多数应用程序不需要在后台运行并且不呈现给用户。 因此,他们在后台模式下暂停应用程序并在切换到前台模式...

    phonegap-local-notification-copied:原来的本地通知插件无法安装(任何版本),所以我上传了我以前用过的

    在 iOS 允许的有限时间内在后台运行的应用程序也可能会发现本地通知很有用。 例如,依赖服务器获取消息或数据的应用程序可以在后台运行时轮询其服务器以获取传入项目; 如果消息已准备好查看或更新已准备好下载,则...

    plugin.background-mode:plugin.background-mode

    Cordova 后台插件 插件可防止应用程序在后台进入睡眠状态。 大多数移动操作系统都具有多任务处理能力,但大多数应用程序不需要在后台运行并且不呈现给用户。 因此,他们在后台模式下暂停应用程序并在切换到前台模式...

    cordova-ble:Cordova的蓝牙低功耗插件

    扫描BLE设备(iOS和Android上支持后台扫描) 建立联系 列出服务,特征和描述符 读取和写入特征值和描述符的值 请求通知特征值的更改 轮询设备的RSSI(信号强度)(仅适用于Android和iOS) 对Android上的外设模式...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    IOS 由苹果公司开发的移动操作系统 Webkit 一个开源的浏览器引擎,在手机上的应用十分广泛 Webview WebView(网络视图)能加载显示网页,可以将其视为一个浏览器。它使用了WebKit渲染引擎加载显示网页 Activity ...

    cordova-plugin-advanced-http

    安装该插件符合Cordova插件规范,可以使用Cordova / Phonegap命令行界面进行安装。 phonegap plugin add cordova-plugin-advanced-httpcordova plugin add cordova-plugin-advanced-http用法平原科尔多瓦该插件注册...

    cordova-plugin-progressview:Cordova + PhoneGap扩展,用于显示本地确定进度对话框

    Cordova Progress View插件======================= Cordova + PhoneGap扩展,用于显示本地确定进度对话框。 =======================内容=======================描述小插件,用于显示本机进度对话框。 同步操作...

    mandy_ipadvocabtest

    LSCP iDevXXI应用 该应用程序旨在执行有关婴儿语言学习的实验。...使用的Phonegap插件 如果使用Phonegap Build,则无需手动安装它们。 本地开发设置 克隆存储库(请参阅CONTRIBUTE.md中的说明) 安

    cordova-ble

    扫描BLE设备(iOS和Android支持后台扫描) 建立联系 列出服务,特征和描述符 读取和写入特征值和描述符的值 请求通知特征值的更改 轮询设备的RSSI(信号强度)(仅适用于Android和iOS) 对Android上的外设模式的...

Global site tag (gtag.js) - Google Analytics