iOS 에서 패 치 정책 동적 업데이트 JSpatch 활용 기초 1

iOS 에서 동적 업데이트 패 치 정책 JSpatch 활용 기초
        JSpatch 는 GitHub 의 이전 오픈 소스 프레임 워 크 로 Objective - C 의 run - time 메커니즘 을 통 해 자바 스 크 립 트 호출 과 프로젝트 의 Objective - C 속성 과 방법 을 동적 으로 사용 할 수 있 습 니 다.프레임 워 크 가 작고 코드 가 간결 하 며 시스템 의 JavaScriptCore 프레임 워 크 를 통 해 Objective - C 와 상호작용 을 하여 안전성 과 심사 위험 에 있어 강 한 장점 을 가진다.Git 소스 주소:https://github.com/bang590/JSPatch。
1. 공식 데모 에서 볼 때
        cocoapods 를 통 해 JSpath 를 하나의 Xcode 프로젝트 에 통합 시 키 고 AppDelegate 류 에서 다음 과 같은 코드 를 작성 합 니 다.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    //       
    [JPEngine startEngine];
    //  js  
    NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"demo" ofType:@"js"];
    NSString *script = [NSString stringWithContentsOfFile:sourcePath encoding:NSUTF8StringEncoding error:nil];
    //  js  
    [JPEngine evaluateScript:script];
    self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
    self.window.rootViewController = [[ViewController alloc]init];
    [self.window addSubview:[self genView]];
    [self.window makeKeyAndVisible];
    return YES;
}

- (UIView *)genView
{
    UIView * view= [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 320)];
    view.backgroundColor = [UIColor redColor];
    return view;
}

프로젝트 에 js 파일 을 추가 합 니 다. 다음 과 같이 작성 합 니 다.
    require('UIView, UIColor, UILabel')
    //       
    defineClass('AppDelegate', {
            //    
                //        
                genView: function() {
                    var view = self.ORIGgenView();
                    view.setBackgroundColor(UIColor.greenColor())
                    var label = UILabel.alloc().initWithFrame(view.frame());
                    label.setText("JSPatch");
                    label.setTextAlignment(1);
                    view.addSubview(label);
                    return view;
            }
    });

프로젝트 를 실행 하면 genView 방법 이 js 파일 로 바 뀌 는 방법 을 볼 수 있 습 니 다. 원래 빨간색 보 기 는 녹색 으로 수정 되 었 습 니 다.
2. JavaScript 코드 를 사용 하여 Objective - C 에 수정 하거나 추가 하 는 방법
        JSpatch 엔진 에 서 는 자 바스 크 립 트 코드 를 호출 하 는 3 가지 방식 을 지원 합 니 다. 각각 자 바스 크 립 트 문자열 로 코드 를 실행 하고 로 컬 자 바스 크 립 트 파일 을 읽 어 코드 를 실행 하고 네트워크 의 자 바스 크 립 트 파일 을 가 져 와 코드 를 실행 합 니 다.예 를 들 어 JavaScript 코드 를 통 해 프로젝트 에 경고 상 자 를 꺼 내 려 면 Objective - C 코드 에 다음 코드 를 삽입 하 십시오.
- (void)viewDidLoad {
    [super viewDidLoad];
    // ‘\’       
    [JPEngine evaluateScript:@"\
     var alertView = require('UIAlertView').alloc().init();\
     alertView.setTitle('Alert');\
     alertView.setMessage('AlertView from js'); \
     alertView.addButtonWithTitle('OK');\
     alertView.show(); \
     "];
}

        개발 자 도 Objective - C 클래스 파일 에 동적 으로 방법 을 추가 할 수 있 습 니 다. 예 를 들 어 ViewController 클래스 에서 다음 과 같이 작성 할 수 있 습 니 다.
- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
    [JPEngine startEngine];
    NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"demo" ofType:@"js"];
    NSString *script = [NSString stringWithContentsOfFile:sourcePath encoding:NSUTF8StringEncoding error:nil];
    [JPEngine evaluateScript:script];
    [self performSelectorOnMainThread:@selector(creatView) withObject:nil waitUntilDone:nil];
}

