Я делаю ту же задачу как это.
//in MessageHeader
private void SetValuesDefault()
{
MessageHeader header = this;
Framework.ObjectPropertyHelper.SetPropertiesToDefault<MessageHeader>(this);
}
//in ObjectPropertyHelper
public static void SetPropertiesToDefault<T>(T obj)
{
Type objectType = typeof(T);
System.Reflection.PropertyInfo [] props = objectType.GetProperties();
foreach (System.Reflection.PropertyInfo property in props)
{
if (property.CanWrite)
{
string propertyName = property.Name;
Type propertyType = property.PropertyType;
object value = TypeHelper.DefaultForType(propertyType);
property.SetValue(obj, value, null);
}
}
}
//in TypeHelper
public static object DefaultForType(Type targetType)
{
return targetType.IsValueType ? Activator.CreateInstance(targetType) : null;
}
NSURLConnection
выдаст ошибку ( NSURLErrorDomain
), если вы попытаетесь подключиться к серверу с недопустимым сертификатом (например, он самоподписан, устарел, имеет неправильный хост и т. Д.) . Так что на самом деле вам не нужно выполнять какие-либо проверки самостоятельно, потому что все это делается за вас.
Если вы действительно хотите / должны отображать сводку сертификата SSL в вашем пользовательском интерфейсе, вам нужно будет раскрыть уровень из NSURLConnection
и используйте вместо него низкоуровневый CFNetwork
API. Если у вас есть CFReadStreamRef
, находящийся в состоянии kCFStreamEventEndEncountered
, вы сможете сделать следующее (при условии, что дескриптор вашего потока называется readStream
):
NSArray* certificates = [(NSArray*)CFReadStreamCopyProperty(readStream, kCFStreamPropertySSLPeerCertificates) autorelease];
if ([certificates count] > 0) {
SecCertificateRef certificate = (SecCertificateRef)[certificates objectAtIndex:0];
NSString* description = [(NSString*)SecCertificateCopySubjectSummary(certificate) autorelease];
NSData* data = [(NSData*)SecCertificateCopyData(certificate) autorelease];
}
Вы'