我在这里写cos,我真的被卡住了,找不到答案。
我们有一个小的框架,可以在其中收集IDFA。
对于IDFA收集,我们首先检查NSClassFromString(@"ASIdentifierManager")
问题是:
假设我们有一个客户端,并且该客户端的发行版本为iOS10-iOS12。
这个客户端获得了针对iOS10和iOS11的IDFA,但是对于所有iOS12来说,根本没有IDFA!检查日志后,我们发现NSClassFromString(@"ASIdentifierManager")
仅对于iOS12为零。
客户端如何为iOS10(11)添加框架,但不能为iOS12添加框架?
另一方面,另一个客户端在iOS12上运行良好。
最佳答案
这可能无法完全回答您的问题,仅发送我所知道的和我的猜测。
首先是,动态框架将不会加载到您的应用程序进程中,直到您使用为止,例如该目录下的框架(可在iOS上的模拟器设备中使用)。
> cd /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks
> # Now there are plenty of frameworks here.
> file AdSupport.framework/AdSupport
Mach-O 64-bit dynamically linked shared library x86_64
如何在中使用呢? TLDR,可以在您的应用程序中的任何地方使用
[ASIdentifierManager sharedManager]
进行调用,当然,首先链接该框架并成功进行编译。第二个,直接使用
NSClassFromString()
和在任何地方调用[ASIdentifierManager sharedManager]
有什么区别?对于前一种情况,您的应用程序将不会加载
AdSupport
框架包,因为在os内核加载您的程序时,您的可执行程序中没有名为ASIdentifierManager
的符号,可以通过打印应用程序主包路径并找到应用程序可执行文件来证明这一点。文件,尝试使用nm <path/to/executable_app> | grep "ASIdentifierManager"
,结果是未找到任何内容,因为您没有使用它。对于后一种,请尝试在可执行程序中grep相同的符号。
第三个,
NSClassFromString
仅检查已加载的类,如果未加载AdSupport
框架,则它返回nil而不尝试加载包含目标类的框架。Forth ,除非您在项目中粘贴有关IDFA和
AdSupport
框架用法的更多上下文,否则无法记忆起iOS 10/11和iOS 12之间的区别。这是我的猜测,某些依赖库在早期版本中使用的AdSupport
框架,但在iOS 12中,您必须尝试在iOS 11和iOS 12之间转储符号列表并比较结果。第五个,我不确定您想要什么,也许您正试图避免显式导入
AdSupport
框架,如何通过框架路径初始化NSBundle
并调用-(BOOL)load
类的NSBundle
,然后可以使用Class
获得NSClassFromString
对象。更新:
NSString *strFrameworkPath = nil;
#if TARGET_OS_SIMULATOR
strFrameworkPath = [[NSProcessInfo processInfo] environment][@"DYLD_FALLBACK_FRAMEWORK_PATH"];
#else
// Assume that the AdSupport and Foundation framework are in the same directory.
strFrameworkPath = [NSBundle bundleForClass:NSPredicate.class].bundlePath;
strFrameworkPath = [strFrameworkPath stringByDeletingLastPathComponent];
#endif
strFrameworkPath = [strFrameworkPath stringByAppendingPathComponent:@"AdSupport.framework"];
NSAssert([[NSFileManager defaultManager] fileExistsAtPath:strFrameworkPath], @"Invalid framework bundle path!");
NSBundle *bundle = [NSBundle bundleWithPath:strFrameworkPath];
if (!bundle.isLoaded) {
NSError *error = nil;
if (![bundle loadAndReturnError:&error]) {
DDLogError(@"Load framework bundle %@ with error %@", bundle, error);
}
}
DDLogDebug(@"bundle: %@", bundle.bundlePath);
DDLogDebug(@"class: %@", NSClassFromString(@"ASIdentifierManager"));
您可能需要增强产品的各种设备的兼容性,有关
NSBundle
用法的更多详细信息,请查看the official documentation here。关于ios - 在iOS12中找不到ASIdentifierManager,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53298053/