FinClip为企业提供小程序生态圈技术产品,开发者可在FinClip小程序开发帮助中心找到相关FinClip小程序指引

# iOS端 集成

集成样例代码

可以在这里参考集成样例代码https://github.com/finogeeks/mop-ios-demo (opens new window)

# 1.创建应用

注册用户可以在应用管理页,新增合作应用。
image.png

# 2.获得SDK KEY和SDK SECRET

点击下拉箭头展开应用,可以查看到SDK KEY和SDK SECRET。
image.png

  • SDK KEY:是合作应用能使用小程序SDK的凭证,如果SDK KEY校验失败,则SDK的所有Api都无法使用。
  • SDK SECRET:是访问服务的安全证书,不要给第三方。

# 3.导出SDK指纹

点击左侧【SDK 管理】菜单,新增SDK供应商,上传 iOS 与 Android SDK,审核通过后,可导出SDK指纹。
image.png image.png

# 4.集成SDK

凡泰小程序SDK 目前支持pod集成或者手动集成。

# 4.1 Pod集成

# 4.1.1 安装pod环境

Cocoapods 提供了一个非常简单的依赖管理系统,避免手动导入产生的错误。

如果您没有安装过Cocoapods,可以查看官方安装指南(英文) (opens new window)史上最详细的CocoaPods安装教程(中文) (opens new window)

sudo gem install cocoapods
pod setup

# 4.1.2 创建Podfile文件

注意

从2.8.5版本开始,凡泰小程序SDK分为核心SDK(FinApplet)和扩展SDK(FinAppletExt)。把部分需要权限的api移到了扩展SDK中,核心SDK中只包含一些必要权限的api和不需要权限的api。核心SDK只包含定位、相册、摄像头三个权限,其他需要申请权限的api都会移动到扩展SDK中。

所以,如果你只需要使用扩展SDK,那么在podfile中只依赖FinApplet即可。如果你需要使用扩展SDK中的api,那么你还需要依赖FinAppletExt

当你在使用map组件的功能时,如果想使用三方地图来实现的话,可引用FinAppletBDMap(百度地图)FinAppletGDMap(高德地图),默认由原生地图实现。

如果需要在小程序中使用WebRTC功能,可以在podfile中添加FinAppletWebRTC依赖,这个库是我们基于GoogleWebRTC的二次封装库,支持iOS9以上系统版本。

如果需要在小程序中使用蓝牙功能,可以在podfile中添加FinAppletBLE依赖

在 Xcode 项目的根目录下,新建一个Podfile文件,在Podfile文件中添加对小程序SDK的依赖:

pod 'FinApplet'
pod 'FinAppletExt'
pod 'FinAppletBDMap'
pod 'FinAppletGDMap'
pod 'FinAppletWebRTC'
pod 'FinAppletBLE'

Podfile示例:

platform :ios, "9.0"


inhibit_all_warnings!

target "FinoAppletDemo" do
    pod 'FinApplet'
end


post_install do |installer|
    installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings['ENABLE_STRICT_OBJC_MSGSEND'] = 'NO'
            config.build_settings['APPLICATION_EXTENSION_API_ONLY'] = 'NO'
        end
    end
end

注意

最近有客户反馈添加Cocoapods源https://github.com/CocoaPods/Specs.git,反而导致更新依赖很慢,或者无法更新依赖的情况,可以尝试将这个源注释掉或去掉。

# 4.1.3 安装或更新依赖

然后,执行 pod update 或者 pod install 即可。

# 4.1.4 打开工程

执行完 pod update 或者 pod install ,打开工程目录,找到xxx.xcworkspace文件,双击打开即可。

# 4.2 手动集成

为了方便开发者快速体验运行以及使用模拟器开发调试,我们的SDK中包含x86_64架构,所以在上架appStore之前,一定要记得删除x86_64架构。

您可以自己手动删除,也可以自己网上找脚本删除,或者按照3.2.4给工程配置脚本。工程配置脚本,开发调试依然可以使用模拟器,但是archive 时,会自动去除模拟器架构。

# 4.2.1 添加SDK至工程

FinApplet.framework拖进工程。

当然,如果你需要用到FinAppletExt.framework中的api,那么,你还得把FinAppletExt.framework也拖进工程。

