亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

iOSNative-Web交互學習心得

2019-11-14 19:29:59
字體:
來源:轉載
供稿:網友

Web和Native的交互,也就是iOS object-Cjavascript之間的交互;核心代碼是

[webView stringByEvaluatingJavascriptFromString:@"xxxxxxxxxx"];

 

這里主要用到的就是iOS WebKit加載網絡頁面,功能有獲取用戶位置信息,拍照,判斷當前手機網絡連接類型的功能(拍照和獲取當前用戶地理位置需要真機環境下)所以需要導入以下幾個框架:

 這里需要注意的是iOS8以后獲取位置地理信息需要在info.plist文件中手動添加:

NSLocationWhenInUseUsageDescriptionNSLocationAlwaysUsageDescription

設置他們的鍵值為YES;

那么現在我們的準備工作就做好了;

 

首先加載本地的Html文件:這里因為需要調用系統相機所以添加代理UIWebViewDelegate,UINavigationControllerDelegate, UIImagePickerControllerDelegate

@interface ViewController ()<UIWebViewDelegate,UINavigationControllerDelegate, UIImagePickerControllerDelegate>

{

    NSString *callback;

}

@PRoperty (nonatomic,strong) UIWebView *webView;

@property (nonatomic,strong) MapViewController *map;

 

@end

 

@implementation ViewController


- (void)viewDidLoad { [super viewDidLoad]; _webView = [[UIWebView alloc]initWithFrame:self.view.bounds]; [self.view addSubview:_webView]; _webView.delegate = self; NSString *filePath = [[NSBundle mainBundle] pathForResource:@"api" ofType:@"html"]; NSString *fileContent = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil]; [_webView loaDHTMLString:fileContent baseURL:nil]; }

現在開始上干貨了:WebViewDelegate代理方法

//js調用iOS- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{    NSString *requestString = [[request URL] absoluteString];    //jS協議頭    NSString *protocol = @"js-call://";    //請求的字符串符合協議頭    if ([requestString hasprefix:protocol]) {        //從協議頭后的位置截取字符串到最后        NSString *requestContent = [requestString substringFromIndex:[protocol length]];        //將/分隔的字符串轉換成數組        NSArray *vals = [requestContent componentsSeparatedByString:@"/"];        if ([[vals objectAtIndex:0] isEqualToString:@"camera"]) {            callback = [vals objectAtIndex:1];            [self doAction:UIImagePickerControllerSourceTypeCamera];        } else if([[vals objectAtIndex:0] isEqualToString:@"photolibrary"]) {            callback = [vals objectAtIndex:1];            [self doAction:UIImagePickerControllerSourceTypePhotoLibrary];        } else if([[vals objectAtIndex:0] isEqualToString:@"album"]) {            callback = [vals objectAtIndex:1];            [self doAction:UIImagePickerControllerSourceTypeSavedPhotosAlbum];        }        else if([[vals objectAtIndex:0] isEqualToString:@"location"]) {            callback = [vals objectAtIndex:1];            [self sendlocationInformation];        }        else if([[vals objectAtIndex:0] isEqualToString:@"netType"]) {            callback = [vals objectAtIndex:1];            [self sendNetWorkType];                    }                               else {            [webView stringByEvaluatingJavaScriptFromString:@"alert('未定義/lwme.VEVb.com');"];        }        return NO;    }    return YES;}

點擊加載的Web頁面的按鈕,native端響應事件:

- (void)doAction:(UIImagePickerControllerSourceType)sourceType{    UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];    imagePicker.delegate = self;    if ([UIImagePickerController isSourceTypeAvailable:sourceType]) {        imagePicker.sourceType = sourceType;    } else {        UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"照片獲取失敗" message:@"沒有可用的照片來源" delegate:nil cancelButtonTitle:@"確定" otherButtonTitles:nil, nil];        [av show];        return;    }    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {        UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:imagePicker];        [popover presentPopoverFromRect:CGRectMake(self.view.bounds.size.width / 2, self.view.bounds.size.height / 3, 10, 10) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];    } else {        [self presentViewController:imagePicker animated:YES completion:nil];    }}

拍照,獲取相冊的代理方法:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{    if ([[info objectForKey:UIImagePickerControllerMediaType] isEqualToString:@"public.image"]) {        UIImage *originalImage = [info objectForKey:UIImagePickerControllerOriginalImage];                UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"正在處理圖片..." message:@"/n/n"                                                    delegate:self                                           cancelButtonTitle:nil                                           otherButtonTitles:nil, nil];                UIActivityIndicatorView *loading = [[UIActivityIndicatorView alloc]                                            initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];        loading.center = CGPointMake(139.5, 75.5);        [av addSubview:loading];        [loading startAnimating];        [av show];                dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{            NSString *base64 = [UIImageJPEGRepresentation(originalImage,0.5) base64EncodedStringWithOptions:0];            [self performSelectorOnMainThread:@selector(doCallback:) withObject:base64 waitUntilDone:NO];                                                [av dismissWithClickedButtonIndex:0 animated:YES];        });    }        [picker dismissViewControllerAnimated:YES completion:nil];}- (void)doCallback:(NSString *)data{    [_webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"%@('%@');", callback, data]];}

