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

时间:2014-08-04 06:31:02

标签: ios objective-c iphone iphone-privateapi

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

UILayoutContainerView 
UIViewControllerWrapperView
UINavigationTransitionView
UITableViewCellScrollView
UITableViewCellContentView 

现在,我想区分哪些是私有的,哪些是公开的,以便我可以使用公共的(因此,我的应用程序不会被苹果拒绝)。

4 个答案:

答案 0 :(得分:1)

类(或方法)属于官方公共Apple文档中记录的公共API。如果你很慷慨,你可以说SDK头文件中的类(和方法)也是公开的,即使它们没有明确记录。但是正如您所看到的,给定类(或方法)属于公共或私有API的信息不是在运行时中的任何位置编码的。这意味着,无论Objective-C的任何内省功能如何,都无法实现您想要的功能。

如何获得近似所需内容的解决方案的唯一方法是以某种方式自行编码和存储所需信息。您可以将信息存储在应用程序中(基本上是对其进行硬编码),或者您甚至可以查询服务器以获取信息。但是,您可能已经意识到自己,这些方案都不优雅,而且您将非常忙于每个新版本的iOS更新信息。

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

答案 1 :(得分:0)

此方法接受一个视图,并将其作为NSString的类与所有公共UIView子类的数组(也作为NSStrings)进行比较,如果视图的类是公共的,则返回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;
}

答案 2 :(得分:0)

使用此开发工具App Scanner。它会扫描您的.app文件以获取私有API方法。未来版本还将检查私有API实例变量。您还可以使用 otool 来检测私人API

答案 3 :(得分:0)

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

有关所有私有API的列表,请查看iPhone Private Frameworks

iPhone Private Frameworks UIKit

涵盖了所有这些内容