2016-01-15 3 views
2

В настоящее время я завершаю webApp как приложение. В веб-приложении есть кнопка, которая при нажатии автоматически запрашивает, хотите ли вы пойти в камеру с сохраненными изображениями, и когда она будет выбрана, вы загрузите изображение для вас. В веб-приложении из браузера телефона это работает так, как ожидалось.UIWebView открывает камеру и изображения при нажатии кнопки

Теперь я завернул webApp в UIWebView, эта функция больше не работает. На самом деле, похоже, закрытие UIWebview при выборе одного из указанных выше вариантов. Кто-нибудь знает, что это за процедура, чтобы заставить это работать через UIWebView.

Должен ли я дать разрешение? Или ему больше нравится, как обнаруживать HTML, когда кнопка нажата и обрабатывает ее из UIWebView.

HTML на кнопке выглядит так.

<input type="file" required id="file" name="file" accept="image/*" multiple> 

ADDED КОД

WebViewController.h

#import <UIKit/UIKit.h> 

@interface WebViewController : UIViewController <UIWebViewDelegate,UINavigationControllerDelegate, UIImagePickerControllerDelegate> 
{ 
    UIViewController *viewController; 
} 

........

WebViewController.m

#import "WebViewController.h" 
#import <AssetsLibrary/AssetsLibrary.h> 
#import "AppDelegate.h" 
@end 
@implementation WebViewController 


- (void)viewDidLoad 
{ 
     [super viewDidLoad]; 
     viewController = [[UIViewController alloc] init]; 
     NSString *fullURL = self.mainURL; // get this from defualts - have removed code for this 




NSURL *url = [NSURL URLWithString:fullURL]; 
NSURLRequest *requestObj = [NSURLRequest requestWithURL:url]; 
[_viewWeb loadRequest:requestObj]; 

ALAssetsLibrary *lib = [[ALAssetsLibrary alloc] init]; 

[lib enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) { 
    NSLog(@"%i",[group numberOfAssets]); 
} failureBlock:^(NSError *error) { 
    if (error.code == ALAssetsLibraryAccessUserDeniedError) { 
     NSLog(@"user denied access, code: %i",error.code); 
    }else{ 
     NSLog(@"Other error code: %i",error.code); 
    } 
}]; 
} 
    -(void)webViewDidStartLoad:(UIWebView *)viewWeb 
{ 
     [UIApplication sharedApplication].applicationIconBadgeNumber = 0; 
} 
- (void)webViewDidFinishLoad:(UIWebView *)viewWeb 
{ 

} 






//Note: I check to make sure the camera is available. If it is not (iPod touch or Simulator) I show the photo library instead. 
-(void) showCamera 
{ 
    UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init]; 
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) 
    { 
     imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera; 
    } 
    else 
    { 
      imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; 
    } 
    imagePicker.delegate = self; 
    [viewController presentViewController:imagePicker animated:YES completion:nil]; 
} 

    //Here we intercept any time the webview tries to load a document. When the user hits our "showcamera: url" we go to work. 
    - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType: 
    (UIWebViewNavigationType)navigationType 
    { 
     if ([request.URL.scheme isEqualToString:@"myApp"]) 
     { 
      if ([request.URL.host isEqualToString:@"myFunction"]) 
      { 
       [self showCamera]; 
      } 
      return NO; 
     } 
     return YES; 
    } 

//After the imagepicker has done it's thing, we pass the data back to the webview to be displayed. 
//If we wanted to be fancy here, we could have done this via Javascript so we could dynamically insert an image without reloading the page. 
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
    [viewController dismissViewControllerAnimated:YES completion:nil]; 
    UIImage* image = [info objectForKey:UIImagePickerControllerOriginalImage]; 
    NSData *imageData = UIImageJPEGRepresentation (image, 0.5); 
    NSURL *tmp = [NSURL URLWithString:@"ignore"]; 
    [_viewWeb loadData:imageData MIMEType:@"image/jpeg" textEncodingName:@"UTF-8" baseURL:tmp]; 
    } 
    @end 

Я удалил код это не имело значения

ответ

5

мне удалось исправить проблема, и она возвращается к ошибке, которая была найдена в iOS 8, которая до сих пор не исправлена. Это связано с представлением UIWebView.

Добавление этого кода исправлено.

-(void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion 
{ 
    if (self.presentedViewController) 
    { 
     [super dismissViewControllerAnimated:flag completion:completion]; 
    } 
} 

Для любого из еще запутанном или борется с этим Обратите внимание, что вам не нужно, чтобы начать возиться с делегатами UIImagePicker или UIWebView. Ваш веб-просмотр должен заботиться об открытии библиотеки камеры или камеры. Это была настоящая боль в проблеме, поэтому, надеюсь, это может помочь другим в моем положении. вы также можете увидеть THIS Вопрос, откуда я получил свой ответ. Спасибо, Андрей за помощь тоже

2

В качестве альтернативы вы можете попробовать использовать метод UIWebViewDelegate в webView:shouldStartLoadWithRequest:navigationType: поймать пользовательские события:

В вашем HTML:

<a href="myApp://myFunction">Do something</a> 
<button onclick="window.location.href='myApp://myFunction'">Do some action</button> 

И потом:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { 
    if ([request.URL.scheme isEqualToString:@"myApp"]) { 
     if ([request.URL.host isEqualToString:@"myFunction"]) { 
      // do something 
     } 
     return NO; 
    } 
    return YES; 
} 
+0

Как у вас есть href в поле ввода файла html? –

+0

@ DanielRobinson, вы можете иметь событие onClick, например. –

+0

Андрей, можете ли вы обновить свой код, чтобы включить образец события onClick – Rob85

Смежные вопросы