Web頁面的HTML代碼信息:

<!DOCTYPE html><html><head>  <meta charset="utf-8">  <title>微信JS-SDK Demo</title>  <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=0">  <link rel="stylesheet" href="CSS/style_demo.css">  <script>  function openLocation(){      window.location.href="js-call://location/locationCallback";  }  function chooseImage(){      window.location.href="js-call://photolibrary/photolibraryCallback";  }  function goCamera(){      window.location.href="js-call://camera/cameraCallback";  }  function getNetType(){      window.location.href="js-call://netType/netTypeCallback";  }  function openAlbum(){        window.location.href="js-call://album/albumCallback";  }   function cameraCallback(imageData) {      var img = createImageWithBase64(imageData);      document.getElementById("camera_image_div").appendChild(img);  }  function photolibraryCallback(imageData) {      var img = createImageWithBase64(imageData);      document.getElementById("choose_image_div").appendChild(img);  }  function albumCallback(imageData) {      var img = createImageWithBase64(imageData);      document.getElementById("open_image_div").appendChild(img);  }    function createImageWithBase64(imageData) {      var img = new Image();      img.src = "data:image/jpeg;base64," + imageData;      img.style.width = "200px";      img.style.height = "200px";      return img;  }    </script></head><body ontouchstart="">    <div class="wxapi_container">        <div class="lbox_close wxapi_form">      <h3 id="menu-image">圖像接口</h3>      <span class="desc">地理位置</span>      <button class="btn btn_primary" id="openLocation" onclick="openLocation()">地理位置</button>      <span id="spLoc" class="desc"></span>      <span class="desc">選擇圖片</span>      <button class="btn btn_primary" id="chooseImage" onclick="chooseImage()">選擇圖片</button>      <div id="choose_image_div"></div>      <span class="desc">拍照</span>      <button class="btn btn_primary" id="takePic" onclick="goCamera()">拍照</button>      <div id="camera_image_div"></div>      <span class="desc">網絡連接類型</span>      <button class="btn btn_primary" id="netType" onclick="getNetType()">網絡連接類型</button>      <span id="spNet" class="desc"></span>      <span class="desc">相冊</span>      <button class="btn btn_primary" id="openAlbum" onclick="openAlbum()">打開相冊</button>      <div id="open_image_div"></div>            <div id="hidpicdiv" style="display: none;">            <img id="hidpic" src="" width="200" height="200"/>        </div>    </div>    </div></body>

獲取當前用戶位置信息和判斷當前手機的連接網絡類型:

- (void)sendNetWorkType{        if ([NetWorkType getNetworkTypeFromStatusBar]==0) {        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"網絡連接類型" message:@"當前無網絡連接" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];                [alert show];    }    if ([NetWorkType getNetworkTypeFromStatusBar]==1) {        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"網絡連接類型" message:@"當前2G連接" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];                [alert show];    }    if ([NetWorkType getNetworkTypeFromStatusBar]==2) {        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"網絡連接類型" message:@"當前為3G連接" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];                [alert show];    }    if ([NetWorkType getNetworkTypeFromStatusBar]==3) {        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"網絡連接類型" message:@"當前為4G連接" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];                [alert show];    }    if ([NetWorkType getNetworkTypeFromStatusBar]==5) {        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"網絡連接類型" message:@"當前為WIFI連接" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];                [alert show];    }}- (void)sendlocationInformation{    _map = [[MapViewController alloc]init];        _map.modalPresentationStyle = UIModalPresentationFullScreen;            [self presentViewController:_map animated:YES completion:nil];        }

 

獲取當前用戶的位置信息:

頭文件導入:

#import <MapKit/MapKit.h>#import <CoreLocation/CoreLocation.h>

加載地圖:

