返回

组件化中对第三方库手动集成的坑和处理过程

IOS

前言

随着项目的日益庞大,代码量的不断增加,代码的可维护性与可扩展性会成为一个严重的问题。组件化是一种很好的解决办法,它可以将项目拆分成多个独立的组件,每个组件都有自己的功能和职责,这样既可以提高代码的可维护性,也可以提高代码的可扩展性。

使用组件化也有一段时间了,碰到不少问题,但也算是给解决了,总结一下手动引入第三方组件的一些问题。

主要包含微信、支付宝、微博、极光推送、友盟这几种。

微信支付集成

微信支付集成需要用到微信开放平台的SDK,SDK的接入很简单,只需要在项目的Podfile中添加以下代码即可:

pod 'WechatOpenSDK'

添加好之后,需要在项目的AppDelegate中进行初始化:

import WechatOpenSDK

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        
        // 微信开放平台SDK初始化
        WXApi.registerApp("wxd930ea5d5a258f4f")
        
        return true
    }

    // 微信支付回调
    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
        return WXApi.handleOpen(url, delegate: self)
    }
}

需要注意的是,在使用微信支付时,需要先获取用户的授权,否则会报一个错误。

支付宝支付集成

支付宝支付集成需要用到支付宝开放平台的SDK,SDK的接入也很简单,只需要在项目的Podfile中添加以下代码即可:

pod 'AlipaySDK'

添加好之后,需要在项目的AppDelegate中进行初始化:

import AlipaySDK

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        
        // 支付宝开放平台SDK初始化
        AlipaySDK.defaultService()?.payOrder("app_id=2015050100090184&biz_content=%7B%22timeout_express%22%3A%2230m%22%2C%22seller_id%22%3A%222088102147304138%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%2C%22total_amount%22%3A%220.01%22%2C%22subject%22%3A%221%22%2C%22body%22%3A%22%E6%88%91%E6%98%AF%E6%B5%8B%E8%AF%95%E6%94%AF%E4%BB%98%22%2C%22out_trade_no%22%3A%221231312312321%22%7D", fromScheme: "alisdkdemo", callback: { (resultDic) in
            print(resultDic)
        })
        
        return true
    }

    // 支付宝支付回调
    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
        if AlipaySDK.defaultService()?.processOrder(withPaymentResult: url, standbyCallback: { (resultDic) in
            print(resultDic)
        }) ?? false {
            return true
        }
        return false
    }
}

需要注意的是,在使用支付宝支付时,也需要先获取用户的授权,否则会报一个错误。

微博登录集成

微博登录集成需要用到微博开放平台的SDK,SDK的接入也很简单,只需要在项目的Podfile中添加以下代码即可:

pod 'WeiboSDK'

添加好之后,需要在项目的AppDelegate中进行初始化:

import WeiboSDK

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        
        // 微博开放平台SDK初始化
        WeiboSDK.registerApp("3224510646")
        
        return true
    }

    // 微博登录回调
    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
        return WeiboSDK.handleOpen(url, delegate: self)
    }
}

需要注意的是,在使用微博登录时,也需要先获取用户的授权,否则会报一个错误。

极光推送集成

极光推送集成需要用到极光推送的SDK,SDK的接入也很简单,只需要在项目的Podfile中添加以下代码即可:

pod 'JPush'

添加好之后,需要在项目的AppDelegate中进行初始化:

import JPush

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        
        // 极光推送SDK初始化
        let entity = JPUSHRegisterEntity()
        entity.types = NSInteger(UNAuthorizationOptions.alert.rawValue) | NSInteger(UNAuthorizationOptions.sound.rawValue) | NSInteger(UNAuthorizationOptions.badge.rawValue)
        JPUSHService.register(forRemoteNotificationConfig: entity, delegate: self)
        JPUSHService.setup(withOption: launchOptions, appKey: "JPushAppKey", channel: "JPushChannel", apsForProduction: false, advertisingIdentifier: nil)
        
        return true
    }

    // 极光推送回调
    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        JPUSHService.registerDeviceToken(deviceToken)
    }
}

需要注意的是,在使用极光推送时,需要先获取用户的授权,否则会报一个错误。

友盟集成

友盟集成需要用到友盟的SDK,SDK的接入也很简单,只需要在项目的Podfile中添加以下代码即可:

pod 'UMengAnalytics'

添加好之后,需要在项目的AppDelegate中进行初始化:

import Umeng

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        
        // 友盟SDK初始化
        UMConfigure.initWithAppkey("UmengAppKey", channel: "UmengChannel")
        
        return true
    }
}

手动集成第三方组件时需要注意的点

在手动集成第三方组件时,需要