html ,js 榜轿,oc交互

1幽歼、html ,js 谬盐,oc交互

1.1甸私、點擊html頁面上的button,調(diào)用oc的方法

html代碼:

<div class="editCaptcha">
     <img id="captchaImg" src="" onClick="refreshCaptcha()">
</div>

js代碼:

function refreshCaptcha(){
    window.location.href = "huihui://refreshCaptchas/";
}

oc代碼:

- (void)refreshCaptchas
{
    [self getVerifyCode];
}
1.2飞傀、通過oc方法皇型,傳值給js,從而改變html頁面

html代碼:

<div class="editCaptcha">
     <img id="captchaImg" src="" onClick="refreshCaptcha()">
</div>

js代碼:

function setCaptchaImg(url){
 document.getElementById('captchaImg').src = url + '&_=' + new Date().getTime();
}

oc代碼:

- (void)getVerifyCode
{
    NSMutableDictionary* params = [[NSMutableDictionary alloc]init];
    [params safeSetObject:_passport forKey:@"passportId"];
    [params safeSetObject:@"58" forKey:@"width"];
    [params safeSetObject:@"30" forKey:@"height"];

    NSString *url =[XGSDKAuthServer getRequestUrl:@"getCaptcha" withParams:params] ;
    [self evaluatingscript:[NSString stringWithFormat:@"setCaptchaImg('%@')", url]];
}
1.3砸烦、點擊html頁面上的button弃鸦,調(diào)用oc的方法并傳參給oc方法。

html代碼:

<div class="editCaptcha">
     <input type="number" id="captcha" placeholder="captcha" value="" style="display: inline-block;">
     <img id="captchaImg" src="" onClick="refreshCaptcha()">
</div>

<div class="btn">
     <input type="button" id="confirmBtn" value="submit" onClick="onConfirmCaptcha()" >
    </div>

js代碼:

function onConfirmCaptcha(){
 var captcha = getValueById('captcha');
 window.location.href = "huihui://onConfirm/?captcha=" + captcha;
}

oc代碼:

- (void)onConfirm:(NSArray *)param
{
    NSAssert(param.count == 1, @"傳入的參數(shù)不符合預(yù)期");
//獲取從html頁面?zhèn)鬟^來的參數(shù)
   NSString *code = [param safeObjectAtIndex:0];
}
1.4幢痘、在oc的方法中獲取html頁面上的輸入框中的值

html代碼:

<div class="editCaptcha">
     <input type="number" id="captcha" placeholder="captcha" value="" style="display: inline-block;">
     <img id="captchaImg" src="" onClick="refreshCaptcha()">
</div>

<div class="btn">
     <input type="button" id="confirmBtn" value="submit" onClick="onConfirmCaptcha()" >
    </div>

js代碼:

function onConfirmCaptcha(){
 var captcha = getValueById('captcha');
 window.location.href = "kingsoft://onConfirm/?captcha=" + captcha;
}

oc代碼:

-(void)ocCall{
  NSString *code=[self evaluatingscript:@"onConfirmCaptcha()"];
}

- (NSString *)onConfirm:(NSArray *)param
{
    NSAssert(param.count == 1, @"傳入的參數(shù)不符合預(yù)期");
//獲取從html頁面?zhèn)鬟^來的參數(shù)
   NSString *code = [param safeObjectAtIndex:0];
   return code;
}

2唬格、html ,js 颜说,oc交互實現(xiàn)原理

js代碼:

//獲取html的觸摸事件
function pageLoad(){
    document.ontouchend = function(){
        window.location.href = "huihui://documentclick/";
    };
}

oc代碼:

- (void)documentclick{
    NSLog(@"documentclick");
}
@interface XGSDKBaseViewController ()<IMYWebViewDelegate, UIGestureRecognizerDelegate, UIScrollViewDelegate>{
IMYWebView *_webview;
}

- (NSString *)evaluatingscript:(NSString *)script
{
    return [_webview stringByEvaluatingJavaScriptFromString:script];
}

#pragma mark - UIWebView delegate

