Tag: ios frameworks

iOS上的模块化架构以及我如何将构建时间减少了50%。

最近,我被Freelancer聘为iOS工程师,负责他们的核心iOS应用程序。 作为一个年轻,新鲜,进取,积极进取(感谢YouTube激励视频)的大佬,我喜欢编码,我建议我们对该项目进行大约6项改进,以改进它。 更大的问题之一是关于应用程序的编译时间。 当我开始时,清洁后大约花了15分钟。 在这篇文章中,我将描述如何解决如何提高编译时间以及将项目从仅依赖CocoaPods的项目转换为一个分为独立框架组件的项目所经历的过程,我们从中获得的收益以及整个过程过程进行了。 本文部分涉及CocoaPods和迦太基。 对于那些不知道他们是什么的人,我将在这里做一个简短的介绍。 如果您已经熟悉两者,请随时跳过本节。 – CocoaPods https://cocoapods.org/ –迦太基https://github.com/Carthage/Carthage CocoaPods和Carthage都是第三方依赖工具。 它们之间的主要区别是编译以及如何将库附加到项目。 Cocoapods中的Pod是与您的应用程序代码绑定在一起并一起编译的库。 每次您对项目进行清理时,都必须编译所有第三方库。 如果您的项目使用很多库,则编译库会花费大量时间。 迦太基的做法有所不同:它获取库并将其构建到框架中。 然后必须手动集成构建的库。 使用Carthage构建库还需要花费更长的时间,因为它们是针对所有不同处理器架构进行编译的。 但是,无需在项目中进行清理后对其进行重建; 仅当要将库更新到新版本时,才应再次构建库。 应该注意的是,一个库可以被更新而不接触其他所有库。 内置库链接到项目,并在编译后附加到应用程序。 与CocoaPods设置相比,设置Carthage并将所有库链接到项目可能很耗时。 两种工具各有利弊。 通常,CocoaPods库更易于添加,删除和维护,但必须在清理后再次编译。 迦太基的添加,删除和维护更加困难,但是节省了时间,因为在清理项目后不会再次编译所有库。 该项目自2012年以来一直在开发中。我不得不处理大量旧代码,并一路将某些Objective-C类重写为Swift等。但是总的来说,最大的问题是CocoaPods库。 我们大约有80个与该应用程序捆绑在一起的库,这当然花费了大量时间。 不幸的是,由于某些库具有依赖性,尤其是内部开发的库,要摆脱CocoaPods库并不像用Carthage替换库那样容易。 内部开发了80个CocoaPods库中的18个。 例如,Core库处理API和持久性,Components库具有UI组件,而Feature1库当然具有feature1,依此类推。 我对CocoaPods依赖关系图非常不满意,即Core库将Moya,RxSwift,RxMoya,SwiftyJSON等作为依赖关系,而Core库是Feature1库的依赖关系,Feature1库具有自己的依赖关系,如RxCocoa,RxDataSources等。 …下图描述了我们拥有的CocoaPods库的简化依赖关系图。 请从上图中的18个内部CocoaPods库和62个第三方中想象这个概念……那么,仅安装CocoaPods库需要花费一些时间。 您可以通过在内部podspec中添加其他一些依赖关系来轻松地打破树形结构,因为每个内部库都有其自己的podspec,因此很难组织特定第三方库的来源。 这个主意 清洁后编译第三方Pod大约需要6分钟,这是无法接受的。 但是我不能随便用框架版本替换例如Alamofire,因为Moya将Alamofire作为依赖项,因此RxCocoa具有RxSwift等等。 因此,如果我要用其框架版本替换Alamofire,则Moya库将始终下载Alamofire,因为它依赖于它。 最后,我将获得两个与该项目链接的Alamofire库,一个是手动库,另一个是与CocoaPods一起使用。 这只是问题的一个例子,不用说我在其他62个库中也遇到了类似的问题。 我不想这样做。 我们决定摆脱内部Pod,而是创建框架。 我们不想放弃CocoaPods,因为我们的某些CocoaPods库与Carthage不兼容,说实话,用CocoaPods测试新库比使用Carthage容易得多。 我们的目的是同时拥有这两个功能-包括由Carthage与CocoaPods共同构建的第三方库,以及我们的内部框架和项目。 好主意…这就是真正的工作开始的地方。 在对如何将Pod与框架结合在一起进行研究之后,我创建了一个有效的概念证明,但我对此并不十分确定,也不知道它在大型项目中将如何工作。 关于框架 框架是什么? 我们可以将框架看作是独立的并可以链接到项目的捆绑包。 库和框架之间的主要区别在于控制反转(IoC)。 当您使用库中的内容时,就可以对其进行控制。 另一方面,当您使用框架中的某些内容时,您会将其责任转移给框架。 […]

