2015-10-19 2 views
0

Ajax-звонок, который я создал, отлично работает с браузером и Android, но при работе на iphone он зависает навсегда или будет тайм-аутом, если добавлена ​​опция тайм-аута.Cordova (Phonegap) ajax вызывает зависание на устройстве iphone

Аякса выглядит следующим образом:

$.ajax({ 
    url: "http://pbcc.ca/xxx/index.php", 
    data: {api: 'test'}, 
    type: "GET", 
    dataType: "jsonp", 
    jsonp: 'callback', 
    beforeSend: function() { 
    alert("beforeSend"); 
    }, 
    success: function(data) { 
    alert("success"); 
    }, 
    error: function(e,x) { 
    alert("error"); 
    } 
}); 

Я попробовал это после того, как документ готов и устройства готовы, только beforeSend ответы в обоих случаях. В Интернете есть несколько сообщений с подобными проблемами, и я пробовал некоторые методы, но ни одна из них не решила мою проблему. Может ли кто-нибудь помочь? Благодарю.

Обновление: Протестировано на стороне сервера, сервер не отвечает на вызов ajax от ios. На самом деле никаких данных, переданных на сервер, я думаю.

Update2:

Я получаю эту ошибку:

Refused to load the script 'http://www.pbcc.ca/xxx/index.php?callback=...' because it violates the following Content Security Policy directive: "default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'". Note that 'script-src' was not explicitly set, so 'default-src' is used as a fallback. 

Meta:

<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *; connect-src http://pbcc.ca"> 

info.plist (я не ставил их вместе в начале):

<key>NSAppTransportSecurity</key> 
<dict> 
    <key>NSAllowsArbitraryLoads</key> 
    <true/> 
    <key>NSExceptionDomains</key> 
    <dict> 
    <key>pbcc.ca</key> 
    <dict> 
     <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> 
     <true/> 
    </dict> 
    </dict> 
</dict> 

config.xml (по умолчанию, созданное Кордова):

<?xml version='1.0' encoding='utf-8'?> 
 
<widget id="com.polarbear.lunch" version="0.0.1" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0"> 
 
    <name>xxx</name> 
 
    <description> 
 
     A sample Apache Cordova application that responds to the deviceready event. 
 
    </description> 
 
    <author email="[email protected]" href="http://cordova.io"> 
 
     Apache Cordova Team 
 
    </author> 
 
    <content src="index.html" /> 
 
    <plugin name="cordova-plugin-whitelist" version="1" /> 
 
    <access origin="*" /> 
 
    <allow-intent href="http://*/*" /> 
 
    <allow-intent href="https://*/*" /> 
 
    <allow-intent href="tel:*" /> 
 
    <allow-intent href="sms:*" /> 
 
    <allow-intent href="mailto:*" /> 
 
    <allow-intent href="geo:*" /> 
 
    <platform name="android"> 
 
     <allow-intent href="market:*" /> 
 
    </platform> 
 
    <platform name="ios"> 
 
     <allow-intent href="itms:*" /> 
 
     <allow-intent href="itms-apps:*" /> 
 
    </platform> 
 
</widget>

+0

Какие версии Кордовы и iOS вы используете? –

+0

cordova 5.3.3 и ios 9.0.2 (iphone 6 plus) – chyj4747

+0

? также какие методы вы пробовали, вероятно, если вы находитесь на iOS 9 с Cordova 5, вам нужно правильно установить настройку Content-Security-Policy в ваших метатегах в index.html и исключении безопасности Apple App Transport, установленном для http: // pbcc.ca в файле Info plist вашего приложения. –

ответ

1

Xcode 7 будет использовать IOS 9 и что не позволит HTTP бэкэнда вызовов по умолчанию, если не переопределено с помощью NSAllowsArbitraryLoads и отключить App транспорт Безопасность или настроить исключение.

Вот рабочий пример изменения в ваше приложении инфо .plist:

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

А вот скрипт, который вы могли бы использовать в качестве предварительной сборки крюка для IOS, чтобы сделать это автоматически:

#!/bin/bash 
echo "Adjusting plist for App Transport Security exception." val=$(/usr/libexec/plistbuddy -c "add NSAppTransportSecurity:NSAllowsArbitraryLoads bool true" platforms/ios/PROJECTNAME/PROJECTNAME-Info.plist 2>/dev/null) echo "Done" 

Просто замените PROJECTNAME на имя вашего проекта.

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

<key>NSAppTransportSecurity</key> 
<dict> 
    <key>NSExceptionDomains</key> 
    <dict> 
     <key>pbcc.ca</key> 
     <dict> 
      <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> 
      <true/> 
     </dict> 
    </dict> 
</dict> 

Кроме того, вы должны будете установить на соединение-Src в метатеге политики безопасности Cordova в index.html. Используйте что-то вроде этого:

<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *; connect-src http://pbcc.ca"> 

Или используйте:

connect-src * 

Если вы хотите открыть для подключения к любой точке для Ajax вызовов. Дополнительная информация о политике безопасности контента может быть found here с configuration tool here.

Вам нужно будет сделать ОБА этих изменения (Content политика безопасности и исключение App Transport Security), чтобы получить эту работу с прошивкой 9/Кордова 5/XCode 7.

В дополнении от ваших публикуемых ошибок «Отказалась загрузите сценарий «http://www.pbcc.ca/xxx/index.php?callback= ...», поскольку он нарушает следующую директиву политики безопасности содержимого: «default-src» self 'data: gap: https://ssl.gstatic.com «небезопасно-eval». Обратите внимание, что' script-src 'не был явно установлен, поэтому «default-src» используется как резерв ».

Мы можем видеть, что происходит то, что вам не разрешено загружать удаленный документ, поскольку он нарушает вашу политику безопасности контента. Чтобы исправить это, установите для параметра default-src значение * или добавьте script-src www.pbcc.ca. Пример:

<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *; connect-src http://pbcc.ca; script-src http://www.pbcc.ca"> 

Примечание вы смешивания и сопоставления www.pbcc.ca и pbcc.ca, так что вы можете захотеть, чтобы убедиться, что вы указываете правильный, или использовать *, чтобы открыть его, чтобы убедиться, что все это затем блокирует его до определенного хоста (ов).

+0

Большое спасибо. – chyj4747

+0

Ну ... еще не работает. Я добавил connect-src и NSAppTransportSecurity. Я выполнил следующие шаги, чтобы проверить: 1. cordova build ios --device 2. откройте проект в xcode и запустите его на истинном устройстве, которое является iphone 6+ с IOS9. Отладка xcode показывает 0 сетевых данных. – chyj4747

+0

Будет сложно отлаживать, если вы не сможете опубликовать свой тег Content-Security-Policy полностью и соответствующий раздел вашего plist. Возможно также ваш config.xml. Видите ли вы какие-либо ошибки в консоли Xcode или добавили удаленный отладчик Safari и посмотрели на консоль JS, затем выполнили команду + R, чтобы перезагрузить страницу и посмотреть, какие ошибки вы получите? –

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