//攔截js中window.location.href方法發(fā)送的字符串
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    //huihui://onCancel/
    NSString *requestString = [[[request URL] absoluteString] stringByReplacingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
    
    if ([requestString hasPrefix:@"ios-log:"]) {
        NSLog(@"requestString = %@",[request.URL resourceSpecifier]);
        return NO;
    }
    
    NSURL *url = [request URL];
    if ( [url.absoluteString rangeOfString:@"itms-app"].location != NSNotFound || [url.absoluteString rangeOfString:@"itunes.apple.com"].location != NSNotFound ){
        [[UIApplication sharedApplication] openURL:url];
        return NO;
    }
    
    if ([[request.URL scheme] isEqual:@"huihui"]) {
        NSMutableString *resourceSpecifier = [[NSMutableString alloc] initWithString:[[request.URL resourceSpecifier] substringFromIndex:2]];
        
        NSArray *arr = [resourceSpecifier componentsSeparatedByString:@"/"];
        NSAssert(arr.count > 0, @"URL參數(shù)不符合規(guī)范");
        if(arr.count > 0){
            NSString *paramstr = [request.URL query];
            NSArray *paramarr = [paramstr componentsSeparatedByString:@"&"];
            NSString *split = paramarr.count > 0 ? @":" : @"";
            NSString *method = [NSString stringWithFormat:@"%@%@", [arr firstObject], split];
            NSMutableArray *param = nil;
            for(NSInteger i = 0; i < paramarr.count; i++){
                NSString *str = [paramarr safeObjectAtIndex:i];
                if(![str isEmptyOrNull]){
                    if(!param){
                        param = [[NSMutableArray alloc] init];
                    }
                    NSString *value = [[[str componentsSeparatedByString:@"="] lastObject] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
                    if(!value){
                        value = @"";
                    }
                    [param safeAddObject:value];
                }
            }
            SEL selector = NSSelectorFromString(method);
            if([self respondsToSelector:selector]){
                [self performSelectorOnMainThread:selector withObject:param waitUntilDone:YES];
            }else{
                NSAssert(NO, @"傳入了不存在的方法名");
            }
            return NO;
        }
    }
    
    return YES;
}

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    NSLog(@"load html webViewDidFinishLoad");
    //執(zhí)行還原信息
    NSString *htmlInfo = [[XGSDKAuthViewManager sharedManager].htmlInputInfoDic valueForKey:NSStringFromClass([self class])];
    
    if(htmlInfo){
        NSString *toJsInfo = [NSString stringWithFormat:@"convertInputInfo('%@')",htmlInfo];
        [self evaluatingscript:toJsInfo];
    }
    
    [self onload];
    [self evaluatingscript:@"pageLoad()"];
}

- (void)webView:(UIWebView *)webView didFailLoadWithError:(nullable NSError *)error
{
    //一個頁面沒有被完全加載之前收到下一個請求购岗,此時迅速會出現(xiàn)此error,error=-999
    //此時可能已經(jīng)加載完成,則忽略此error脑沿,繼續(xù)進(jìn)行加載藕畔。
    
    if([error code] == NSURLErrorCancelled)
    {
        NSLog(@"上個頁面還沒加載完");
        return;
    }
    NSLog(@"load html didFailLoadWithError");

    [self setWebViewWithLocalHtml:@"error"];
}

3马僻、若要刷新html頁面庄拇,只需點擊一下html頁面即可,不需要重新運行韭邓。

分析:當(dāng)工程部署到模擬器的時候措近,工程的資源文件會被打包到一個bundle中。若修改了項目目錄下的html文件女淑,讓其在模擬器上顯示瞭郑,需要再次編譯。但是可以從代碼上修改項目尋找html文件的路徑鸭你,讓其在項目目錄下尋找html而不是在bundle中尋找屈张,就可以做到實時更新擒权。

@interface XGSDKBaseViewController ()<IMYWebViewDelegate, UIGestureRecognizerDelegate, UIScrollViewDelegate>{
IMYWebView *_webview;
}
@end

//設(shè)置本地html,localHtml(huihui)
- (void)setWebViewWithLocalHtml:(NSString *)localHtml
{
    //js跟css 在不同文件阁谆,要baseURL
    NSURL *baseURL = nil;
    NSString* templateStr = nil;
    templateStr = [self getTemplateStr:localHtml];
    //判斷加載位置...
#if (TARGET_IPHONE_SIMULATOR && DEBUG)
    baseURL = [NSURL fileURLWithPath:[self getBaseURLInWorkSpace] isDirectory:YES];
    NSLog(@"baseURL=%@",baseURL);
#else
    baseURL = [NSURL fileURLWithPath:[self getBaseURLInBundle] isDirectory:YES];
#endif // #if TARGET_IPHONE_SIMULATOR
//調(diào)用
[_webview loadHTMLString:templateStr baseURL:baseURL];
}

//返回整個html頁面的代碼
- (NSString *)getTemplateStr:(NSString *)localHtml
{
    NSString *templateStr = nil;
#if (TARGET_IPHONE_SIMULATOR && DEBUG)
    templateStr = [self getTemplateInWorkSpaceWithHtml:localHtml];
#else
    templateStr = [self getTemplateInBundleWithHtml:localHtml];
#endif // #if TARGET_IPHONE_SIMULATOR
  return templateStr;
}

