# 示例代码
## Android

```javascript 
@TabPageConfig
public class XXXXXTab implements ITabPageConfig {
    @Override
    public String getAppId() {
        return "cli_a56d5d4f503a900d";
    }
    @Override
    public ITabViewConfig getTabViewConfig() {
        return new KATabViewConfig();
    }
    @Override
    public boolean interceptBackPress() {
        return false;
    }
    @Override
    public Fragment getTabContent() {
        return new KATabFragment();
    }
    @Override
    public ITabTitleConfig getTabTitleConfig() {
        return new KATabTitleConfig();
    }
}
public class KATabViewConfig implements ITabPageConfig.ITabViewConfig {
    @Override
    public ITabPageConfig.TabViewClickListener getClickListener() {
        return new ITabPageConfig.TabViewClickListener() {
            @Override
            public void onSingleClick() {
            }
            @Override
            public void onDoubleClick() {
            }
        };
    }
}
public class KATabFragment extends Fragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
    @Override
    public final View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.xxxxx, container, false);
    }
    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        getChildFragmentManager().beginTransaction().add(R.id.container, new XXXXXFragment()).commitNow();
    }
}
public class KATabTitleConfig implements ITabPageConfig.ITabTitleConfig {
    @Override
    public boolean isShow() {
        return false;
    }
    @Override
    public List<IFunctionButton> getFunctionButtonList(Context context) {
        return null;
    }
    @Override
    public ITabPageConfig.TabTitleClickListener getClickListener() {
        return null;
    }
}
```

## iOS

1. 参考[Tab容器应用身份申请指南](https://open.feishu.cn/document/uAjLw4CM/ukzMukzMukzM/native-integration/open-scene-introduction/protocol-components/tab-container/tab-container-applic)申请应用，并将应用配置到主导航
1. 实现组件协议。其中的应用 appId 的形式为 19 位数字，需要联系项目经理，通过上一步中获取的应用凭证 cli_XXXXX... 获取
```javascript 
// LKTabExternalIMP.swift
import LKTabExternal
import UIKit
// 自定义 Tab 页面
public class MyTabRootViewController: UIViewController {   
    public override func viewDidLoad() {
        super.viewDidLoad()
        /* custom page view */
    }
}

// 自定义 KATabProtocol 实现
@objc
public class MyTab: NSObject, KATabProtocol {
    public var appId: String { "7343086384787750940" } // 需替换为项目经理提供的自建应用 appId
    public var showNaviBar: Bool { false } 
    public var naviBarTitle: String? { "我的应用" } 
    // 返回自定义 Tab 页面
    public var tabViewController: () -> UIViewController { MyTabRootViewController(nibName: nil, bundle: nil)}
    public var firstNaviBarButton: ((UIViewController) -> UIButton?)?  { self.createFirstButton }
    public var secondNaviBarButton: ((UIViewController) -> UIButton?)? { self.createSecondButton }
    public var tabSingleClick: (() -> Void)? {  /* impl */  }
    public var tabDoubleClick: (() -> Void)? {  /* impl */  }
}
```
3. 在 Object-C(.m) 文件代码中注册自定义的实现，load 函数会在加载 class 时执行。

方式一：直接在 OC 代码中注册
```javascript 
@import LKKABridge; // 引入 KAAPI_REGISTER 宏
@import LKTabExternal;
#import <LKTabExternalIMP/LKTabExternalIMP-Swift.h> // 引入自定义的实现 MyTab
#import "ka_auto_generated.h" // 引入 getChannel() 方法
@interface TabRegistry: NSObject
@end
@implementation TabRegistry
+(void)load {
    [KAAPI_REGISTER registerWithTab:^id<KATabProtocol> {
        return [[MyTab alloc] init];
    } cache:YES];
}
@end

```
方式二：在 OC 中调用 swift 代码注册
- .swift 文件
```javascript 
import LKKABridge
import LKTabExternal
@objcMembers
public class MyTabLoader: NSObject {
    // 注册方法
    @objc public class func swiftLoad(channel: ID) {
        let api = KAAPI(channel: channel)
        api.register(tab: MyTab.init, cache: true)
    }
}
```
- .m 文件
```javascript 
#import "ka_auto_generated.h" // 引入 getChannel() 方法
#import <LKTabExternalIMP/LKTabExternalIMP-Swift.h> // 引入 MyTabLoader 所在的.swift文件
@interface TabRegistry: NSObject
@end
@implementation TabRegistry
+(void)load {
    NSString * channel = [NSString stringWithUTF8String:getChannel()];
    [MyTabLoader swiftLoadWithChannel:channel];
}
@end
```