JavaScript 파일 코드 는 다음 과 같 습 니 다.
 require('UIView, UIColor, UILabel')
    defineClass('ViewController', {
            // replace the -genView method
                creatView: function() {
                    var view = UIView.alloc().initWithFrame({x:20, y:20, width:100, height:100});
                    view.setBackgroundColor(UIColor.greenColor());
                    var label = UILabel.alloc().initWithFrame({x:0, y:0, width:100, height:100});
                    label.setText("JSPatch");
                    label.setTextAlignment(1);
                    view.addSubview(label);
                self.view().addSubview(view)
            }
    });

위의 코드 를 제외 하고 ViewController. m 파일 에 다른 방법 이 없습니다. 프로젝트 를 실행 하면 프로그램 이 무 너 지지 않 았 음 을 볼 수 있 습 니 다. ViewController 는 creatView 방법 을 실 행 했 습 니 다.
        위의 예 시 를 통 해 우 리 는 JSpatch 를 사용 하면 매우 재 미 있 는 일 을 할 수 있다 는 것 을 발견 했다.iOS 애플 리 케 이 션 의 경우 공식 채널 인 App Store 를 통 해 애플 리 케 이 션 을 발표 하려 면 인공 심 사 를 통과 해 야 합 니 다. 가끔 은 이 심사 주기 가 매우 길 때 가 있 습 니 다. 개발 자가 코드 를 작성 할 때 작은 구멍 을 남 겼 다 면 애플 리 케 이 션 이 출시 되면 이 bug 를 수정 하려 면 10 점 이 어렵 습 니 다.JSpatch 가 있 으 면 온라인 에서 문제 가 있 는 방법 을 찾 을 수 있다 면 JS 파일 로 이 방법 을 수정 하 는 것 이 얼마나 멋 진 일 인지 상상 할 수 있 습 니 다. 사실 JSpatch 의 주요 용도 도 온라인 에서 아주 작은 문 제 를 응용 할 수 있 는 hotfix 입 니 다.
3. JavaScript 와 Objective - C 의 상호작용 의 기본 방법
        JSpatch 를 사용 하여 Objective - C 스타일 의 방법 으로 작성 하려 면 JavaScript 와 Objective - C 의 상호작용 규칙 을 지 켜 야 합 니 다.
1. JavaScript 파일 에 Objective - C 클래스 사용
   JavaScript 코드 를 작성 할 때 Objective - C 클래스 를 사용 하려 면 이 클래스 를 require 참조 해 야 합 니 다. 예 를 들 어 UIView 클래스 를 사용 하려 면 사용 전에 다음 과 같이 참조 해 야 합 니 다.
require('UIView')

또한 한 번 에 여러 Objective - C 클래스 를 참조 할 수 있 습 니 다.
require('UIView, UIColor, UILabel')

더 간편 한 쓰기 방법 도 있 습 니 다. 직접 사용 할 때 인용 합 니 다.
require('UIView').alloc().init()

2. JavaScript 파일 에서 Objective - C 방법 호출
    Objective - C 방법의 호출 을 진행 할 때 두 가지 로 나 뉘 는데 하 나 는 호출 클래스 방법 이 고 하 나 는 호출 클래스 의 대상 방법 이다.
호출 클래스 방법: 클래스 이름 타 점 방식 으로 클래스 방법 을 호출 합 니 다. 형식 은 다음 과 같 습 니 다. 괄호 안에 매개 변수 로 전 달 됩 니 다.
UIColor.redColor()

인 스 턴 스 방법 호출: 대상 타 점 방식 으로 클래스 의 인 스 턴 스 방법 을 호출 합 니 다. 형식 은 다음 과 같 습 니 다. 괄호 안에 매개 변수 로 전 달 됩 니 다.
view.addSubview(label)