- (NSString *)getBaseURLInWorkSpace
{
    NSString *srcDir = [NSString stringWithFormat:@"%@/html/",[SamuraiWatcher sharedInstance].sourcePath];
    return srcDir;
}
- (NSString *)getBaseURLInBundle
{
    NSString *srcDir = [[XGSDKBaseViewController frameworkBundle] bundlePath];
    return srcDir;
}
#pragma mark - 正式環(huán)境下的路徑
- (NSString *)getTemplateInBundleWithHtml:(NSString *)html
{
    //先看看有沒有對應(yīng)的patch文件碳抄,有的話就拿,沒有就拿bundle
    NSString *patch = [self getDownloadPath:@"xx.html"];
    NSString *scrPath = nil;
    BOOL enablePatch =  [self checkFileIsExit:patch];
    if(enablePatch){
        scrPath = patch;
    }else{
        scrPath = [self localizedPathForResource:html ofType:@".html" bundle:[self frameworkBundle]];
    }
    return [NSString stringWithContentsOfFile:scrPath encoding:NSUTF8StringEncoding error:nil];
}
#pragma mark - 工程目錄下用的路徑
- (NSString *)getTemplateInWorkSpaceWithHtml:(NSString *)html
{
    //獲取在工程目錄下的
    NSString *patch = [self getDownloadPath:@"xx.html"];
    NSString *srcPath;
    BOOL enablePatch =  [self checkFileIsExit:patch];
    if(enablePatch){
        srcPath = patch;
    } else {
        srcPath = [NSString stringWithFormat:@"%@/%@.html",[self getBaseURLInWorkSpace],html];
        NSLog(@"srcPath=%@",srcPath);
    }
    return [NSString stringWithContentsOfFile:srcPath encoding:NSUTF8StringEncoding error:nil];
}

+(NSString *)getDownloadPath:(NSString *)fileName{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *cachesDirectory = [paths objectAtIndex:0];
    NSString *dirPath = [NSString stringWithFormat:@"%@/%@",cachesDirectory, huihui];
    NSString *filePath = [NSString stringWithFormat:@"%@%@%@",dirPath,@"/",fileName];
    return filePath;
}

+(BOOL)checkFileIsExit:(NSString *)filePath{
    // 創(chuàng)建文件管理器
    NSFileManager *fileMgr = [NSFileManager defaultManager];
    BOOL isFileExist = [fileMgr fileExistsAtPath:filePath];
    if (isFileExist) {
        return YES;
    }
    return NO;
}

- (NSString *)getBaseURLInWorkSpace
{
    NSString *srcDir = [NSString stringWithFormat:@"%@/html/",[SamuraiWatcher sharedInstance].sourcePath];
        return srcDir;
}

#pragma mark - bundle
+ (NSBundle *)frameworkBundle {
    static NSBundle* frameworkBundle = nil;
    static dispatch_once_t predicate;
    NSString *bundle = @"huihui.bundle";
    dispatch_once(&predicate, ^{
        NSString* mainBundlePath = [[NSBundle mainBundle] resourcePath];
        NSString* frameworkBundlePath = [mainBundlePath stringByAppendingPathComponent:bundle];
        frameworkBundle = [NSBundle bundleWithPath:frameworkBundlePath];
    });
    return frameworkBundle;
}

- (NSString *)localizedPathForResource:(NSString *)name ofType:(NSString *)extension bundle:(NSBundle *)bundle {
    NSBundle *searchBundle = bundle ? bundle : [NSBundle mainBundle];
    NSString *path = [searchBundle pathForResource:name ofType:extension inDirectory:nil forLocalization:'en'];
    path = path ? path : [searchBundle pathForResource:name ofType:extension];
    return path;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末场绿,一起剝皮案震驚了整個濱河市剖效,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌焰盗,老刑警劉巖璧尸,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異熬拒,居然都是意外死亡爷光,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門澎粟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瞎颗,“玉大人,你說我怎么就攤上這事捌议『甙危” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵瓣颅,是天一觀的道長倦逐。 經(jīng)常有香客問我,道長宫补,這世上最難降的妖魔是什么檬姥? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮粉怕,結(jié)果婚禮上健民,老公的妹妹穿的比我還像新娘。我一直安慰自己贫贝,他們只是感情好秉犹,可當(dāng)我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著稚晚,像睡著了一般崇堵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上客燕,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天鸳劳,我揣著相機(jī)與錄音,去河邊找鬼也搓。 笑死赏廓,一個胖子當(dāng)著我的面吹牛涵紊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播幔摸,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼栖袋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了抚太?” 一聲冷哼從身側(cè)響起塘幅,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎尿贫,沒想到半個月后电媳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡庆亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年匾乓,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片又谋。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡拼缝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出彰亥,到底是詐尸還是另有隱情咧七,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布任斋,位于F島的核電站继阻,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏废酷。R本人自食惡果不足惜瘟檩,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望澈蟆。 院中可真熱鬧墨辛,春花似錦、人聲如沸趴俘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哮幢。三九已至带膀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間橙垢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工伦糯, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留柜某,地道東北人嗽元。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像喂击,于是被迫代替她去往敵國和親剂癌。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容