我有一些典型的代码使用HttpURLConnection来获取带有URL的文件.他们在android 1.x和2.x中运行良好.但在Android 4.1中失败了!
我在网上搜索但发现的信息很少.有人请帮忙调查这个问题吗?
private String mURLStr;
private HttpURLConnection mHttpConnection;
...
url = new URL(mURLStr);
...
mHttpConnection = (HttpURLConnection) url.openConnection();
mHttpConnection.setDoOutput(true);
mHttpConnection.setRequestMethod("GET");
...
InputStream is = mHttpConnection.getInputStream();
Run Code Online (Sandbox Code Playgroud)
getInputStream方法抛出异常:
08-01 15:56:48.856: W/System.err(13613): java.io.IOException: No authentication challenges found
08-01 15:56:48.856: W/System.err(13613): at libcore.net.http.HttpURLConnectionImpl.getAuthorizationCredentials(HttpURLConnectionImpl.java:427)
08-01 15:56:48.866: W/System.err(13613): at libcore.net.http.HttpURLConnectionImpl.processAuthHeader(HttpURLConnectionImpl.java:407)
08-01 15:56:48.866: W/System.err(13613): at libcore.net.http.HttpURLConnectionImpl.processResponseHeaders(HttpURLConnectionImpl.java:356)
08-01 15:56:48.866: W/System.err(13613): at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:292)
08-01 15:56:48.866: W/System.err(13613): at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168)
...
Run Code Online (Sandbox Code Playgroud) 根据我的理解,SSL Pinning是预先将服务器的公钥或认证与客户端中捆绑的副本进行比较.
我在Stackoverflow中看到许多开发人员使用AFNetwork库的SSL Pinning,但他们中的大多数都使用它和自签名证书.
我从CA购买了有效的证书并通过了测试以验证它是否正常工作.我的意思是,我设置以下内容并且有效
...
_sharedHttpsInstance.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
_sharedHttpsInstance.securityPolicy.allowInvalidCertificates = NO;
...
Run Code Online (Sandbox Code Playgroud)
我想知道的是,如果将Pinning模式设置为AFSSLPinningModePulicKey,除了有效证书提供的内容之外,我的应用程序在与服务器的通信方面会更安全吗?
非常感谢.
我尝试将versionName定义为要在我的gradle配置文件app/build.gradle中使用的ext变量.
ext {
versionCode = 19
versionName = "1.2.3"
...
}
...
android {
...
defaultConfig {
...
versionCode versionCode
versionName versionName
}
...
}
...
task updateReleaseMetadata(type:Exec) {
commandLine 'sh'
args "MyShellScript.sh", versionName
}
...
Run Code Online (Sandbox Code Playgroud)
看起来工作得很好.但是我的android代码无法检索versionName,如下所示
PackageInfo pi = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
return pi.versionName; // return null
Run Code Online (Sandbox Code Playgroud)
我想我没有以正确的方式使用gradle.任何帮助都会得到满足.