iOSがプライベートframeworkを安全に使用する方法

4684 ワード

プライベートframeworkのsubviewオブジェクトの取得
ブログ:using private iOS APIs safely深さ再帰サブviewを検索し、そのプロパティを変更します:You are not prevented from modifying a view that is part of a UImit object,you just need to do it publicly.The [UIView subviews] method is public, and you can use this to dig through the view hierarchy looking for a private view to change, no private method calls required
1. [UIView subviews]
NS_INLINE UIView *UIFindSubview(UIView *view, Class viewClass)
{
    for (UIView *subview in view.subviews)
    {
        if ([subview isKindOfClass:viewClass])
        {
            return subview;
        }
        else
        {
            UIView *rect = UIFindSubview(subview, viewClass);
            if (rect) {
                return rect;
            }
        }
    }
    return nil;
}

このメソッドを呼び出してsubViewを取得
UIView *view = findSubview(picker.view, [NSClassFromString(@"CMKVideoPreviewView") class]);

2.[[subview class] description]
ブログ:Removing reorder cell shadows from a UItable View
プライベートクラスの宣言を直接使用することはできませんが、classの情報を[[subview class]description]で取得できます.[[[subview class] description] isEqualToString:@”UIShadowView”] You don’t have a class declaration for the private classes, but that’s fine, instead you can evaluate that it is correct based on class string description, [[[subview class] description] isEqualToString:@”UIShadowView”]
//  iOS7
    for(UIView* subview in wrapperView.subviews)
    {
        if([[[subview class] description] isEqualToString:@"UIShadowView"])
            [subview setHidden:YES];
    }


プライベートヘッダファイル
You can use a tool like class-dump or a private class reference to see every Objective-C method each class in iOS has – the truth is nothing in Objective-C is truly ‘private’, you can see any method compiled into the binary.
class-dump oまたはprivate class referenceなどのツールでiOSのすべてのclassの方法を見ることができます.ただし、プライベートヘッダAPIは随時削除されるので、respondsToSelector:performSelector:でこの方法が使えるかどうかをチェックすることをお勧めします.
インスタンス変数へのアクセス
クラス内のプライベート変数にアクセスする方法たとえば、[xxxxx valueForKey:@]_internal]ではprivate変数_を返すことができます.internal .
NS_CLASS_AVAILABLE_IOS(2_0) @interface UIWebView : UIView  { 
 @private
    UIWebViewInternal *_internal;
}

しかし、私たちが要求した変数が存在しない場合(私たちが入力したkey値に基づいて対応するvalueが見つかりません)、プログラムはcrashになります.これを防ぐために、NSObjectのcategoriseまたはサブクラスでクラスを継承し、valueForUndefinedKeyメソッドを書き換えることができます.
- (id) valueForUndefinedKey:(NSString *)key
{
    //  No crashes please...
    return nil;
}

読み取り専用プロパティのインスタンス変数の値を変更することもあります.以前、orientationプロパティ値を強制的に設定してみました.
Method Swizzling
Method Swizzling Method Swizzling Method Swizzling lets you inject code in the middle of two existing classes, which can be a lot more beneficial compared to a subclass that will only add your code on top of one class that must be subclassed. example
プライベート列挙変数へのアクセス
プライベート列挙変数は、本質的にいくつかの数字です.たとえば次の例では,返されるボタンUIButtonTypeの値は101であり,非公開である.直接設定できます.
UIButton* back = [UIButton buttonWithType:101];
[back sizeToFit];
[back setTitle:@"Back" forState:UIControlStateNormal];

image
C方法
One half of Objective-C is pure C, and with that all the tricks to incorporate private C APIs into your app, such as defining external functions. 例:スクリーンショットと画像の保存
CGImageRef screenshot = UIGetScreenImage();
UIImage* image = [UIImage imageWithCGImage:screenshot];

[UIImagePNGRepresentation(image) writeToFile:@"/maybe-change-this.png" atomically:NO];


プライベートメソッドとクラスの書き換え
プライベートメソッドとクラスを書き換えると、appがApp storeに拒否されることはありませんが、appは不安定になります.バージョンが更新されるたびに、あなたの方法やクラスが正常に動作しているかどうかを確認する必要があります.publicまたはprivateクラスのプライベートメソッドを書き換えることができます.プライベートクラスの場合、直接書き換えるとコンパイルエラーになりますが、fake interface、categoriseを追加できます.
例:UIstatusBarクラスを書き換える
@interface UIStatusBar : UIView
@end

@interface UIStatusBar (Override)
@end

@implementation UIStatusBar (Override)

- (void) drawRect:(CGRect)rect
{
    NSArray* subviews = self.subviews;

    if(subviews.count < 2)
        return;

    UIView* background = [subviews objectAtIndex:0];
    UIView* foreground = [subviews objectAtIndex:1];

    [UIView animateWithDuration:2 animations:^{

        [self setTransform:CGAffineTransformMakeTranslation(0, 100)];

        [background setTransform:CGAffineTransformMakeTranslation(-160, 0)];
        [foreground setTransform:CGAffineTransformMakeTranslation(160, 0)];
    }];
}

@end

private framework dylib注射を使用してプライベートapi ios逆方向エンジニアリングを取得