# 4.2.2 修改工程配置

当然,如果你需要用到FinAppletExt.framework中的api,那么,你还得把FinAppletExt.framework也添加进Copy Files中。

注意

当手动引入FinAppletBDMap(百度地图)或FinAppletGDMap(高德地图)时,嵌入类型默认为Do Not Embed(TARFGETS --- General --- Frameworks,Libraries,abd Embedded Content)。当手动引入高德地图时,需自行接入高德的AMap3DMap-NO-IDFA,AMapLocation-NO-IDFA,AMapSearch-NO-IDFA三个库,当手动引入百度地图时,需自行接入百度的BMKLocationKit,BaiduMapKit/Map,BaiduMapKit/Search三个库。

注意

当手动引入FinAppletBDMap(百度地图)或FinAppletGDMap(高德地图)时,需手动将framework中的bundle资源文件也添加到工程中(FinAppletBDMap.bundle或FinAppletGDMap.bundle)。

# 4.2.3 打开工程

双击xxxx.xcodeproj,打开工程。

# 5.增加隐私权限

在工程info.plist文件中增加隐私权限,如果您使用的小程序中使用到了相册、摄像头、位置、录音、通讯录等功能,您需要配置如下隐私权限:

  • Privacy - Photo Library Usage Description 需要访问您的相册
  • Privacy - Microphone Usage Description 需要访问您的麦克风
  • Privacy - Camera Usage Description 需要访问您的摄像机
  • Privacy - Location Always Usage Description 需要您的同意,才能始终访问位置
  • Privacy - Location When In Use Usage Description 需要您的同意,才能在使用期间访问位置
  • Privacy - Contacts Usage Description 需要您的同意,才能访问通讯录

注意

如果你的工程里已经配置过这些权限,那就不用再添加了。 另外,如果您仅需要核心SDKFinApplet,那么您只需要配置相册、摄像头、位置的权限描述信息。

如果,您也需要用到扩展SDKFinAppletExt,那么您就需要再配置上通讯录、录音等权限的描述信息。
另外,如果你的小程序中的请求或者网页有使用到http协议的,还需要在工程里配置如下参数:

<key>NSAppTransportSecurity</key>
	<dict>
		<key>NSAllowsArbitraryLoads</key>
		<true/>
	</dict>

也就是【App Transport Security Settings】---> 【Allow Arbitrary Loads】设置为YES。

# 6.添加URL Type

选择 Target ---> 【Info】 ---> 【URL Types】,新增一个URL Schemes(URL Schemes的格式是fat+sdkKey的md5)。
先将sdkKey生成16位小写md5,然后在加上fat前缀。

# 7.添加SDK头文件

在需要使用凡泰小程序SDK的地方,添加如下代码:

#import <FinApplet/FinApplet.h>

如果还集成了扩展SDK,那么调用扩展SDK中的api,还需要加上下面的代码:

#import  <FinAppletExt/FinAppletExt.h>

如果要使用封装的百度地图sdk,还需要加上下面的代码:

#import  <FinAppletBDMap/FinAppletBDMap.h>

如果要使用封装的高德地图sdk,还需要加上下面的代码:

#import  <FinAppletGDMap/FinAppletGDMap.h>

如果要使用封装的WebRTC库,还需要加上下面的代码:

#import <FinAppletWebRTC/FinAppletWebRTC.h>

如果需要使用蓝牙库,还需要加上下面的代码:

#import #import <FinAppletBLE/FinAppletBLE.h>

当然,最方便的方式是在 pch文件中添加以上代码,这样在使用的地方就不用再引用了。

# 8.初始化 SDK

在工程的 AppDelegate 中的以下方法中,调用 SDK 的初始化方法。

注意

从2.13.109版本开始,FinClip 小程序 SDK 支持配置多个服务器信息,可以同时打开多个不同服务器上的小程序,所以初始化方式有所变更,您可以将服务器配置信息写入plist文件,然后按照如下示例初始化。

NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"servers" ofType:@"plist"];
NSArray *array = [NSArray arrayWithContentsOfFile:plistPath];
NSMutableArray *storeArrayM = [NSMutableArray array];
for (NSDictionary *dict in array) {
    FATStoreConfig *storeConfig = [[FATStoreConfig alloc] init];
    storeConfig.sdkKey = dict[@"sdkKey"];
    storeConfig.sdkSecret = dict[@"sdkSecret"];
    storeConfig.apiServer = dict[@"apiServer"];
    storeConfig.apiPrefix = dict[@"apiPrefix"];
    storeConfig.fingerprint = dict[@"fingerprint"];
    storeConfig.apmServer = dict[@"apmServer"];
    if ([@"SM" isEqualToString:dict[@"cryptType"]]) {
        storeConfig.cryptType = FATApiCryptTypeSM;
    } else {
        storeConfig.cryptType = FATApiCryptTypeMD5;
    }
    
    [storeArrayM addObject:storeConfig];
}
FATConfig *config = [FATConfig configWithStoreConfigs:storeArrayM];
[[FATClient sharedClient] initWithConfig:config error:nil];

也可以这样初始化:

NSMutableArray *storeArrayM = [NSMutableArray array];
FATStoreConfig *storeConfig = [[FATStoreConfig alloc] init];
storeConfig.sdkKey = @"您的sdkKey信息";
storeConfig.sdkSecret = @"您的sdkSecret信息";
storeConfig.apiServer = @"服务器域名";
storeConfig.apiPrefix = @"/api/v1/mop";
storeConfig.apmServer = @"apm统计事件的域名";
storeConfig.fingerprint = @"SDK 指纹信息";
[storeArrayM addObject:storeConfig];
   
FATStoreConfig *storeConfig2 = [[FATStoreConfig alloc] init];
storeConfig2.sdkKey = @"您的sdkKey信息";
storeConfig2.sdkSecret = @"您的sdkSecret信息";
storeConfig2.apiServer = @"服务器域名";
storeConfig2.apiPrefix = @"/api/v1/mop";
storeConfig2.apmServer = @"apm统计事件的域名";
storeConfig2.cryptType = FATApiCryptTypeSM;
storeConfig.fingerprint = @"SDK 指纹信息";
[storeArrayM addObject:storeConfig2];

FATConfig *config = [FATConfig configWithStoreConfigs:storeArrayM];
[[FATClient sharedClient] initWithConfig:config error:nil];

注意

2.21.1 以及之后的版本,不再需要调用配置扩展SDK,SDK 内部会自动判断是否集成扩展SDK,自动触发配置扩展SDK。

当然,如果您需要使用到扩展SDK中的Api,那么您还需要在初始化SDK之后,配置扩展api。 调用一次如下代码即可:

// 准备扩展api
[[FATExtClient sharedClient] fat_prepareExtensionApis];

当需要使用百度地图/高德地图来实现map组件的功能时,需要去对应的平台申请key,并进行初始化。

// 准备地图sdk初始化
[FATBDMapComponent setBDMapAppKey:@"申请的key"]
[FATGDMapComponent setGDMapAppKey:@"申请的key"]

当需要使用WebRTC组件的功能时,需要进行初始化注册组件。

// WebRTC初始化
[FATWebRTCComponent registerComponent]

蓝牙库无需进行初始化,在项目中引用了头文件即可。

注意

如果未设置currentUserId,则缓存数据会缓存到默认目录,获取最近打开小程序列表时,获取到的是默认目录下的小程序。如果要不同用户使用不同的缓存目录,请不同用户设置不同的currentUserId。

# 8.handleOpenURL处理

小程序支持外部通过链接打开小程序,需要做如下处理。

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    if ([[FATClient sharedClient] handleOpenURL:url]) {
        return YES;
    }
    return YES;
}

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{
    if ([[FATClient sharedClient] handleOpenURL:url]) {
        return YES;
    }
    return YES;
}

# 9.打开小程序

FATAppletRequest *request = [[FATAppletRequest alloc] init];
request.appletId = @"小程序id";
request.apiServer = @"服务器地址";
request.transitionStyle = FATTranstionStyleUp;
request.startParams = startParams;
    
[[FATClient sharedClient] startAppletWithRequest:request InParentViewController:self completion:^(BOOL result, FATError *error) {
    NSLog(@"打开小程序:%@", error);
} closeCompletion:^{
    NSLog(@"关闭小程序");
}];
© FinClip with ❤ , Since 2017