@interface MapViewController ()<MKMapViewDelegate,CLLocationManagerDelegate>{    NSString *locationStr;}@property (nonatomic,strong) MKMapView *mapView;@property (nonatomic,strong) CLLocationManager *locationManager;@end@implementation MapViewController- (void)viewDidLoad {    [super viewDidLoad];    // Do any additional setup after loading the view, typically from a nib.    _mapView = [[MKMapView alloc]initWithFrame:self.view.frame];    [self.view addSubview:_mapView];        UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];        backButton.frame = CGRectMake((self.view.bounds.size.width)/2-40, 20, 80, 30);    [backButton setTitle:@"返回" forState:UIControlStateNormal];    [backButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];    backButton.backgroundColor = [UIColor cyanColor];        backButton.titleLabel.textAlignment = NSTextAlignmentCenter;    [backButton addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];    [_mapView addSubview:backButton];    // 1.跟蹤用戶位置(顯示用戶的具體位置)    self.mapView.userTrackingMode = MKUserTrackingModeFollow;        // 2.設置地圖類型    self.mapView.mapType = MKMapTypeStandard;        // 3.設置代理    self.mapView.delegate = self;        _locationManager = [[CLLocationManager alloc] init];    _locationManager.delegate = self;    //設置定位精度    _locationManager.desiredAccuracy=kCLLocationAccuracyBest;    //定位頻率,每隔多少米定位一次    CLLocationDistance distance=1.0;//1米定位一次    _locationManager.distanceFilter=distance;    _locationManager.desiredAccuracy=kCLLocationAccuracyBest;    if([_locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {        [_locationManager requestWhenInUseAuthorization];    }    [_locationManager startUpdatingLocation];    }#pragma mark - MKMapViewDelegate/** *  當用戶的位置更新,就會調用 * *  @param userLocation 表示地圖上藍色那顆大頭針的數據 */- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation{    CLLocationCoordinate2D center = userLocation.location.coordinate;        // 設置地圖的顯示范圍, 讓其顯示到當前指定的位置    MKCoordinateSpan span = MKCoordinateSpanMake(0, 0);//這個顯示大小精度自己調整    MKCoordinateRegion region = MKCoordinateRegionMake(center, span);    [mapView setRegion:region animated:YES];}//可以通過模擬器設置一個虛擬位置,否則在模擬器中無法調用此方法-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{    CLLocation *location=[locations firstObject];//取出第一個位置    CLLocationCoordinate2D coordinate=location.coordinate;//位置坐標           locationStr = [NSString stringWithFormat:@"經度:%f,緯度:%f,海拔:%f,航向:%f,行走速度:%f",coordinate.longitude,coordinate.latitude,location.altitude,location.course,location.speed];    //如果不需要實時定位,使用完即使關閉定位服務    [_locationManager stopUpdatingLocation];}- (void)back{    [self dismissViewControllerAnimated:YES completion:nil];}

判斷當前手機網絡連接的類型:

這里我寫了一個類方法,因為我們判斷當前用戶使用的網絡連接方式可以從狀態欄信息中獲?。?/p>

在.h中:

@interface NetWorkType : NSObjecttypedef enum {        NETWORK_TYPE_NONE= 0,        NETWORK_TYPE_2G= 1,        NETWORK_TYPE_3G= 2,        NETWORK_TYPE_4G= 3,        NETWORK_TYPE_5G= 4,//  5G目前為猜測結果        NETWORK_TYPE_WIFI= 5,    }NETWORK_TYPE;+(NETWORK_TYPE)getNetworkTypeFromStatusBar;@end

在.m:

#import "NetWorkType.h"#import "AppDelegate.h"@implementation NetWorkType+(NETWORK_TYPE)getNetworkTypeFromStatusBar {                UIapplication *app = [UIApplication sharedApplication];        NSArray *subviews = [[[app valueForKey:@"statusBar"] valueForKey:@"foregroundView"] subviews];        NSNumber *dataNetworkItemView = nil;                for (id subview in subviews) {                if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]])     {                        dataNetworkItemView = subview;                        break;                    }            }        NETWORK_TYPE nettype = NETWORK_TYPE_NONE;        NSNumber * num = [dataNetworkItemView valueForKey:@"dataNetworkType"];        nettype = [num intValue];                return nettype;    }@end

 

下面就是我寫的關于這個demo運行的效果圖片:

