我无法使用 CDVPlugin 从 phonegap 2.7.0 中的 javascript 访问本机 iOS?

Posted

技术标签:

【中文标题】我无法使用 CDVPlugin 从 phonegap 2.7.0 中的 javascript 访问本机 iOS?【英文标题】:I can't access native iOS from javascript in phonegap 2.7.0 using CDVPlugin? 【发布时间】:2013-09-13 03:23:00 【问题描述】:

我在 xcode 4.5.2 中为 ios 6 做 phonegap 2.7.0 web 应用程序。在我的 web 应用程序中包含持续时间为 6 秒的视频录制选项。所以我从“https://github.com/piemonte/PBJVision”完成了这个过程。

现在我正在尝试使用 CDVPlugin 将原生 iOS 与 Phonegap 混合。因为我在 homescreen.html 中有一个图像(相机图标),所以当我单击图像时,图像标记 onclick() 会触发并调用 PBJViewController.m 文件中的 -(void) _setup() 方法。所以 mainscreen.html 是隐藏和显示带有一些自定义设计的相机选项。

所以,我将 PBJViewController.h & PBJViewController.m、PBJStrobeView.h & PBJStrobeView.m、PBJVisionUtilities.h & PBJVisionUtilities.m 以及最后一个 PBJVision.h & PBJVison.m 文件放在 plugins 文件夹中。

然后我创建一个 javascript 文件并命名为 PBJViewController.js 并添加到 www 文件夹中。

PBJViewController.js

function PBJViewController()





loadingalert.prototype._setup = function()

    //this.resultCallback(res);
    cordova.exec("PBJViewController._setup");



cordova.addConstructor(function() 

                       if(!window.plugins)
                       
                       window.plugins = ;
                       
                       //window.plugins.loadingalert = new PBJViewController();
                       window.loadingalert = new PBJViewController();
                       );

然后我在 homescreen.html 文件的函数 video() 中编写了调用代码。

homescreen.html

  function video()
  
       alert("video function");

      $('#loader').hide();
      $('#divcontroller').hide();
      $('#menuid').hide();
      $('#home_feeds').hide();

      loadingalert._setup();
      //window.plugins.loadingalert._setup();



      //objloading._setup();
      //window.location = "js-call:myObjectiveCFunction";
  //window.location.href='video.html?user_id='+userid+'&fb_token='+getValue("fb_token");
  

我在 PBJViewController.h 文件中做了一些更改

PBJViewController.h

   #import <UIKit/UIKit.h>
#import <Cordova/CDVPlugin.h>

@interface PBJViewController : CDVPlugin <UIWebViewDelegate>

     IBOutlet UIWebView *webView;



-(void)_setup:(NSMutableArray*)paramArray withDict:(NSMutableDictionary*)options;

@end

在 PBJViewcontroller.m 文件中

    #import "PBJViewController.h"
#import "PBJVision.h"
#import "PBJStrobeView.h"
#import <Cordova/CDVPlugin.h>
#import <AssetsLibrary/AssetsLibrary.h>
#import <MediaPlayer/MediaPlayer.h>

@interface UIButton (ExtendedHit)

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;

@end

@implementation UIButton (ExtendedHit)

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event

    CGRect relativeFrame = self.bounds;
    UIEdgeInsets hitTestEdgeInsets = UIEdgeInsetsMake(-35, -35, -35, -35);
    CGRect hitFrame = UIEdgeInsetsInsetRect(relativeFrame, hitTestEdgeInsets);
    return CGRectContainsPoint(hitFrame, point);


@end

@interface PBJViewController () <
    UIGestureRecognizerDelegate,
    PBJVisionDelegate,
    UIAlertViewDelegate>

    UIView *view;
    PBJStrobeView *_strobeView;
    UIButton *_doneButton;
    UIButton *_flipButton;

    UIView *_previewView;
    AVCaptureVideoPreviewLayer *_previewLayer;
    MPMoviePlayerViewController *playerController;
    MPMoviePlayerController *moviePlayer;
    UILabel *_instructionLabel;
    UILabel *ticker;
    NSTimer *timer;
    //NSDate *startDate;
    NSTimeInterval startDate;
    int hours, minutes, seconds;
    int secondsLeft;
    int counter;
    int timeRemaining;
    int i;
    NSTimeInterval elapsedTime;


    UILongPressGestureRecognizer *_longPressGestureRecognizer;
    BOOL _recording;
    BOOL running;

    ALAssetsLibrary *_assetLibrary;
    __block NSDictionary *_currentVideo;


    //NSTimeInterval coding..

    int currMinute;
    int currSecond;
    int currHour;
    int mins;
    NSTimeInterval secondsAlreadyRun;
    NSTimeInterval startTime;
    NSDate *startDate1;



