Cordova中iOS端訪問遠程web鏈接調(diào)用Cordova插件

首先感謝假裝程序猿的文章

最近項目采用cordova框架開發(fā)甚脉,所以就苦了前端同學滚澜,稍微改動都要Jenkins去打包蓉媳,所以在想能不能直接訪問前端同學本地鏈接八酒,改完直接就能生效那種空民,下面開始。


1.修改config.xml文件

在config.xml文件中添加以下代碼:

<content src="http://192.168.18.126:8081/#/" />
<allow-navigation href="http://*/*" />
<allow-navigation href="https://*/*" />

說明:后面兩個屬性是允許APP加載外部鏈接羞迷,不加的話會直接跳轉瀏覽器訪問界轩。

2.修改訪問的index.html代碼

var script = document.createElement('script'); 
script.type = "text/javascript"; 
script.src="http://injection/cordova.js"; 
document.getElementsByTagName('body')[0].appendChild(script);

說明:這段代碼要添加在所有js文件加載完之后,因為cordova不允許web直接訪問"file://"開頭的鏈接衔瓮,所以需要前端文件將cordova.js的路徑替換為

http://injection/cordova.js

3.添加CDVURLProtocolCustom

這個類的作用是攔截web發(fā)出的請求浊猾,將第二步中的

http://injection/cordova.js

攔截,之后跳轉本地cordova.js热鞍。

CDVURLProtocolCustom.h

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface CDVURLProtocolCustom : NSURLProtocol

@end

CDVURLProtocolCustom.m

#import "CDVURLProtocolCustom.h"
#import <CoreServices/CoreServices.h>

@interface CDVURLProtocolCustom ()

@end

NSString* const kCDVAssetsLibraryPrefixes = @"http://injection/cordova.js";

@implementation CDVURLProtocolCustom

// 這個方法用來攔截H5頁面請求
+ (BOOL)canInitWithRequest:(NSURLRequest*)theRequest
{
    NSURL* theUrl = [theRequest URL];
    
    // 判斷是否是我們定義的url葫慎,若是,返回YES薇宠,繼續(xù)執(zhí)行其他方法偷办,若不是,返回NO澄港,不執(zhí)行其他方法
    if ([[theUrl absoluteString] hasPrefix:kCDVAssetsLibraryPrefixes]) {
        return YES;
    }
    
    return NO;
}

+ (NSURLRequest*)canonicalRequestForRequest:(NSURLRequest*)request
{
    // NSLog(@"%@ received %@", self, NSStringFromSelector(_cmd));
    return request;
}
// 獲取本地文件路徑
- (NSString*)pathForResource:(NSString*)resourcepath
{
    NSBundle* mainBundle = [NSBundle mainBundle];
    NSMutableArray* directoryParts = [NSMutableArray arrayWithArray:[resourcepath componentsSeparatedByString:@"/"]];
    NSString* filename = [directoryParts lastObject];
    
    [directoryParts removeLastObject];
    NSString* directoryPartsJoined = [directoryParts componentsJoinedByString:@"/"];
    NSString* directoryStr = @"www";
    
    if ([directoryPartsJoined length] > 0) {
        directoryStr = [NSString stringWithFormat:@"%@/%@", directoryStr, [directoryParts componentsJoinedByString:@"/"]];
    }
    
    return [mainBundle pathForResource:filename ofType:@"" inDirectory:directoryStr];
}

