我正在创建一个使用Alamofire与API交互的iOS,并且需要为大多数请求提供令牌。我使用MVC模式构建了应用程序,它运行良好,但我遇到了一个问题,因为我试图集成API。我应该如何共享/存储令牌,以便可以从视图控制器/模型访问它?我已经阅读了很多,并且发现了使用单身人士或UserDefaults
的负面看法,但我还没有遇到一个直截了当的答案。我知道这是一个非常广泛的问题,可能没有一个简单的答案,但我对此很陌生,并且想知道是否有人可以帮我指出正确的方向。谢谢!
答案 0 :(得分:12)
如果视图控制器需要此令牌,那么您已经破坏了MVC。视图控制器没有理由直接与网络通信。这应该在模型层中处理。视图控制器在屏幕上对视图进行协调。它没有做任何其他事情。
因此,您将令牌存储在模型中。视图控制器如何访问模型?这取决于您的经验水平:
如果您对Cocoa开发还不熟悉,请使用共享实例(“单例”,但实际上它不是单例;它只是一个static let shared
属性)。几十年来,Cocoa开发人员非常成功地使用了这种模式。我们使用它是有原因的。它只是有效,你不必打它。但是,它有一些问题,这让我想到了下一个选择:
如果你有足够的iOS经验来实际遇到共享实例的问题(通常与单元测试有关,偶尔与代码重用有关),那么你就会对所有其他模式有所了解近年来,人们一直在申请(有时甚至发明)。但是,在我看来,跳入这些更复杂的模式并不是新开发人员的好方法。他们倾向于让你远离Apple打算让我们工作的方式(特别是,他们中的大多数人都认为你不会使用Storyboard,而Apple会非常努力地推动Storyboard)。有理由违背Apple的指导,它们并不总是正确的,而且一些新模式非常有趣。但是等到你有一些经验之后才决定你比Apple更了解开发Cocoa应用程序。
如果您需要将令牌存储在内存中,那么您就完成了。如果您需要坚持它并且它被认为是敏感的,那么正确的位置是Keychain。使用包装器。 Keychain API非常难以理解。任何包装都可以。 KeychainAccess这些天很流行,但实际上,其中任何一个都很好。
NSUserDefaults的主要问题是,如果有人窃取手机并越狱,那么读取NSUserDefaults比使用Keychain更容易。作为政策问题,请不要在NSUserDefaults中放置敏感信息。