//@property (nonatomic, retain) IBOutlet UIView *containerView;
@property (strong, nonatomic) MPMoviePlayerController *moviePlayerController;
@property (nonatomic, strong) NSString *videoPath;

@end

@implementation PBJViewController

//@synthesize containerView;
@synthesize moviePlayerController;
@synthesize videoPath;

#pragma mark - init


/*- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

    //counter = 0;
    //ticker.text = [NSString stringWithFormat:@"%d", counter];

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) 
        _assetLibrary = [[ALAssetsLibrary alloc] init];
        //[self _setup];
    
    return self;
*/

- (CDVPlugin *)initWithWebView:(UIWebView *)theWebView

    self = (PBJViewController *)[super initWithWebView:theWebView];

    if (self) 
        _assetLibrary = [[ALAssetsLibrary alloc] init];
    

    return self;



/*-(void) viewDidLoad

    webView = [[UIWebView alloc] init];
    // Register the UIWebViewDelegate in order to shouldStartLoadWithRequest to be called (next function)
    webView.delegate = self;

*/


- (void)dealloc

    [UIApplication sharedApplication].idleTimerDisabled = NO;
    _longPressGestureRecognizer.delegate = nil;

    [super dealloc];


//- (void)_setup
-(void)_setup:(NSMutableArray*)paramArray withDict:(NSMutableDictionary*)options;

    NSLog(@"Yes inheriting from homescreen btn click");
    running = false;
    secondsLeft = 67;
    view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 420)];
    view.backgroundColor = [UIColor blackColor];
    view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

    CGFloat viewWidth = CGRectGetWidth(view.frame);

    // done button
    _doneButton = [UIButton buttonWithType:UIButtonTypeCustom];
    _doneButton.frame = CGRectMake(viewWidth - 20.0f - 20.0f, 20.0f, 20.0f, 20.0f);

    UIImage *buttonImage = [UIImage imageNamed:@"capture_yep"];
    [_doneButton setImage:buttonImage forState:UIControlStateNormal];

    [_doneButton addTarget:self action:@selector(_handleDoneButton:) forControlEvents:UIControlEventTouchUpInside];
    [view addSubview:_doneButton];

    // elapsed time and red dot
    _strobeView = [[PBJStrobeView alloc] initWithFrame:CGRectZero];
    CGRect strobeFrame = _strobeView.frame;
    strobeFrame.origin = CGPointMake(15.0f, 15.0f);
    _strobeView.frame = strobeFrame;
    [view addSubview:_strobeView];

    // preview
    _previewView = [[UIView alloc] initWithFrame:CGRectZero];
    _previewView.backgroundColor = [UIColor blackColor];
    CGRect previewFrame = CGRectZero;
    previewFrame.origin = CGPointMake(0, 60.0f);
    CGFloat previewWidth = view.frame.size.width;
    previewFrame.size = CGSizeMake(previewWidth, previewWidth);
    _previewView.frame = previewFrame;

    // add AV layer
    _previewLayer = [[PBJVision sharedInstance] previewLayer];
    CGRect previewBounds = _previewView.layer.bounds;
    _previewLayer.bounds = previewBounds;
    _previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
    _previewLayer.position = CGPointMake(CGRectGetMidX(previewBounds), CGRectGetMidY(previewBounds));
    [_previewView.layer addSublayer:_previewLayer];
    [view addSubview:_previewView];

    // instruction label
    _instructionLabel = [[UILabel alloc] initWithFrame:view.bounds];
    _instructionLabel.textAlignment = NSTextAlignmentCenter;
    _instructionLabel.font = [UIFont fontWithName:@"HelveticaNeue" size:15.0f];
    _instructionLabel.textColor = [UIColor whiteColor];
    _instructionLabel.backgroundColor = [UIColor blackColor];
    _instructionLabel.text = NSLocalizedString(@"Touch and hold to record", @"Instruction message for capturing video.");
    [_instructionLabel sizeToFit];
    CGPoint labelCenter = _previewView.center;
    labelCenter.y += ((CGRectGetHeight(_previewView.frame) * 0.5f) + 35.0f);
    _instructionLabel.center = labelCenter;
    [view addSubview:_instructionLabel];

    ticker = [[UILabel alloc] initWithFrame:CGRectMake(230, 100, 80, 20)];
    ticker.textAlignment = NSTextAlignmentLeft;
    ticker.font = [UIFont fontWithName:@"HelveticaNeue" size:15.0f];
    ticker.textColor = [UIColor whiteColor];
    ticker.backgroundColor = [UIColor blackColor];
    ticker.text = @"00:00:00";
    [_previewView addSubview:ticker];


    // press to record gesture
    _longPressGestureRecognizer = [[UILongPressGestureRecognizer alloc] init];
    _longPressGestureRecognizer.delegate = self;
    _longPressGestureRecognizer.minimumPressDuration = 0.0f;
    _longPressGestureRecognizer.allowableMovement = 10.0f;
    [_longPressGestureRecognizer addTarget:self action:@selector(_handleLongPressGestureRecognizer:)];

    // gesture view to record
    UIView *gestureView = [[UIView alloc] initWithFrame:CGRectZero];
    CGRect gestureFrame = view.bounds;
    gestureFrame.origin = CGPointMake(0, 60.0f);
    gestureFrame.size.height -= 10.0f;
    gestureView.frame = gestureFrame;
    [view addSubview:gestureView];
    [gestureView addGestureRecognizer:_longPressGestureRecognizer];

    // flip button
    _flipButton = [UIButton buttonWithType:UIButtonTypeCustom];

    UIImage *flipImage = [UIImage imageNamed:@"capture_flip"];
    [_flipButton setImage:flipImage forState:UIControlStateNormal];

    CGRect flipFrame = _flipButton.frame;
    flipFrame.size = CGSizeMake(25.0f, 20.0f);
    flipFrame.origin = CGPointMake(10.0f, CGRectGetHeight(view.bounds) - 10.0f);
    _flipButton.frame = flipFrame;

    [_flipButton addTarget:self action:@selector(_handleFlipButton:) forControlEvents:UIControlEventTouchUpInside];
    [view addSubview:_flipButton];


