2015-11-13 98 views
0

歡迎您提供建議或推薦的解決方案。科爾多瓦XmlHttp請求IP地址被阻止

我有一個使用RESTful服務的Cordova應用程序。應用程序需要在運行時指定的IP地址向打印機發送請求。該打印機是啓用了WebPRNT的Star Micronics熱敏打印機(它具有可接受打印作業的POST請求的Web服務器)。

在Chrome中運行時打印和RESTful服務工作。當我在iPad上部署它時,它會失敗。我可以在iPad上的Safari中打開應用程序併成功發送打印作業。出於某種原因,Cordova似乎阻止了打印機的POST。 RESTful服務是使用域名的外部服務(CORS)。打印機正在使用IP。兩者都使用POST方法。只有打印機出現故障。

我正在使用RestAngular進行應用程序和RESTful服務之間的通信。我正在使用Star Micronics' SDK(JavaScript使用裸XmlHttpRequest)將請求發送到打印機。我嘗試使用RestAngular,Angular的$ http和JQuery向服務器發送請求。沒有工作。

錯誤responseText爲空,http代碼爲-1。該請求在出口處被阻止,並且從未將其發送到打印機。

科爾多瓦版本:5.3.3 應用:HTML5 + AngualrJS 1.4.3(此調用使用原始的XmlHttpRequest)

科爾多瓦配置(config.xml文件):

<plugin name="cordova-plugin-whitelist" version="1" /> 
<access origin="*" /> 
<access origin="content:///*" /> 
<allow-intent href="*" /> 
<allow-navigation href="*" /> 

我試過幾個上述變化,指定IP明示等等。沒有任何工作。

HTML元內容安全策略:

<meta http-equiv="Content-Security-Policy" content="connect-src * http://IP_HERE; "> 

我已經試過內容安全策略的幾種變化連同config.xml中的設置。沒有工作。

打印機回答這些頭時,我從瀏覽器發送:

Access-Control-Allow-Credentials → true 
Access-Control-Allow-Headers → origin, content-type 
Access-Control-Allow-Methods → POST, GET, OPTIONS 
Access-Control-Allow-Origin → * 

這裏是發出調用(裁剪StarWebPrintTrader.js)的代碼。完整的JS文件包含在Star Micronics' SDK

var c=null; 
if(window.XMLHttpRequest) 
    c=new XMLHttpRequest; 
else if(window.ActiveXObject) 
    c=new ActiveXObject("Microsoft.XMLHTTP"); 
else{ 
    if(this.onError) 
     this.onError({status:10001,responseText:"XMLHttpRequest is not supported."}); 
    return 
} 
try{ 
    c.open("POST",b,!0) 
} 
catch(f){ 
    if(this.onError) 
     this.onError({status:10002,responseText:f.message}); 
    return 
} 
c.setRequestHeader("Content-Type","application/xml; charset=UTF-8"); 
c.onreadystatechange=function(){alert('state change')}; 
c.send(); 
+0

你使用的是iOS 9嗎? –

+0

是的。我正在使用iOS 9. – Rusty

+0

好的,請參閱我的答案,您將面對App Transport Security配置。 –

回答

1

如果您在iOS 9你可能來了對App交通運輸安全限制在默認情況下將不允許非SSL端點連接,不管什麼科爾多瓦的內容安全性政策設置爲。這是iOS9的新功能。

在這種情況下,您需要設置應用傳輸安全性例外並配置內容安全策略以允許訪問相同的主機。

配置應用程序傳輸安全打開你的項目的-Info.plist文件,並添加:

<key>NSAppTransportSecurity</key> 
<dict> 
    <key>NSAllowsArbitraryLoads</key> 
    <true/> 
</dict> 

即禁用ATS,並允許任何HTTP主機連接不使用SSL。如果你想限制到主機的特定主機或一組,你知道這些在編譯的時候你可以用這種形式:

<key>NSAppTransportSecurity</key> 
<dict> 
    <key>NSExceptionDomains</key> 
    <dict> 
     <key>myhost.mydomain.com</key> 
     <dict> 
     <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> 
     <true/> 
    </dict> 
    </dict> 
</dict> 

,並根據需要指定例外域的列表。

有一個blog post here更詳細地解釋了這一點。

+0

這是ATS和CSP。我向我的plist添加了NSAppTransportSecurity。這仍然沒有解決問題,但很重要。然後我讀博客。我的問題是打印機不支持https,科爾多瓦的默認CSP限制連接。打印開始工作時,我刪除了內容安全策略元標記。然後我回到了Cordova默認的內容安全策略,並修改它爲我的應用工作:content =「default-src *'unsafe-eval'data:gap :; connect-src:*; style-src *'unsafe-一致'」。謝謝西蒙! – Rusty