2014-09-12 2 views
0

iOS 7을 타겟으로하는 많은 정적 라이브러리를 유지합니다. iOS 8의 출시 일정에 따라 코어와 같은 몇 가지 새로운 기능을 지원하는 것이 좋습니다. 데이터 및 핵심 위치.정적 라이브러리에서 iOS의 여러 버전 지원하기

iOS 7을 타겟팅하고 iOS 8을 타겟팅하는 두 가지 버전의 라이브러리를 제작할 수있는 유일한 옵션입니까, 아니면 같은 라이브러리에서이 두 가지를 모두 지원할 수있는 방법입니까?

이 라이브러리를 사용하는 응용 프로그램은 아이폰 OS 당신은 당신이 바로 현재의 기능을 얻을 아이폰 OS 7을 대상으로하는 경우 (8) 다음 추가 기능을 사용할 수있게하고,을 대상으로하는 경우 어디 지점에 도착하는 것이 좋을 것입니다 ..

답변

0

는 여기 하나의 접근법. 나는 도서관 내부에 그것을 사용하지 않은하지만 난 거기 작동하지 않을 이유를 생각할 수 없다 : 이것은이 아이폰 OS 7 SDK로 구축된다고 보여지는 코드 섹션 내부에 구현

SEL registerUserNotificationSettings = NSSelectorFromString(@"registerUserNotificationSettings:"); 

// iOS 8 requires explicit permission from the user for local notifications 
if ([application respondsToSelector:registerUserNotificationSettings]) { 

    //Extra hack for the bit settings since we're building with a SDK that doesn't have the symbols 
    #define REQUIRED_SETTINGS 7 

    Class settingsClass = NSClassFromString(@"UIUserNotificationSettings"); 
    if (settingsClass) { 
     id settings = objc_msgSend(settingsClass, @selector(settingsForTypes:categories:), REQUIRED_SETTINGS, nil); 
     objc_msgSend(application, registerUserNotificationSettings, settings); 
    } 
} 

. respondsToSelector:은 본질적으로 iOS 8 이상 런타임 검사입니다.

0

링크 시간에 이미지가 실행될 하드웨어가 무엇인지 모르기 때문에 자동으로이 작업을 수행 할 수있는 것은 아닙니다.

외관 패턴을 사용할 수 있습니다. 특정 방법이 iOS에 따라 다르게 구현 될 수 있다는 것을 알게되면 두 버전을 만들어 정면 버전을 해당 버전으로 전달하십시오.

가장 확실한 방법은 Objective C 런타임 메소드를 사용하는 것입니다. Apple에서 객관적인 c 런타임 안내서를 가져와야합니다. 살펴보고 싶은 내용은 메서드 swizzling입니다. setImplementation. 인터페이스 객체를 인스턴스화 할 때마다 os 버전 종속 메소드를 실행하고 적절한 구현을 설정할 수 있습니다.

관련 문제