包括一个iOS框架到另一个

问题是,当我为iOS创build一个使用不同框架的框架时,我还必须在我的应用程序中包含第二个框架。 我想尝试的是将第二个框架编译成使用它的新框架。 所以这都是一个包。 这甚至有可能吗? 如果是这样,怎么样?

确定二进制文件是否包含Bitcode的方法似乎不再适用

在我search一个方法来确定是否一个iOS二进制与Bitcode构build,我发现了以下post: 如何检查一个框架是否支持Xcode7的BITCODE 在这里,build议使用以下方法来确定二进制代码是否存在: $ otool -l libName.o | grep __LLVM 不过,我已经尝试了几个二进制文件没有成功。 其中之一是一个我知道有位代码的库,因为我改变了项目的标志之后,编译错误消失了。 另一个是文件扩展名的二进制文件,使用Archive进行构build。 另一个是苹果手表。 我相信所有上述二进制文件都应该有位码,但是我始终没有得到上述命令的结果。 有没有人知道任何其他方法与最新的二进制文件? 我使用XCode 7.2和10.10.5以防万一。 更新:这是一个应该有bitcode的文件的例子,但上面的命令不返回任何东西。 它是来自testing文件提供程序的二进制文件。 我通过存档和部署生成它作为Ad Hoc,并确保为目标设置位代码。 https://www.dropbox.com/s/eyuzs5j1t7nsq6t/CustomDocumentProviderFileProvider?dl=0

在iOS中的项目中添加第三方框架

我想在我的iPad应用程序中使用NinevehGL框架 。 我已经将框架添加到我的Xcode项目。 但是,当我运行我的应用程序,它成功执行。 注意:在我安装NinevehGl.pkg之后,NinevehGl框架显示在项目模板本身中。 我select这个模板意味着它会自动创build链接二进制库中的一些框架。 但我的问题是:当在其他mac中运行相同的Xcode项目,它崩溃。 因为其他的Mac没有安装这个软件包。 所以我想在项目本身中添加这个框架。 如何添加这个?

多个框架和公共库

使用iOS 8, Xcode 6 。 假设我有两个dynamic框架, frameworkA和frameworkB ,它们都依赖于libC 。 另外,我有一个使用frameworkA和frameworkB的应用程序。 我最初的想法是使frameworkA和frameworkB伞架和libC成为一个子框架。 然而,苹果公司反对伞架构,并且这篇文章描述了伞架由于潜在的链接器冲突问题而成为坏主意的原因。 我的第二个select是使用cocoapods(对于这个还是新的,所以对于细节有些模糊)使用libC作为一个pod,然后将其编译到frameworkA和frameworkB 。 但是,我想到这两个框架仍然有它自己的libC副本。 由于该应用程序使用这两个框架,这是否也会导致链接器冲突问题? 有没有更好的方法来解决这个问题? 更新 @Rob我工作的项目确实需要复杂的依赖关系pipe理,但我在问题中保持了问题域的简单性,试图更好地理解如何使用cocoapods可以帮助解决伞架的链接器冲突问题。 我和一群编写库的开发人员合作,可以依靠彼此的基本库来提供版本化的公共API。 我们被要求打包和交付尽可能less的图书馆到一个不同的组织,这是与我们的图书馆build立一个应用程序,他们的一个关键要求是,我们提供了一个dynamic的框架。

在子项目(框架项目)中使用第三方窗格

我正在使用XCode 8 + Swift 3。 我创build了一个名为“ MyApp ”的新的iOS项目。 然后,我创build一个名为“MySubProject”的Cocoa touch 框架项目。 (这个想法是让MyApp项目访问MySubProject代码。) 他们在同一级别的文件夹中: – MyApp/ – MySubProject/ 我将MySubProject添加到MyApp项目中,链接了MySubProject框架。 一切工作正常。 我的项目结构如下所示: 所有作品,直到这里! (MyApp代码可以访问MyService代码) 现在,我需要MySubProject使用Alamofire与后端进行通信。 所以,在MySubProject/我设置Alamofire与CocoaPod,创buildMySubProject.xcworkspace 。 我想我需要删除以前的MySubProject.xcodeproj并使用MySubProject.xcworkspace ,所以我删除了MySubProject.xcodeproj的引用MySubProject.xcodeproj添加到MyApp ,它看起来像这样: 正如你所看到的,我现在看不到MySubProject的源代码。 在Framework子项目中通过CocoaPod使用Alamofire或任何第三方库的正确方法是什么? =====更新======我需要将Alamofire添加到MySubProject ,而不是MyApp 。 我按照Alamofire官方网站的指示手动添加Alamofire到MySubProject ,项目结构如下所示: – MyApp – MySubProject.xcodeproj -Alamofire.xcodeproj 之后,我可以访问MySubProject中的Alamofire,没有编译错误。 但是,当我在模拟器中运行我的应用程序,我得到运行时错误: Referenced from: /Users/myname/Library/Developer/Xcode/DerivedData/MyApp-hezjlyvzxnavccenabxdepgftbrg/Build/Products/Debug-iphonesimulator/Alamofire.framework/Alamofire Reason: image not found 如何解决?

