小编Wom*_*ble的帖子

iOS/Cocoa - NSURLSession - 处理基本的HTTPS授权

[编辑提供更多信息]

(我没有在这个项目中使用AFNetworking.我可能会在将来这样做,但希望先解决这个问题/误解.)

服务器设置

我不能在这里提供真正的服务,但它是一个简单,可靠的服务,它根据URL返回XML,例如:

https://开头的用户名:password@example.com/webservice

我想使用GET通过HTTPS连接到URL,并确定任何身份验证失败(http状态代码401).

我已经确认Web服务可用,并且我可以成功(http状态代码200)使用指定的用户名和密码从URL中获取XML.我使用Web浏览器和AFNetworking 2.0.3以及使用NSURLConnection完成了这项工作.

我还确认我在所有阶段使用正确的凭据.

鉴于正确的凭据和以下代码:

// Note: NO delegate provided here.
self.sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
self.session = [NSURLSession sessionWithConfiguration:self.sessionConfig
                                  delegate:nil
                             delegateQueue:nil];

NSURLSessionDataTask *dataTask = [self.session dataTaskWithURL:self.requestURL     completionHandler: ...
Run Code Online (Sandbox Code Playgroud)

上面的代码将起作用.它将成功连接到服务器,获取http状态代码200,并返回(XML)数据.

问题1

在凭证无效的情况下,这种简单方法会失败.在这种情况下,永远不会调用完成块,不提供状态代码(401),最终任务超时.

经过尝试的解决方案

我为NSURLSession分配了一个委托,并处理以下回调:

-(void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler
{
    if (_sessionFailureCount == 0) {
        NSURLCredential *cred = [NSURLCredential credentialWithUser:self.userName password:self.password persistence:NSURLCredentialPersistenceNone];        
    completionHandler(NSURLSessionAuthChallengeUseCredential, cred);
    } else {
        completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil);
    }
    _sessionFailureCount++;
}

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge
 completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition …
Run Code Online (Sandbox Code Playgroud)

authentication cocoa http ios nsurlsession

16
推荐指数
3
解决办法
2万
查看次数

处理非常大量的Swift类

使用Swift 3定位iOS 9+

我的应用程序使用了数百个(可能是数千个)Swift类.

每个班级负责绘制特定的矢量图稿.该作品在Sketch中创建,并使用PaintCode插件导出为Swift类.每个类都非常复杂和冗长,有大量数据.然后将类文件提供给自动命令行工具,该工具将特定于应用程序的功能写入文件,从而使艺术变得具有交互性和灵活性.生成的Swift文件将添加到应用程序的Xcode项目中.

由于Swift不允许按名称动态加载/创建类(可随意更正),我的应用程序将处理后的Swift类添加到绘图类的查找表中.当应用程序需要绘制特定的艺术作品时,将读取类查找表,返回相关的类,然后用于绘制艺术作品.

我担心一旦项目进入全面生产,这种方法可能不可行,届时将产生数百或数千个类.可能的问题包括:

  • 编译时间
  • 代码大小
  • app加载时间
  • Xcode/SourceKitServer稳定性/崩溃

为此,我希望在成为交易破坏者之前克服可能出现的问题.

特别:

问:我应采取什么方法来尽量减少重新编译?在框架或其他机制中将类组捆绑在一起是否可行?

问:代码大小和应用加载时间相同.如何对代码进行分组,以便我可以更轻松地按需加载类组?Frameworks会帮助解决这些问题吗?

我们可能会错过任何建议或其他考虑因素.

[编辑 - 很多个月以后很多工作]

由于上述原因,我放弃了对PaintCode或其他艺术代码解决方案的尝试.

虽然这些产品对于少量艺术品来说非常好,但是系统不能很好地适应大规模生产,当然也不适用于Swift及其在Xcode 8中的支持状态.

相反,我采用了基于文件的方法,其中在Sketch中准备艺术作品,并使用绘图信息标记图层.这些导出为SVG.引擎按需加载SVG ,对其进行解析,标记用于指示/指导特定于应用程序的逻辑和绘图.由于涉及的工作量很大,这对少数艺术作品来说是不可行的 - 坚持使用PaintCode - 但是一旦完成它就可以提供大量的灵活性和速度,而不会出现所有Xcode和sourcekitservice崩溃.

这种方法允许艺术资产像通常那样进行争论:分组在文件夹中,按需加载,缓存,释放等.

ios swift

6
推荐指数
1
解决办法
558
查看次数

Swift 4 - Xcode 9 beta 4 - NSKernAttributeName vs NSAttributedStringKey

iOS部署目标:iOS 9.3,基础SDK:最新iOS(iOS 11.0),Xcode 9 Beta 4,Swift 4

以下代码在Swift 3,Xcode 8中构建和运行:

    let kern = (CTRunGetAttributes(run) as? [String : Any])?
[NSKernAttributeName] as? CGFloat ?? 0
Run Code Online (Sandbox Code Playgroud)

但是,Swift 4迁移器将其转换为:

    let kern = (CTRunGetAttributes(run) as? [String : Any])?
[NSAttributedStringKey.kern] as? CGFloat ?? 0
Run Code Online (Sandbox Code Playgroud)

Xcode 9现在抱怨:

Cannot subscript a value of type '[String : Any]' with an index of type 'NSAttributedStringKey'
Run Code Online (Sandbox Code Playgroud)

根据检查员的说法,' NSAttributedStringKey'仅适用于iOS 11.(请记住,我的目标是iOS 9).

如果我将' NSAttributedStringKey.kern' 替换为' NSKernAttributeName',则错误仍然存​​在.

按住命令' NSKernAttributeName'告诉我它的可用性是iOS 6.但是,检查员还声称它的类型是' NSAttributedStringKey',这仅在iOS 11中可用.我不知道这是否仅仅是API演示的假象,或者是一种东西,或者我缺少的东西.

问题:如何使用NSKernAttributeName(或其现代化版本)向后兼容iOS 9和Swift 4?

感谢您的任何帮助.

xcode ios swift4 xcode9-beta

3
推荐指数
1
解决办法
3057
查看次数

在 UIImageWriteToSavedPhotosAlbum 中使用 contextInfo、UnsafeRawPointer - Swift 3

我有一个UITableView. 当一个单元格被点击时,我的应用程序会生成一个相关的图像。图像生成是在后台线程上完成的,因为有些图像需要相当长的时间来渲染。渲染图像后,UIImageWriteToSavedPhotosAlbum在主线程上调用。

由于任何数量的UIImageWriteToSavedPhotosAlbum任务可能以任何顺序进行,我需要一种方法来跟踪每个任务。我希望indexPath将所选单元格的存储为contextInfo,将其传递给UIImageWriteToSavedPhotosAlbum.

image:didFinishSavingWithError:contextInfo:被调用时,我需要从 contextInfo 中获取 indexPath。

但是,绝大多数在线示例UIImageWriteToSavedPhotosAlbum通过 nil for contextInfo.

我已经阅读了官方文档、Swift 3 指针迁移指南、头文件、使用桥接和强制转换的 Objective-C 代码,以及许多关于UnsafeMutableRawPointer/主题的 SO 线程UnsafeRawPointer

最终结果:我被无数的选择弄糊涂了,不知道我是否遗漏了一些明显的东西,我是否应该load()在指针数据上执行,应该调用unsafeBitCast(),还是应该将山羊献给众神。

或者,重新评估我的职业生涯,成为一名木匠。

一季度。如何IndexPath以适合 contextInfo 的形式存储 的实例?

Q2。一旦image:didFinishSavingWithError:contextInfo被调用,我如何形成一个IndexPathout of contextInfo,以便获取我存储的数据?谢谢你。

ios swift

1
推荐指数
1
解决办法
1601
查看次数

标签 统计

ios ×4

swift ×2

authentication ×1

cocoa ×1

http ×1

nsurlsession ×1

swift4 ×1

xcode ×1

xcode9-beta ×1