 以上就是自己寫的iOS Native-Web交互方面的心得,轉載請說明出處;O(∩_∩)O謝謝


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美疯狂xxxx大交乱88av| 成人美女av在线直播| 日韩精品亚洲元码| 欧美夫妻性视频| 久久久久久成人| 亚洲国产小视频在线观看| 成人黄色激情网| 亚洲r级在线观看| 成人黄色影片在线| 在线亚洲国产精品网| 欧美亚洲在线播放| 久久免费精品日本久久中文字幕| 久久香蕉国产线看观看网| 国产成人精品在线播放| 欧美大片网站在线观看| 亚洲一区二区三区xxx视频| 精品久久久999| 午夜剧场成人观在线视频免费观看| 成人写真视频福利网| 日韩中文字幕在线观看| 欧美日韩国产成人| 国产a∨精品一区二区三区不卡| 欧美视频专区一二在线观看| 欧美黑人一区二区三区| 日韩极品精品视频免费观看| 国产精品扒开腿爽爽爽视频| 欧美性少妇18aaaa视频| 久久久中文字幕| 久久精品夜夜夜夜夜久久| 成人激情电影一区二区| 成人国产精品久久久久久亚洲| 91理论片午午论夜理片久久| 91手机视频在线观看| 91久久国产婷婷一区二区| 日本精品免费观看| 亚洲嫩模很污视频| 国产一区二区三区欧美| 欧美成人午夜激情在线| 2019中文字幕免费视频| 欧美性感美女h网站在线观看免费| 国产偷国产偷亚洲清高网站| 久久综合久中文字幕青草| 欧美日韩一区免费| 精品高清美女精品国产区| 91久久久久久久一区二区| www.亚洲成人| 欧美激情视频一区二区| 国产日产久久高清欧美一区| 2019中文字幕免费视频| 福利视频导航一区| 欧美日韩国内自拍| 热re99久久精品国产66热| 91精品国产91久久久| 欧美成人激情图片网| 日本最新高清不卡中文字幕| 国色天香2019中文字幕在线观看| 色诱女教师一区二区三区| 国产免费观看久久黄| 欧美性极品xxxx做受| 色偷偷91综合久久噜噜| 久久精品视频在线播放| 国内精品视频一区| 性欧美激情精品| 日韩免费观看在线观看| 91国偷自产一区二区三区的观看方式| 日韩av在线免费看| 亚洲深夜福利在线| 日韩免费看的电影电视剧大全| 欧美一区视频在线| 亚洲国产精品999| 色综久久综合桃花网| 国产成人综合精品| 日韩欧美aⅴ综合网站发布| 亚洲理论片在线观看| 在线电影欧美日韩一区二区私密| 亚洲成人在线视频播放| 91av在线精品| 国产精品久久久久久久久久新婚| 欧美福利视频在线| 日本视频久久久| 亚洲欧美在线x视频| 久久6免费高清热精品| 91高清视频免费观看| 136fldh精品导航福利| 欧美黄色www| 狠狠干狠狠久久| 国产69久久精品成人看| 91精品国产综合久久香蕉的用户体验| 国产91色在线|| 91久久久国产精品| 欧美在线一区二区视频| 亚洲午夜av电影| 久久久久亚洲精品成人网小说| 日韩人在线观看| 性亚洲最疯狂xxxx高清| 欧美美最猛性xxxxxx| 久久色在线播放| 91免费看片在线| 欧美在线欧美在线| 日韩欧美a级成人黄色| 国产成人精品日本亚洲| 日韩电影大全免费观看2023年上| 在线观看国产欧美| 55夜色66夜色国产精品视频| 日本在线精品视频| 在线亚洲男人天堂| 永久免费精品影视网站| 色综合老司机第九色激情| 欧美一区二区影院| 亚洲欧洲第一视频| 欧美精品久久久久久久免费观看| 日韩电影中文字幕一区| 亚洲国产精久久久久久| 日韩精品在线私人| 一区二区欧美日韩视频| 91国自产精品中文字幕亚洲| 久久久视频精品| 欧美韩日一区二区| 亚洲国产精品久久久久秋霞蜜臀| 久久影视三级福利片| 操人视频在线观看欧美| 日韩激情第一页| 国产成人精品999| 日韩电影大全免费观看2023年上| 欧美理论电影在线播放| 国内精品久久久久| 亚洲电影第1页| 懂色av影视一区二区三区| 91在线中文字幕| 国产在线视频欧美| 91国产视频在线| 国产精品白嫩美女在线观看| 国产精品一区二区三| 亚洲国产美女久久久久| 色爱av美腿丝袜综合粉嫩av| 国产成人精品久久二区二区91| 欧美在线观看一区二区三区| 九九九热精品免费视频观看网站| 午夜免费在线观看精品视频| 久久久久久亚洲| 国产精品免费在线免费| 精品国产一区二区三区久久狼黑人| 黄色成人av在线| 欧美日韩国产色| 国产亚洲一级高清| 国产精品流白浆视频| 亚洲专区国产精品| 成人在线一区二区| 51午夜精品视频| 国产视频福利一区| 国模吧一区二区三区| 国产精品嫩草影院一区二区| 久久综合伊人77777尤物| 亚洲一区二区三区sesese| 欧美日韩国产二区| 色av中文字幕一区| 精品亚洲一区二区| 日韩亚洲欧美成人| 97超级碰碰人国产在线观看| 欧美体内谢she精2性欧美| 热re91久久精品国99热蜜臀| 国产精品久久精品| 综合久久五月天| 欧美专区在线观看|