2017-09-18 8 views
0

문제가 생겼습니다. QT, 크로스 플랫폼, iOS & android에서 앱을 만들고 있습니다. 이 코드를 호출 할 때 그래서 :QNetworkReply https API가 Android 기기에서 작동하지 않습니다. - QT

QList<QString> JsonFunctions::getToken(QString Username, QString Password) 
{ 
    QString lista; 
    QEventLoop eventLoop; 
    QNetworkAccessManager mgr; 
    QObject::connect(&mgr, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(quit())); 

    QJsonObject json; 

    json.insert("username", Username); 
    json.insert("password", Password); 
    json.insert("client_id","10"); 
    json.insert("client_secret","xxx"); 
    json.insert("scope","xxx"); 
    json.insert("grant_type","password"); 
    json.insert("accept", "application/json"); 

    QNetworkRequest request(QUrl("https://xxxxx/api/v2/login")); 
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); 

    QSslConfiguration conf = request.sslConfiguration(); 
    conf.setPeerVerifyMode(QSslSocket::VerifyNone); 
    request.setSslConfiguration(conf); 

    QNetworkReply *reply = mgr.post(request, QJsonDocument(json).toJson()); 
    eventLoop.exec(); 

    QString strReply = (QString)reply->readAll(); 
    qDebug() << "reply" << strReply; 
    qDebug() << "code" << reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); 

    QJsonDocument doc = QJsonDocument::fromJson(strReply.toUtf8()); 
    QJsonObject responseObject = doc.object(); 

    QString token_type = responseObject.value("token_type").toString(); 
    QString access_token = responseObject.value("access_token").toString(); 
    QString refresh_token = responseObject.value("refresh_token").toString(); 

    QList<QString> lists; 
    lists.append(token_type); 
    lists.append(access_token); 
    lists.append(refresh_token); 

    return lists; 
} 

문제는 안드로이드에이 코드가 작동하지 않는다는 것입니다. 대신 ios가 작동합니다. 안드로이드에 대한 회신은 비어 있습니다.

https url이 (가) 안드로이드 전화에서 문제를 만들었습니까? 나는 그것을 고치는 방법을 이해하지 못한다. 매니페스트에서 인터넷 권한이 설정되어있는 많은 권한을 기기에 설정했습니다.

이제 많은 아이디어가 작동합니까? 나는 asus zen pad 3s와 iphone 7을 테스트 중이다. 안드로이드에서만 작동하지 않는다. 왜 ? Qt 5.9를 사용합니다.

미리 감사드립니다.

답변

1
  1. QNetworkAccessManager을 비동기 API로 사용해야합니다. 요청이 완료되면 finished(QNetworkReply *reply) 신호가 방출됩니다. 이 신호에 연결하고 신호를 읽습니다.

  2. 실제로 "동기식"으로 설정해야하는 경우 완료 신호를 exit() eventLoop 슬롯에 연결하십시오. 또한 이전에 SSL errors이 있었는지 확인하는 것이 좋습니다.

  3. 일부 Android 장치에는 OpenSSL 라이브러리가 필요합니다. 이것은 나를 위해 문제를 일으키고 있었다. OpenSSL/libcrypto.so 및 OpenSSL/libssl.so가 필요했습니다. QSslSocket::supportsSsl()이 true를 반환하는 경우에도 마찬가지입니다.