개별 공유 플랫폼의 SDK 통합 방법

7284 단어
bg:최근 회사에서 조립화 작업을 진행하고 있는데 결합은 반드시 직면해야 할 문제이다.각 플랫폼의 공유 sdk를 어떻게 우아하게 디자인 재구성했는지 말씀드리겠습니다.당사의 제품은 16개의 제3자 공유를 통합하여 그야말로 대단합니다.
당면 과제:
  • 공유를 시작하는 코드를 모두 Launch에 넣으면 이 안의 코드는 매우 무섭다. 어떻게 이런 코드를 합리적으로 분리할 것인가.
  • sdk가 너무 많아요. 왜냐하면 우리는 4개의 제품이 있기 때문에 사용하고 싶은 몇 개를 집적해서 마음대로 만들 수 있어요.

  • 첫 번째 문제에 대한 우리의 해결 방안
    라이프 사이클 관리 모듈을 작성하는 관리자는 분배Appdelegate 안의 각종 라이프 사이클을 책임지는 방법부터 분배 모듈에 이르기까지 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;- (void)applicationDidBecomeActive:(UIApplication *)application;- (void)applicationWillResignActive:(UIApplication *)application;와 같은 방법으로 우리는 모든 방법을 분배했다.그럼 어디서 나눠줬는지는 Appdelegate의 부류를 정해 상속 관계를 통해 나눠준다.우리는 공유 모듈을 이 생명주기 모듈에 등록하고 각 공유 플랫폼의 매개 변수를 앱키, 시크릿 등 등록해야 한다.우리는 +load () 방법으로 모듈을 신속하게 등록했는데 대체로 이렇다
    +(void)load {
        [XYAppLifecycleManager registerModuleClass:[CMShareLifeCycle class] config:@{
                                                                                     @"QQ":@{
                                                                                             @"appscheme":@"xx",
                                                                                             @"appkey":@"xx"
                                                                                             },
                                                                                     @"Weibo":@{
                                                                                             @"appscheme":@"xx",
                                                                                             @"appkey":@"xx"
                                                                                             },
                                                                                     @"Wechat":@{
                                                                                             @"appscheme":@"xx",
                                                                                             @"appkey":@"xx",
                                                                                             @"secret":@"xx"
                                                                                             }
                                                                                     } priority:100];
        
    }
    

    공유 모듈에 설정된 공유 플랫폼을 가지고 있는runtime를 통해 실례를 생성할 수 있는 집합이 있습니다
    [servers enumerateObjectsUsingBlock:^(NSString * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            NSString *server = [NSString stringWithFormat:@"XY%@Adapter",obj];
            id shareClass = [[NSClassFromString(server) alloc] init];
            if (shareClass) {
                [self.shareServers addObject:shareClass];
            }
        }];
    

    이곳의 아담터는 모든 공유 플랫폼에 적합한 것인데 왜 이렇게 말합니까?각 플랫폼은 약간의 차이가 있을 수 있는데 이것은 두 가지 측면에 나타난다. 1.설정된 매개 변수는 위의 configure에서 볼 수 있습니다.리셋 방법은 모두 아래 몇 가지가 있지만 공유마다 다 가는 것은 아니다.1.-(void)applicationDidBecomeActive:(UIApplication *)application2.-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation3.-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary *)options4.-(void)didFinishLaunchingWithOptions:(NSDictionary *)launchOptions params:(NSDictionary *)params 우리는 매번Appdelegate에서 위의 방법이 호출될 때 생명주기 모듈에서 나누어 주고 공유 모듈에서 각 공유 플랫폼의 adapter에게 나누어 준다. 예를 들어 QQAdapter의 종류는 하나의 프로토콜XYShareProtocol을 따른다. 이 프로토콜에는 위와 같은 네 가지 방법이 있는데 그 중에서 선택할 수 있는 방법이 있다.이와 같은 실현
    -(void)xy_didFinishLaunchingWithOptions:(NSDictionary *)launchOptions params:(NSDictionary *)params {
        
            XYSNSRegisterParam * registerParam = [[XYSNSRegisterParam alloc] init];
            XYSNSQQ *qq = [XYSNSQQ sharedInstance];
            NSString *appscheme = params[@"QQ"][@"appscheme"];
            NSString *appkey = params[@"QQ"][@"appkey"];
            [qq setAppScheme:appscheme];
            [registerParam setAppKey:appkey];
            [qq registerApp:registerParam];
    }
    
    -(BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary *)options {
    
        return [XYSNSHelper application:application openURL:url sourceApplication:options[@"UIApplicationOpenURLOptionsOpenInPlaceKey"] annotation:options[@"UIApplicationOpenURLOptionsOpenInPlaceKey"] snsArray:@[[XYSNSQQ sharedInstance]]];
    }
    
    -(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
        
        return [XYSNSHelper application:application openURL:url sourceApplication:sourceApplication annotation:annotation snsArray:@[[XYSNSQQ sharedInstance]]];
    }
    

    여기에 하나의 공장 방법을 사용했다. 공유 모듈은 하나의 공장에 있는 것처럼 각 공유 플랫폼을runtime를 통해 실례화한 즉adapter이고 각adapter는 추상적인 인터페이스XYShareProtocol를 따라 최종적으로 각 공유 플랫폼을 고도로 추상화시켰다.
    두 번째 문제에 대한 우리의 해결 방안
    사실 이 임무를 완성하는 것은 지난 임무를 바탕으로 공유 모듈의 추상적인 정도가 충분해야만 마음대로 설정할 수 있다.우리는pod로 관리하는 것이다podspec파일의 일부 내용은 다음과 같다.
    s.default_subspec = 'Core'
    
    s.subspec 'Core' do |cr|
        cr.name = 'Core'
        cr.platform = :ios,'8.0'
        cr.source_files = 'XYShareSDK/Core/**/*.{h,m}'
    end
    s.subspec 'Twitter' do |tt|
        tt.name = 'Twitter'
        tt.platform = :ios,'8.0'
        tt.source_files = 'XYShareSDK/Twitter/*.{h,m}'
        tt.dependency 'Fabric','1.6.11'
        tt.dependency 'XYShareSDK/Core'
        tt.dependency 'TwitterCore','1.11.3'
        tt.dependency 'TwitterKit','1.11.3'
    
    end
    
    s.subspec 'Google' do |google|
        google.name = 'Google'
        google.platform = :ios,'8.0'
        google.source_files = 'XYShareSDK/Google/*.{h,m}'
        google.vendored_frameworks = 'XYShareSDK/Google/Library/*.framework'
        google.resource = 'XYShareSDK/Google/Library/*.bundle'
        google.dependency 'GoogleSymbolUtilities'
        google.dependency 'XYShareSDK/Core'
    
        # google.dependency 'XYShareSDK/GoogleSymbolUtilities'
    end
    
    Core 폴더 안은 모두 고도의 추상적인 코드이고 다른 Twitter,Google에는 구체적인 공유가 있다.저희가 사용할 때podfile 이렇게.
    pod 'XYShareSDK/QQ', :git => 'http://xxx.xxx.xxx0/ioscomponentgroup/xysharesdk.git',:branch => 'branchForSubSpec'
    pod 'XYShareSDK/WeChat', :git => 'http://xxx.xxx.xxx/ioscomponentgroup/xysharesdk.git',:branch => 'branchForSubSpec'
    pod 'XYShareSDK/Weibo', :git => 'http://xxx.xxx.xxx/ioscomponentgroup/xysharesdk.git',:branch => 'branchForSubSpec'
    

    비록 이렇게 많이 썼지만 중간의 우여곡절은 정말 적지 않다.본고는 재구성 또는 조립화 중인 아동화에 도움이 되길 바랍니다.

    좋은 웹페이지 즐겨찾기