没有find框架Xcode

我知道这已经被问了几次了。 我遵循这些指示: 将框架添加到Xcode 5中的项目中,并添加了*相对*path xcode4:链接器错误:未find选项的目录 仍然xcode是给这个错误: 这是我目前的configuration: 螺栓框架是我可以使用parsingSDK。 我从这里下载了空白项目: https : //parse.com/apps/quickstart#parse_data/mobile/ios/native/new 它正在工作。 我试图复制每一个configuration,它仍然无法正常工作。

iOS 8是否支持dynamic链接?

直到iOS7,由于安全考虑,Apple不支持dynamic链接。 开发人员之间的代码重用通常依赖于静态库,它是作为应用程序可执行文件的一部分而构build的。 在iOS8中引入扩展似乎改变了这一点,因为扩展是单独的可执行文件。 在扩展和其包含的应用程序之间共享代码是通过框架完成的。 苹果在发行说明中这样说: iOS的框架。 iOS开发人员现在可以创builddynamic框架。 框架是代码和资源的集合,用于封装在多个项目中有价值的function。 框架可以与扩展一起工作,共享可以被主应用程序和捆绑扩展使用的逻辑。 重点是我的。 来源: https : //developer.apple.com/library/content/documentation/Xcode/Conceptual/WhatsNewXcode-Archive/Articles/xcode_6_0.html#//apple_ref/doc/uid/TP40014509-SW14 此外,在扩展开发指南中,他们解释说,您可以通过“embedded式框架”在扩展和包含应用程序之间共享代码。 资料来源: https : //developer.apple.com/library/content/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple_ref/doc/uid/TP40014214-CH21-SW1 我的问题是 – 什么是embedded式框架,它与dynamic框架有什么不同,我们真的会看到适当的iOS8dynamic链接吗? 我读过的所有文档似乎都是模棱两可的。

错误ITMS-90206无效的包包含不允许的文件“Frameworks”

我有一个问题上传我的应用程序进入商店通过Xcode,特别是这一个。 我看到很多关于这个错误的post,但都是在谈论Extension App ,我不使用。 我正在使用Custom framework和Cocoapods 。 你可以在这里看到我的树: XXX是我的项目应用程序名称 SharedXXX是我的custom framework 豆荚是由cocoa pods创build的项目 这是我的cocoapodFile : use_frameworks! link_with 'XXX', 'SharedXXX' source 'https://github.com/CocoaPods/Specs.git' platform :ios, '8.1' workspace 'XXX' xcodeproj 'XXX/XXX.xcodeproj' xcodeproj 'Shared/SharedXXX.xcodeproj' def default_pods pod 'Reveal-iOS-SDK', :configurations => ['Debug'] pod "SnapKit", '~> 0.17.0' pod "DKChainableAnimationKit", '~> 1.6.0' pod "AsyncSwift" end def shared_pods pod "Alamofire", '~> 3.0' pod […]

我可以build立自己的networking框架(依赖于AFNetworking)作为watchOS2框架吗?

我一直在试图修改我的项目来支持WatchOS2架构。 目前我有一个基于AFNetworking的networking框架。 到目前为止,我一直在使用我的手表应用程序。 现在我正在尝试构buildwatchos / watchsimulator平台的框架。 我得到的是一些AFNetworking类的“SystemConfiguration / SystemConfiguration.h”文件找不到错误。 我知道系统configuration不是watchOS2可用的系统框架之一。 而对于networking苹果说 : 联网 支持基于networking的操作包括以下技术: WatchKit扩展可以使用NSURLSession对象直接访问networking。 WatchKit扩展可以完全访问NSURLSessionfunction,包括在后台下载文件的能力。 有关如何使用此类的信息,请参阅URL加载系统编程指南。 Watch Connectivity框架支持Watch应用程序和iOS应用程序之间的双向通信。 使用此框架来协调这两个应用程序之间的活动。 有关更多信息,请参阅与您的Companion iOS应用程序通信。 我想支持iOS和watchos为我的networkingsdk。 有没有办法使这个项目为watchOS平台build立? 或者是这意味着我只允许在我的手表应用程序内使用NSURLConnection?