这个问题试图为我的特定用例找到解决方案,并记录我为其他正在遵循此过程的人尝试做的事情.
我们有一个RESTful服务器和一个iOS应用程序.我们拥有自己的证书颁发机构,服务器具有根证书颁发机构和自签名证书.我们按照此过程生成以下文件:
http://datacenteroverlords.com/2012/03/01/creating-your-own-ssl-certificate-authority/
rootCA.pem rootCA.key server.crt server.key
只有服务器证书存储在我们的服务器上,并且作为SSL过程的一部分,公钥与API调用一起发送以进行验证.
我按照这个过程使用AFNetworking来使用证书锁定以及公钥锁定来验证我们的自签名证书:
http://initwithfunk.com/blog/2014/03/12/afnetworking-ssl-pinning-with-self-signed-certificates/
我们根据本指南将.crt文件转换为.cer文件(DER格式):
并在iOS应用包中包含.cer文件(server.cer).这成功地允许我们的应用程序向我们的服务器发出GET/POST请求.但是,由于我们的服务器证书可能会过期或重新发布,我们希望使用根CA,就像AFNetworking上此线程中的人员所做的那样:
https://github.com/AFNetworking/AFNetworking/issues/1944
目前我们已经更新到AFNetworking 2.6.0,因此我们的网络库应该包含所有更新,包括本讨论中的更新:
https://github.com/AFNetworking/AFNetworking/issues/2744
用于创建安全策略的代码:
var manager: AFHTTPRequestOperationManager = AFHTTPRequestOperationManager()
manager.requestSerializer = AFJSONRequestSerializer() // force serializer to use JSON encoding
let policy: AFSecurityPolicy = AFSecurityPolicy(pinningMode: AFSSLPinningMode.PublicKey)
var data: [NSData] = [NSData]()
for name: String in ["rootCA", "server"] {
let path: String? = NSBundle.mainBundle().pathForResource(name, ofType: "cer")
let keyData: NSData = NSData(contentsOfFile: path!)!
data.append(keyData)
}
policy.pinnedCertificates = data
policy.allowInvalidCertificates = true
policy.validatesDomainName = false
manager.securityPolicy = policy
Run Code Online (Sandbox Code Playgroud)
通过包含server.cer,我们可以通过固定公钥来信任我们的服务器(也尝试过AFSecurityPolicyPinningMode.Certificate); 这很有效,因为包含了确切的证书.但是因为我们可能会更改服务器所具有的server.crt文件,所以我们希望能够只使用rootCA.cer来完成它. …
我的应用程序的几个版本崩溃了,似乎已经开始在iOS8上发生了.我只通过崩溃报告来体验它,并且无法在我的测试设备上重现它.似乎是当用户捕获图像(或从库中选择它?)时,由于图像为零,因此无法设置原始图像.我在搜索时可以找到的最接近的问题是:
https://github.com/B-Sides/ELCImagePickerController/issues/58
另一种可能性是当它以特定的竞争状态时序为背景时,我也无法重现.
http://openradar.appspot.com/19953748
但我认为我的错误不是来自正在选择的流图像.我希望看看是否有其他人收到此错误,并且已找出一个解决方案以始终捕获异常,或检测何时发生这种情况,或禁用特定的用户操作(如在上传照片时设置应用程序)以避免崩溃.
致命异常:NSInvalidArgumentException***setObjectForKey:object不能为nil(key:UIImagePickerControllerOriginalImage)
Thread : Fatal Exception: NSInvalidArgumentException
0 CoreFoundation 0x2b381fef __exceptionPreprocess + 126
1 libobjc.A.dylib 0x39633c8b objc_exception_throw + 38
2 CoreFoundation 0x2b29daa3 -[__NSDictionaryM setObject:forKey:] + 850
3 PhotoLibrary 0x345bf8f3 __CreateInfoForImage
4 PhotoLibrary 0x345bf1ad PLNotifyImagePickerOfImageAvailability
5 PhotoLibrary 0x345d384b -[PLUICameraViewController cameraView:photoSaved:]
6 PhotoLibrary 0x34606a73 -[PLImagePickerCameraView cropOverlay:didFinishSaving:]
7 PhotoLibrary 0x3460706d -[PLImagePickerCameraView captureController:didCompleteResponse:forStillImageRequest:error:]
8 CameraKit 0x303392a5 -[CAMCaptureController _completedResponse:forRequest:error:]
9 CameraKit 0x30338bfb __56-[CAMCaptureController enqueueStillImageCaptureRequest:]_block_invoke_32160
10 libdispatch.dylib 0x39b9e2e3 _dispatch_call_block_and_release + 10
11 libdispatch.dylib 0x39b9e2cf _dispatch_client_callout + 22
12 libdispatch.dylib 0x39ba1d2f _dispatch_main_queue_callback_4CF + …
Run Code Online (Sandbox Code Playgroud) 我有一个原本不是故事板应用程序的应用程序.我已经为一个功能分支添加了一个故事板,并且它上面有一个子类UITableViewController
.我创建了一个原型细胞与几个UILabels
和UIImageViews
,并添加标签为他们每个人.原型单元具有正确的标识符.
我已经使用标识符注册了类:
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"CustomCell"];
Run Code Online (Sandbox Code Playgroud)
当我尝试将自定义单元格出列并访问其视图时:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CustomCell" forIndexPath:indexPath];
UIImageView *icon = (UIImageView *)[cell viewWithTag:1];
Run Code Online (Sandbox Code Playgroud)
视图(图标)为零.
我也尝试了对它进行子类化,并使用重用标识符注册子类,并UITableViewCell
在原型中设置子类名称.在这种情况下,
UIImageView *icon = cell.icon;
Run Code Online (Sandbox Code Playgroud)
仍然返回零.
故事板与主要故事板有关吗?我有其他项目,其中定制的原型单元subviews
正常工作没有这些麻烦.有没有办法注册自定义类或UITableViewCell
自定义标识符,但指定它来自哪个故事板?