Objective - C 의 다 중 매개 변수 방법 에 대해 자바 스 크 립 트 로 전환 하여 매개 변 수 를 분할 하 는 위 치 는분할 을 진행 합 니 다. 매개 변 수 는 모두 뒤의 괄호 에 넣 고 쉼표 로 분할 합 니 다. 예 는 다음 과 같 습 니 다.
view.setBackgroundColor(UIColor.colorWithRed_green_blue_alpha(0,0.5,0.5,1))

Objective - C 클래스 의 속성 변 수 는 JavaScript 에서 getter 와 setter 방법 으로 만 접근 할 수 있 습 니 다. 예 는 다음 과 같 습 니 다.
label.setText("JSPatch")

알림: 원래 Objective - C 의 방법 에 이미 이 포함 되 어 있다 면기 호 는 자바 스 크 립 트 에서 를 사용 합 니 다.대신
3. JavaScript 에서 Objective - C 클래스 를 조작 하고 수정 합 니 다.
    JSpatch 의 가장 큰 응용 프로그램 은 응용 프로그램 이 실 행 될 때 동적 인 조작 과 수정 클래스 입 니 다.
클래스 를 다시 쓰 거나 추가 하 는 방법:
JavaScript 에서 defineClass 를 사용 하여 클래스 의 방법 을 정의 하고 수정 합 니 다. 작성 형식 은 다음 과 같 습 니 다.
/*
classDeclaration:                                 
instanceMethods:             {}
classMethods:            {}
*/
defineClass(classDeclaration, instanceMethods, classMethods)

예 는 다음 과 같다.
defineClass('ViewController', {
            // replace the -genView method
                newFunc: function() {
                    //      
                    self.view().setBackgroundColor(UIColor.redColor())
                }
    
            },{

                myLoad:function(){
                    //     
                }

            }
            )

클래스 의 방법 을 다시 쓴 후에 원래 의 방법 을 사용 하려 면 ORIG 접 두 사 를 사용 해 야 합 니 다. 예 를 들 어 다음 과 같 습 니 다.
defineClass('ViewController', {
            // replace the -genView method
                viewDidLoad: function() {
                    //      
                    self.ORIGviewDidLoad()
                }
    
            }
            )

Objective - C 에서 슈퍼 키 워드 를 호출 하 는 방법 은 JavaScript 에서 self. super () 를 사용 하여 호출 할 수 있 습 니 다. 예 를 들 어:
defineClass('ViewController', {
            // replace the -genView method
                viewDidLoad: function() {
                    //      
                    self.super().viewDidLoad()
                }
    
            }
            )

마찬가지 로 JSpatch 도 클래스 에 임시 속성 을 추가 하여 방법 간 매개 변수 전달 에 사용 할 수 있 습 니 다. set 를 사용 합 니 다.Prop_forkey () 는 속성 을 추가 합 니 다. getProp () 을 사용 하여 속성 을 가 져 옵 니 다. JSpatch 가 추가 한 속성 은 Objective - C 의 setter 와 getter 방법 으로 접근 할 수 없습니다. 다음 과 같 습 니 다.
defineClass('ViewController', {
            // replace the -genView method
                viewDidLoad: function() {
                    //      
                    self.super().viewDidLoad()
                    self.setProp_forKey("JSPatch", "data")
                },
                touchesBegan_withEvent(id,touch){
                    self.getProp("data")
                    self.view().setBackgroundColor(UIColor.redColor())
                }
    
            }
            )

클래스 에 프로 토 콜 을 추가 하 는 준수 와 Objective - C 에서 프로 토 콜 을 준수 하 는 방식 은 다음 과 같 습 니 다.
defineClass("ViewController2: UIViewController <UIAlertViewDelegate>", {
            viewDidAppear: function(animated) {
            var alertView = require('UIAlertView')
            .alloc()
            .initWithTitle_message_delegate_cancelButtonTitle_otherButtonTitles(
                                                                                "Alert",
                                                                                "content",
                                                                                self,
                                                                                "OK",
                                                                                null
                                                                                )
            alertView.show()
            },
            alertView_clickedButtonAtIndex:function(alertView, buttonIndex) {
            console.log('clicked index ' + buttonIndex)
            }
            })

좋은 웹페이지 즐겨찾기