在运行时区分ios中的私有和公共类/api



我正在寻找iOS应用程序中一个视图的视图层次结构。当我解析视图层次结构时(通过使用命令视图)。在循环中的父视图和打印视图描述),我得到了许多私有类的对象,如

UILayoutContainerView 
UIViewControllerWrapperView
UINavigationTransitionView
UITableViewCellScrollView
UITableViewCellContentView 

现在,我想区分哪些是私有的,哪些是公共的,这样我就可以使用公共的(这样,我的应用程序就不会被苹果拒绝了)

当一个类(或方法)被记录在官方的、公开的Apple文档中时,它就属于一个公共API。如果您足够慷慨,您可以说SDK头文件中的类(和方法)也是公共的,即使它们没有显式记录。但是正如您所看到的,给定的类(或方法)是否属于公共或私有API的信息并不是在运行时的任何地方编码的。这意味着,不管Objective-C有什么自省功能,都不可能实现你想要的。

得到近似于的解的唯一方法是自己编码和存储所需的信息。你可以将信息存储在你的应用程序中(本质上是硬编码),或者你甚至可以查询你的服务器来获取信息。但正如你可能已经意识到的那样,这两种方案都不优雅,而且你将非常忙着更新每一个新版本的iOS的信息。

我建议你花点时间重新考虑你的应用程序设计。

使用这个开发工具,App Scanner。它扫描你的.app文件中的私有API方法。未来的版本还将检查私有API实例变量。你也可以使用otool来检测私有api

不幸的是它们都是私有的,所以你不能使用它们中的任何一个。

关于所有私有api的列表,请查看iPhone私有框架。

所有这些都包含在iPhone私有框架UIKit

这个方法接受一个视图并比较它的类,作为一个NSString,和一个包含所有公共UIView子类的数组,同样作为NSString,如果视图的类是公共的返回YES。如果可以的话,你也必须在数组中包含你自己的自定义UIView子类。

-(BOOL)isViewPublic:(UIView *)view {
    static NSArray *publicClasses;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        publicClasses = @[@"UIView",
                          @"UIWindow",
                          @"UILabel",
                          @"UIPickerView",
                          @"UIProgressView",
                          @"UIActivityIndicatorView",
                          @"UIImageView",
                          @"UITabBar",
                          @"UIToolBar",
                          @"UINavigationBar",
                          @"UITableViewCell",
                          @"UIActionSheet",
                          @"UIAlertView",
                          @"UIScrollView",
                          @"UISearchBar",
                          @"UIWebView",
                          @"UIControl",
                          @"UITableView",
                          @"UITextView",
                          @"UIButton",
                          @"UIDatePicker",
                          @"UIPageControl",
                          @"UISegmentedControl",
                          @"UITextField",
                          @"UISlider",
                          @"UISwitch"];
    });
    for (NSString *publicClass in publicClasses) {
        if ([publicClass isEqualToString:NSStringFromClass([view class])]) {
            return YES;
        }
    }
    return NO;
}

最新更新