我正在创建一个框架,如果你愿意,可以使用CoreData.该框架还具有CoreData之外的功能.如何在IfDef中包装所有CoreData特定代码,检查CoreData框架是否可用?
core-data objective-c conditional-compilation ios ios-frameworks
我正在创建一个包含xib文件的静态iOS框架(Xcode 6中的默认模板).
但是,在将我的框架添加到另一个应用程序时,我无法加载nib文件,我收到以下错误:
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle </private/var/mobile/Containers/Bundle/Application/89B7C8F1-698A-4E0B-AD8F-4DB414A6001B/Sample.app> (loaded)' with name 'MyNibName''
Run Code Online (Sandbox Code Playgroud)
我尝试了几种解决方案,其中一些在此概述.我仍然无法解决这个问题.
我看到很多对这个流行项目的引用现在都不受支持,因为xcode具有内置功能.我应该使用它吗?
在我的框架目标中,我将xib文件包含在"复制包资源"构建阶段,我在构建的框架目录中看到它们,但是,我注意到生成的框架结构不遵循apple文档中概述的结构.即使我更改了框架结构(使用版本并将文件夹Header
和Resources
文件夹链接到当前版本),我仍然无法解决问题.
我尝试通过以下方式加载我的笔尖:
1按框架名称加载bundle,nil
在这种情况下是bundle
NSString *resourceBundlePath = [[NSBundle mainBundle] pathForResource:@"myframework" ofType:@"framework"];
resourcesBundle = [NSBundle bundleWithPath:resourceBundlePath];
self = [super initWithNibName:@"MyNibName" bundle:resourcesBundle];
Run Code Online (Sandbox Code Playgroud)
2创建资源包并将其添加到框架中.也是nil
.请注意,如果我将捆绑包单独添加到项目中,则此解决方案有效,但这会破坏框架的用途.
NSString *resourceBundlePath = [[NSBundle mainBundle] pathForResource:@"resources" ofType:@"bundle"];
resourcesBundle = [NSBundle bundleWithPath:resourceBundlePath];
self = [super initWithNibName:@"MyNibName" bundle:resourcesBundle];
Run Code Online (Sandbox Code Playgroud)
3按类加载bundle仍然无法正常工作,但它返回的应用程序包与中的相同[NSBundle …
我正在尝试将针对arm64,armv7和armv7s的项目构建上传到TestFlight.它正在使用另一个项目的框架.但frameowork似乎只为arm64而不是arm64(file was built for arm64 which is not the architecture being linked (armv7)
)构建.
问题是如何使框架包含所有体系结构?我希望将项目分开.而且我不关心模拟器.我想确保它是为发布而构建的.
这是框架目标:
编辑:我的项目是基于Cordova.所以它使用的是一个使用预构建框架的插件.有一些说明用于构建一个胖框架,包含模拟器和设备,然后将其连接起来lipo
.我需要的是我没有的设备架构.这是否意味着我需要arm64,armv7和armv7s中的三个设备才能将它们完全连接起来?
我需要创建一个UI类包装,可以由开发人员包含在XCode4 集成项目中,然后通过使用配置文件和NSClassFromString(一个静态插件)来实例化.我已经成功创建了包含基于代码布局的UIViews的库.现在我试图让开发人员基于xib文件和其他资源创建UI.我正在实现这个最基本的版本...一个UIViewController加载直接通过XCode4中的"新文件"向导创建的xib文件.我正在做的唯一修改是在xib中为UI添加标签.
我在加载xib时遇到问题.如果我在集成项目中包含xib 一切都很好.当我从库中创建UIViewController时,它会在应用程序包的根目录中找到xib并加载它.但是,在构建集成项目期间这非常麻烦,我希望能够只链接到库而不必将每个xib 单独添加到集成项目中.此外,应用程序包的根目录的使用是不好的,因为没有可以促进多个静态插件的目录结构 .我尝试创建一个集成项目在构建期间可以包含的文件夹, 静态插件的xib可以在构建之前转储到文件夹中.如果我这样做,xib会进入app bundle,但是当UIViewController类加载时,它无法找到xib.我无法编写解决方案来获取UIViewController到initWithNibName:bundle:当xibs在子文件夹中时正确.
我的最后一次尝试是使用这篇文章创建一个静态框架:http: //simplyitinc.blogspot.com/2011/04/creating-static-framework-in-xcode-4.html.这似乎得到了一个我可以链接的框架,xib在该框架目录中但是......当我链接到框架时,xib没有放入应用程序包中.我的类可用,但无法加载xib,显然是因为它不在应用程序包中.
关于如何完成这项要求的任何建议?
我正在为一家公司制作一个框架,我已经完成了所有代码.我现在正试图将它打包成一个框架.作为测试我用这个名字做了一个方法:-(void)Hello:(NSString *)worldText;
当我尝试使用此代码在框架的应用程序中调用它时[CompanyMobile Hello:@"World"];
,我收到一个编译器错误
没有已知的选择器'Hello:'的类方法
我框架中的.m如下:
#import "Hello.h"
@implementation Hello
- (id)init
{
self = [super init];
if (self) {
// Initialization code here.
}
return self;
}
-(void)Hello:(NSString *)world {
}
@end
Run Code Online (Sandbox Code Playgroud)
我框架中的.h如下:
#import <Foundation/Foundation.h>
@interface Hello : NSObject
-(void)Hello:(NSString *)world;
@end
Run Code Online (Sandbox Code Playgroud)
我的申请中的.h
//
// FMWK_TESTViewController.h
// FMWK TEST
//
// Created by Sam on 6/15/11.
// Copyright 2011 __MyCompanyName__. All rights reserved.
//
#import <UIKit/UIKit.h>
#import <companyMobile/Hello.h>
@interface FMWK_TESTViewController : UIViewController
@end
Run Code Online (Sandbox Code Playgroud)
我的申请中的.m
//
// …
Run Code Online (Sandbox Code Playgroud) 我一直在开发包含Share Extension的iOS 8应用程序.应用和扩展目标都使用新的iOS 8风格动态框架.为了让这个该死的东西进入TestFlight Beta App Review(见这里和这里),我对我的构建配置进行了一些更改.该商店最终接受了该应用程序的审查,但今天,当我试图在我的设备上运行时,我收到以下错误:
dyld: Library not loaded:
/Users/aaron/Library/Developer/Xcode/DerivedData/VideoGrabber-gpyzpfvbijsnuyglzzvynckkuwee/Build/Products/Debug-iphoneos/MyAppKitiOS.framework/MyAppKitiOS
Referenced from: /private/var/mobile/Containers/Bundle/Application/4C6CFF22-0595-4222-A515-D0D5A1696DBF/MyApp.app/MyApp
Reason: image not found
在其他地方寻求帮助,我遇到了许多建议的解决方案:
将框架添加到"常规"选项卡的"应用程序目标"的"嵌入式二进制文件"部分.完成.
在App Target上的Build Settings的Runpath Search Paths部分输入"@ executable_path/Frameworks".完成.
确保"复制文件"构建阶段中有一个条目.第一步实际上是为你做的,所以...完成.
以下是其他帖子的引文:
我正在一个iOS项目中工作,该项目包括由另一家公司创建的静态库.该库包含旧版AFNeworking,我没有任何源文件.
现在我需要使用更新的(并且更少的bug)版本的afneworking,但我不能在项目中两次包括相同的类(当然)因为所有"重复的符号"
我的问题是我正在准备一个iOS框架,我想在将来避免这种情况.我不是在谈论AFNetworking,而是其他非常流行的iOS框架.另外,我在原始框架代码中应用了一些自定义更改.
避免"重复符号"和"类X在Y和Z中实现的一种方法.将使用其中一个",我想到的是在原始框架类中添加一些前缀,但是这是正确的解?
更新1:
我试图应用约翰的解决方案,但没有快乐.我创建了一个简化的项目(这里是repo的链接),它有两个类FrameworkClass,它只存在于框架目标中,而SharedClass存在于框架和应用程序目标中,所以也许你可以看看我是否在做某事错误.应用程序启动后,我仍然得到:
objc[96426]: Class SharedClass is implemented in both .../TestFramework.framework/TestFramework and .../SymbolsVisibilityTest.app/SymbolsVisibilityTest. One of the two will be used. Which one is undefined
更新2:
这是我的输出nm
基于提供的示例项目的框架输出:
0000000000007e14 t -[FrameworkClass doFramework]
0000000000007e68 t -[SharedClass doShared]
U _NSLog
U _NSStringFromSelector
00000000000081f0 s _OBJC_CLASS_$_FrameworkClass
U _OBJC_CLASS_$_NSObject
0000000000008240 s _OBJC_CLASS_$_SharedClass
00000000000081c8 s _OBJC_METACLASS_$_FrameworkClass
U _OBJC_METACLASS_$_NSObject
0000000000008218 s _OBJC_METACLASS_$_SharedClass
0000000000007fb0 s _TestFrameworkVersionNumber
0000000000007f70 s _TestFrameworkVersionString
U ___CFConstantStringClassReference
U __objc_empty_cache …
Run Code Online (Sandbox Code Playgroud) objective-c static-libraries objective-c-runtime ios ios-frameworks
我一直在尝试修改我的项目以支持WatchOS2架构.目前我有一个基于AFNetworking的网络框架.到目前为止,我一直在使用我的手表应用程序.现在我正在尝试为watchos/watchsimulator平台构建框架.
我得到的是一些AFNetworking类的'SystemConfiguration/SystemConfiguration.h'文件找不到错误.
我知道系统配置不是watchOS2的可用系统框架之一.对于网络苹果说:
联网
对基于网络的操作的支持包括以下技术:
WatchKit扩展可以使用NSURLSession对象直接访问网络.WatchKit扩展可以完全访问NSURLSession功能,包括在后台下载文件的功能.有关如何使用此类的信息,请参阅URL加载系统编程指南.Watch Connectivity框架支持Watch应用程序和iOS应用程序之间的双向通信.使用此框架来协调两个应用程序之间的活动.有关更多信息,请参阅与您的Companion iOS应用程序通信.
我想为我的网络sdk支持iOS和watchos.有没有办法为watchOS平台构建这个项目?或者这是否意味着我只允许在我的手表应用程序中使用NSURLConnection?
我有一个Swift框架,我们编译并分发给第三方开发人员.我想在项目中包含一些C代码,但是我能够使它工作的唯一方法是将C头导入我的框架头并将C头设置为public.这会将所有C代码暴露给第三方开发人员,这不是我们想要的.
我在网上可以找到的有关如何执行此操作的所有内容都是此方法的变体:https://spin.atomicobject.com/2015/02/23/c-libraries-swift/
但是这个方法的警告是"注意,使用这种技术构建的任何框架的消费者也必须将模块添加到他们的Swift搜索路径中." 我们已经尝试了这一点,当然我们的第三方开发人员得到的错误Missing required module 'CGeodesic'
是我们定义的指向C头的模块.
我们如何才能将C代码直接编译到我们的框架中,同时保持代码私有,并且不要求第三方开发人员更改其构建设置以使其工作?我不介意在我们的项目中设置这些子模块,但在一天结束时我希望它直接编译成单个平面框架二进制文件,没有动态链接或搜索路径或类似的东西.
编辑
该项目是与Swift代码并排的C代码.我的项目中有一个子目录,如下所示:
Swift文件包装C代码,使其更清晰.我在该目录中也有一个module.modulemap文件,但就像我之前说过的那样不起作用.我宁愿保持C代码与我的Swift代码并排,但我愿意放弃它以解决这个问题.
在我的自定义框架中,我有一个如下所示的方法,它从字典中获取值并将其转换为BOOL并返回布尔值.
- (BOOL)getBoolValueForKey:(NSString *)key;
Run Code Online (Sandbox Code Playgroud)
如果此方法的调用者传递了不存在的键,该怎么办?我应该抛出一个自定义的NSException,说密钥不存在(但是在目标c中不建议抛出异常)或者将NSError参数添加到此方法中,如下所示?
- (BOOL)getBoolValueForKey:(NSString *)key error:(NSError **)error;
Run Code Online (Sandbox Code Playgroud)
如果我使用NSError,我将不得不返回'NO',这将是误导,因为'NO'可以是任何有效密钥的有效值.
ios-frameworks ×10
ios ×8
objective-c ×4
xcode ×4
xib ×2
afnetworking ×1
apple-watch ×1
c ×1
cocoa-touch ×1
core-data ×1
frameworks ×1
llvm ×1
nserror ×1
nsexception ×1
swift ×1
watchos-2 ×1