// 在canInitWithRequest方法返回YES以后椒涯,會執(zhí)行該方法,完成替換資源并返回給H5頁面
- (void)startLoading
{
    // NSLog(@"%@ received %@ - start", self, NSStringFromSelector(_cmd));
    NSString* url=super.request.URL.resourceSpecifier;
    NSString* cordova = [url stringByReplacingOccurrencesOfString:@"http://injection/" withString:@""];
    NSURL* startURL = [NSURL URLWithString:cordova];
    
    
    NSString* cordovaFilePath =[self pathForResource:[startURL path]];
    if (!cordovaFilePath) {
        [self sendResponseWithResponseCode:401 data:nil mimeType:nil];//重要
        return;
    }
    CFStringRef pathExtension = (__bridge_retained CFStringRef)[cordovaFilePath pathExtension];
    CFStringRef type = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, pathExtension, NULL);
    CFRelease(pathExtension);
    NSString *mimeType = (__bridge_transfer NSString *)UTTypeCopyPreferredTagWithClass(type, kUTTagClassMIMEType);
    if (type != NULL)
        CFRelease(type);
    //    NSURLResponse *response = [[NSURLResponse alloc] initWithURL:super.request.URL    MIMEType:mimeType expectedContentLength:-1 textEncodingName:nil];
    NSData* data = [NSData dataWithContentsOfFile:cordovaFilePath];
    [self sendResponseWithResponseCode:200 data:data mimeType:mimeType];
}


- (void)stopLoading
{
    // do any cleanup here
}

+ (BOOL)requestIsCacheEquivalent:(NSURLRequest*)requestA toRequest:(NSURLRequest*)requestB
{
    return NO;
}

// 將本地資源返回給H5頁面
- (void)sendResponseWithResponseCode:(NSInteger)statusCode data:(NSData*)data mimeType:(NSString*)mimeType
{
    if (mimeType == nil) {
        mimeType = @"text/plain";
    }
    
    NSHTTPURLResponse* response = [[NSHTTPURLResponse alloc] initWithURL:[[self request] URL] statusCode:statusCode HTTPVersion:@"HTTP/1.1" headerFields:@{@"Content-Type" : mimeType}];
    
    [[self client] URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];
    if (data != nil) {
        [[self client] URLProtocol:self didLoadData:data];
    }
    [[self client] URLProtocolDidFinishLoading:self];
}

@end

4.初始化CDVURLProtocolCustom

在CDVAppdelegate的application:(UIApplication*)application didFinishLaunchingWithOptions:方法中添加

[NSURLProtocol registerClass:[CDVURLProtocolCustom class]]慢睡;

5.遇到問題

Q:'CDVURLProtocolCustom.h' file not found
Q1.png

解決:將CDVURLProtocolCustom移動到Public文件夾下逐工,與CDVAppdelegate同級即可,刪除plugins下的文件漂辐,如下圖所示泪喊。


Q2.png
Q3.png

編譯成功,希望遇到同樣問題的同學可以避免髓涯。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末袒啼,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子纬纪,更是在濱河造成了極大的恐慌蚓再,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件包各,死亡現(xiàn)場離奇詭異摘仅,居然都是意外死亡,警方通過查閱死者的電腦和手機问畅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門娃属,熙熙樓的掌柜王于貴愁眉苦臉地迎上來六荒,“玉大人,你說我怎么就攤上這事矾端√突鳎” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵秩铆,是天一觀的道長砚亭。 經(jīng)常有香客問我,道長殴玛,這世上最難降的妖魔是什么捅膘? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮族阅,結果婚禮上篓跛,老公的妹妹穿的比我還像新娘。我一直安慰自己坦刀,他們只是感情好,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布蔬咬。 她就那樣靜靜地躺著鲤遥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪林艘。 梳的紋絲不亂的頭發(fā)上盖奈,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機與錄音狐援,去河邊找鬼钢坦。 笑死,一個胖子當著我的面吹牛啥酱,可吹牛的內(nèi)容都是我干的爹凹。 我是一名探鬼主播镶殷,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼绘趋!你這毒婦竟也來了?” 一聲冷哼從身側響起陷遮,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤滓走,失蹤者是張志新(化名)和其女友劉穎帽馋,沒想到半個月后比吭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡腰懂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了绣溜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡怖喻,死狀恐怖底哗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情锚沸,我是刑警寧澤跋选,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站哗蜈,受9級特大地震影響前标,放射性物質發(fā)生泄漏。R本人自食惡果不足惜距潘,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一炼列、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧音比,春花似錦俭尖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至骚亿,卻和暖如春已亥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背循未。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工陷猫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人的妖。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓绣檬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親嫂粟。 傳聞我的和親對象是個殘疾皇子娇未,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353