#pragma mark - view lifecycle



- (void)viewWillAppear:(BOOL)animated


    [super viewWillAppear:animated];
    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];

    [self _resetCapture];
    [[PBJVision sharedInstance] startPreview];

这里我遇到警告消息“CDVPlugin”可能无法响应“viewWillAppear:”因为我替换了 UIViewController 的 CDVPlugin "@interface PBJViewController : CDVPlugin"

我在 config.xml 文件中包含插件名称和值,有,

config.xml

这些是我的示例代码之一。我的问题是直到没有得到想要的输出。

请给出一些建议或结果。

【问题讨论】:

如何使用 javascript 在 UIWebview 中加载 UIView 内容?请大家给我一些建议。 【参考方案1】:

你可以尝试像cordova.exec(null, null, "PBJViewController", "_setup", [])这样调用插件方法

【讨论】:

感谢您的回复,我是使用您的格式并替换 [self.webView.superview addSubview:_flipButton];而不是 [view addSubview:_flipButton];。但我仍然没有得到我的输出。我需要一些指导。请帮助我。 你直接给[self.view addSubview:_flipButton];但它会显示在所有视图中。 您的调用插件方法运行良好。我很感激你,感谢你的回答。我有一个疑问如何隐藏网络视图?我只隐藏了一些 div,但我不知道如何隐藏 web 视图。

以上是关于我无法使用 CDVPlugin 从 phonegap 2.7.0 中的 javascript 访问本机 iOS?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Cordova 中从 CDVPlugin 显示 ViewController?

PushPlugin 未找到,或者不是 CDVPlugin

phonegap ios plugin notificationEx CDVPlugin.h 文件未找到

PhoneGap 错误:找不到插件“LowLatencyAudio”,或者不是 CDVPlugin

将 Phonegap 插件添加到 Xcode - 错误:找不到插件“PayPalPlugin”,或者不是 CDVPlugin

Phonegap 3.4.0 和相机插件 (iOS) 的问题:CDVPlugin 类 CDVCamera (pluginName: camera) 不存在