身体潮湿是什么原因| 茴香豆是什么豆| 东莞市委书记什么级别| 右耳烫代表什么预兆| 睡不醒是什么原因| 吃东西恶心想吐是什么原因| 指腹脱皮是什么原因| 肤色黑穿什么颜色| 乌鸡蛋是什么颜色| 指甲盖有竖纹是什么原因| 全套是什么意思| 夵是什么意思| 什么水果是降火的| 女性长胡子是什么原因| evisu是什么牌子中文| 宿便是什么颜色| 4c是什么| 风寒感冒吃什么药好| 花肠是母猪的什么部位| 男人交生育保险有什么用| 安全监察是一种带有什么的监督| 肺部肿瘤切除后吃什么| 烟嗓是什么意思| 户籍地址填什么| emoji是什么意思| 十岁小孩尿床是什么原因| 阴骘什么意思| 脑淤血是什么原因引起的| 畅字五行属什么| 马齿苋能治什么病| 7月20是什么星座| 脸色暗沉发黑什么原因| 节点是什么| 法官是什么级别| 拂是什么生肖| 尿蛋白高是什么病| 榴莲树长什么样子图片| 养老金什么时候补发| 省略号的作用是什么| 狗舔人是什么意思| 饭中吃药是什么时候吃| 农历五月二十四是什么星座| 宣是什么意思| 口腔医学学什么课程| 老面是什么面| 胰腺的作用和功能是什么| 湿气重吃什么药最好| hugo是什么意思| 日出扶桑是什么意思| 十字架代表什么意思| 吃紫甘蓝有什么好处| 屡禁不止的意思是什么| 甲亢是什么病| 黄瓜是绿色的为什么叫黄瓜| shit什么意思中文| 治疗白头发挂什么科| 心静自然凉是什么意思| 三天不打上房揭瓦的下一句是什么| 网络是什么意思| 梦见水是什么预兆| 奔走相告是什么意思| 嗓子痒是什么原因| 营养过剩是什么意思| 开水冲鸡蛋有什么好处| 两棵树是什么牌子| 湿气重不能吃什么| 一九七八年属什么生肖| 类风湿关节炎吃什么药效果好| 紫癜是什么| 油嘴滑舌指什么生肖| 小排畸是什么检查| 哈西奈德溶液治什么病| 一什么水花| 西罗手表什么档次| 下午一点多是什么时辰| 火命人适合什么颜色| 脚气是什么症状| 渴望是什么意思| 胎盘老化对胎儿有什么影响| 孕妇喝咖啡有什么危害| 颅内出血有什么症状| 福肖指什么生肖| 什么驴技穷成语| ti什么意思| cas是什么| 什么叫tct检查| 东南属什么五行| sad是什么意思| 中国的国菜是什么| 1939年属什么| 甲沟炎什么症状| 青梅竹马什么意思| alt是什么| 青少年吃什么钙片有助于长高| 什么样的雨珠| 流产后吃什么| 麝香是什么动物| 心脏长在什么位置| 经常口腔溃疡吃什么维生素| 7.2号是什么星座| 愚公移山是什么故事| 梦见飞机是什么意思| 每天起床口苦口臭是什么原因| 谭咏麟属什么生肖| 大腿麻木是什么原因| 尿沉渣红细胞高是什么原因| tid什么意思| 三尖瓣反流什么意思| 什么是性| 健身吃蛋白粉有什么好处和坏处| 职称是什么| ecom什么意思| 六字箴言是什么意思| 什么是肌张力| 入珠是什么意思| nb是什么牌子| 晚黄瓜什么时候种| 头眩晕吃什么药| 冬虫夏草是什么东西| 大黄泡水喝有什么功效| 袁崇焕为什么杀毛文龙| 冬五行属什么| 3月28日是什么星座| 为什么会长麦粒肿| 牙齿深覆合是什么意思| 小限是什么意思| 中耳炎吃什么药最有效| 黑蛇是什么蛇| 输血前常规检查是什么| 中气下陷吃什么药| 福生无量天尊什么意思| 月牙消失了是什么原因| 数位是什么| 跳什么舞减肥最快| 咳嗽吃什么好| 脚后跟长痣有什么寓意| 吃什么减肥瘦肚子| 破执是什么意思| skp是什么品牌| 身体不适是什么意思| 双肺斑索是什么意思| 下肢肿胀是什么原因| 什么是高利贷| 咳嗽有血是什么原因| 3月28号是什么星座| 黄芪是什么样子的| 孕妇过敏性鼻炎可以用什么药| 膝超伸是什么| 吃什么有助于伤口愈合| 羔羊是什么意思| 胃痛吃什么药| 市长什么级别| 才美不外见的见是什么意思| 贼是什么意思| 生命之水是什么| 胸口痛挂什么科| 面霜是干什么用的| 月经前腰疼是什么原因| 缘分什么意思| 子宫脱垂是什么症状| 地瓜不能和什么一起吃| 孕妇梦见蛇是什么意思| 女人脸肿是什么原因引起的| 炭疽病用什么农药最好| ua是什么单位| 兴奋剂是什么| 足跟疼挂什么科室| 牛奶不能和什么东西一起吃| 血压偏低吃什么东西补最好| 36周检查什么项目| 什么叫前庭功能| 人为什么会胡思乱想| aid是什么意思| 属狗男和什么属相最配| 黄芪的作用是什么| 螳螂吃什么| taco什么意思| 什么是龋齿| 类风湿要吃什么药| 腰腿疼痛吃什么药效果好| 电解质水是什么| 一个山一个鬼念什么| b型血rh阳性是什么意思| 毛遂自荐是什么意思| 笑面虎比喻什么样的人| 阴道菌群失调用什么药| 尿毒清颗粒主治什么病| 11五行属什么| 多巴胺是什么意思| 献血证有什么用| 灵芝有什么作用| 吃什么东西化痰| 喊6个1是什么意思| 冒虚汗是什么原因| 肺有问题会出现什么症状| 卫生局是什么单位| 尼龙属于什么材料| 麦粒肿是什么| 女人为什么要少吃鳝鱼| 大学休学1年有什么影响| 西湖醋鱼是什么菜系| 肝炎五项检查是什么| 鸣字五行属什么| 济南有什么特产| 上火流鼻血是什么原因| 皇子的妻子叫什么| 维和部队是干什么的| 住院医师是什么意思| 94年什么生肖| 老打瞌睡犯困是什么原因| 拉肚子恶心想吐吃什么药| 尿潜血弱阳性是什么意思| 腿容易麻是什么原因| 怀孕有积液是什么原因| 纸尿裤nb是什么码| 妇科炎症吃什么药| 送表的寓意是什么| 吃什么蔬菜可以降血脂| 阿尔茨海默病吃什么药| 整夜做梦是什么原因| 憨是什么意思| 喝酒吐血是什么原因| 身体缺钾吃什么药| 无下限是什么意思| 导管是什么意思| 什么人群不适合吃阿胶糕| y代表什么意思| 阴骘什么意思| 更是什么结构的字| 沙棘是什么| 常青藤是什么意思| 姥爷是什么意思| 身上没长什么就是干痒| 40年什么婚| 印度是什么人种| 子宫穿孔有什么症状| 效果是什么意思| 不现实什么意思| 小蛇吃什么| 土耳其说什么语言| 似是而非是什么意思| 胃疼吃什么食物最养胃| 奶奶过生日送什么礼物| 指压板有什么功效| 什么叫房颤| 小孩为什么吃果糖二磷酸钠| 舌苔发黄是什么病| 吹风扇感冒了吃什么药| 胸膜炎什么症状| 法兰绒是什么面料| 十万为什么| 胃肠性感冒吃什么药| 四川大学校长什么级别| 丁香花什么颜色| 已读不回是什么意思| 轧戏是什么意思| 陈皮泡酒喝有什么功效和作用| 肠镜什么情况下取活检| 肝实质密度减低是什么意思| 无可奈何的笑是什么笑| 烤乳扇是什么| 不倒翁是什么意思| 游泳是什么运动| 变色龙指什么人| 百度

“书山曲海”里的古韵流香 教人沉醉

百度 然而,一些细节问题仍然困扰着相关企业,专家呼吁制定更加详尽细致的标准。

集成样例代码

我们提供了包含“微信登录,微信支付,高德地图、百度地图”功能的样式 DEMO 工程,开发者可以在Github(国外) (opens new window)Gitee(国内) (opens new window) 获取集成样例代码。

# 1. 获取凭据

请注意

集成 SDK 需要先在 “人民网+”小程序 平台中创建应用绑定小程序,获得每个应用专属的SDK KEYSDK SECRET后,随后就可以在集成 SDK 时填写对应的参数。打开小程序时 SDK 会自动初始化,并校验SDK KEYSDK SECRETBundleID(Application ID)是否正确。

# 2. 集成SDK

“人民网+”小程序 SDK 目前支持pod集成或者手动集成

# 2.1 Pod集成

# 2.1.1 安装pod环境

Cocoapods 提供了一个非常简单的依赖管理系统,避免手动导入产生的错误。 如果您没有安装过Cocoapods,可以查看官方安装指南(英文) (opens new window)CocoaPods安装教程(中文) (opens new window)

sudo gem install cocoapods
pod setup

# 2.1.2 创建Podfile文件

注意

2.8.5版本开始,“人民网+”小程序 SDK 拆分为多个SDK:FinApplet(核心SDK)FinAppletExtFinAppletBDMapFinAppletGDMapFinAppletWebRTCFinAppletBLEFinAppletAgoraRTCFinAppletContactFinAppletClipBoardFinAppletWXExtFinAppletShare

其中只有inApplet是必须的,其他扩展 SDK 可根据实际情况选择集成。

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

  • 当你在使用Map组件的功能时,如果想使用三方地图来实现的话,可引用FinAppletBDMap(百度地图)FinAppletGDMap(高德地图),默认情况下则由原生地图实现;
  • 如果需要在小程序中使用WebRTC功能,可以在podfile中添加FinAppletWebRTC依赖,这个库是我们基于Google WebRTC库的二次封装库,支持iOS9以上系统版本;
  • 如果需要在小程序中使用蓝牙功能,可以在podfile中添加FinAppletBLE依赖;
  • 如果需要在小程序中使用live-pusherlive-player功能,可以在podfile中添加FinAppletAgoraRTC依赖;
  • 如果需要在小程序中使用addPhoneContact,添加手机通讯录联系人,可以在podfile中添加FinAppletContact依赖;
  • 如果需要在小程序中使用剪贴板功能,可以在podfile中添加FinAppletClipBoard依赖;
  • 如果需要在小程序中接入微信的登录,支付,获取用户信息等能力,可以在podfile中添加FinAppletWXExt依赖;
    • 如果需要在小程序中接入分享到微信好友,朋友圈,网页链接,并能打开对应的小程序和分享时所在的页面的能力,可以在podfile中添加FinAppletShare依赖;

注意

在使用FinAppletWXExtFinAppletShare时,需要按照 微信接入指南-iOS 接入指南 (opens new window) 进行配置,具体有如下内容:

  1. 配置应用的Universal Links
  2. 打开Associated Domains开关,将Universal Links域名加到配置上;
  3. 在工程的Target -> 【Info】 -> 【URL Types】,新增一个URL Schemes(key为weixin,value为wx+在微信申请的Appid);
  4. 在工程info.plist中增加应用访问白名单LSApplicationQueriesSchemes,对应的要填写的值为wechatweixinweixinULAPI。记得在苹果开发者中心App ID Configuration处勾选Associated Domains
  5. 如果遇到引用微信头文件报错,把 target 下的 Build Settings 中的 Allow Non-modular includes in Framework Modules 设置成YES。

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

pod 'FinApplet'
pod 'FinAppletExt'
pod 'FinAppletBDMap'
pod 'FinAppletGDMap'
pod 'FinAppletWebRTC'
pod 'FinAppletBLE'
pod 'FinAppletAgoraRTC'
pod 'FinAppletContact'
pod 'FinAppletClipBoard'
pod 'FinAppletWXExt'
pod 'FinAppletShare'

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

# 2.1.3 安装或更新依赖

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

# 2.1.4 打开工程

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

# 2.2 手动集成

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

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

当然,你也可以说明只需要真机架构,那么我们就只交付包含真机架构的SDK。

注意

由于百度地图、高德地图、腾讯地图、微信SDK都是静态库,所以FinAppletBDMap(百度地图)FinAppletGDMap(高德地图)FinAppletTXMap(腾讯地图)FinAppletWXExt(微信拓展SDK)FinAppletShare(分享SDK)也均为静态库。

# 2.2.1 集成步骤

2.2.1.1 添加SDK至工程

将FinApplet.framework拖进工程。

当然,如果你需要用到FinAppletExtFinAppletWebRTCFinAppletBLEFinAppletAgoraRTCFinAppletContact中的 API,那么,你还得把FinAppletExt.frameworkFinAppletWebRTC.frameworkFinAppletBLE.frameworkFinAppletAgoraRTC.frameworkFinAppletContact.frameworkFinAppletClipBoard.framework也拖进工程。

2.2.1.2 修改工程配置

则需要按照如下配置即可:

如果你需要用到FinAppletExtFinAppletWebRTCFinAppletBLEFinAppletAgoraRTCFinAppletContactFinAppletClipBoardFinAppletGDMap.frameworkFinAppletBDMap.framework中的 API,那么,你还需要把对应的framework也添加进Copy Files中。

注意

  1. FinAppletWebRTC.framework是基于 Google 的 WebRTC 库做的二次封装,所以也需要导入GoogleWebRTC库 (opens new window)(需科学上网),如果因网络问题不能下载也可以在我们平台下载GoogleWebRTC库 (opens new window)
  2. FinAppletGDMap.framework是基于高德地图 SDK 做的二次封装,集成需要导入高德地图AMap3DMap-NO-IDFAAMapLocation-NO-IDFAAMapSearch-NO-IDFA这 3 个 SDK ,2.37.9及以上版本可以使用最新的9.40版本,2.37.9之前的版本需要用高德地图9.4.0之前的版本,可以去高德地图官网 (opens new window)下载相关 SDK ;
  3. FinAppletBDMap.framework是基于百度地图 SDK 做的二次封装,需要集成导入百度地图BMKLocationKitBaiduMapKit/MapBaiduMapKit/Search这 3 个 SDK ,可以去百度地图官网 (opens new window)下载相关 SDK ;
  4. FinAppletAgoraRTC.framework是基于声网 SDK 做的二次封装,可以去声网 (opens new window)下载对应 SDK 导入到工程;
  5. FinAppletWXExtFinAppletShare是基于微信终端 SDK 做的二次封装,可以去微信开放平台 (opens new window)下载sdk包导入到工程。

2.2.1.3 打开工程

双击xxxx.xcodeproj,打开工程。

2.2.1.4 配置archive脚本

小程序 SDK 中包含x86_64架构,便于我们开发时用模拟器调试。但是x86_64架构的SDK,打包上传应用市场时会报错,所以配置一个打包时自动去除模拟器架构的脚本,可以让我们既可以用模拟器开发调试,又能正常提交应用市场。

当然,你也可以找我们要一个不包含模拟器的SDK。

脚本内容如下:

#!/bin/sh

# Strip invalid architectures

strip_invalid_archs() {
binary="$1"
echo "current binary ${binary}"
# Get architectures for current file
archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)"
stripped=""
for arch in $archs; do
if ! [[ "${ARCHS}" == *"$arch"* ]]; then
if [ -f "$binary" ]; then
# Strip non-valid architectures in-place
lipo -remove "$arch" -output "$binary" "$binary" || exit 1
stripped="$stripped $arch"
fi
fi
done
if [[ "$stripped" ]]; then
echo "Stripped $binary of architectures:$stripped"
fi
}

APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"

# This script loops through the frameworks embedded in the application and
# removes unused architectures.
find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK
do
FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)
FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"
echo "Executable is $FRAMEWORK_EXECUTABLE_PATH"

strip_invalid_archs "$FRAMEWORK_EXECUTABLE_PATH"
done

请注意:

如果集成完后运行到模拟器上报如下错误:Building for iOS Simulator, but the linked and embedded framework 'FinApplet.framework' was built for iOS + iOS Simulator.则需要按照如下方式修改。

解决办法: 如下图修改Validate WorkspaceYes后,可以重新编译通过;之后可以改回成NO,就不会报错了。

image.jpg

# 2.3 Swift 工程集成OC第三方库

如果你的工程是用 Swift 写的,则集成 OC 第三方库需要额外配置。

  1. 如果你的工程从没添加过 OC 文件,则新建一个 OC 文件时,会询问你是否自动生成桥接文件,点Create Bridge Header以生成头文件。

    image.jpg

  2. 如果你的工程添加过 OC 文件,但没有生成桥接文件,则需要自己手动新建一个 Header ,命名为"{target名-Bridging-Header.h}",如"SwiftDemo-Bridging-Header.h"。并且在项目的 targets 里的 Build Settings 选项里,找到 Objective-c Bridging Header 选项,将这一项设置为刚刚创建的.h文件,如"SwiftDemo/SwiftDemo-Bridging-Header.h"。(其中 SwiftDemo 是 target 名)

    image.jpg

  3. 往该文件中添加一行代码:

    #include <FinApplet/FinApplet.h>
    

然后 Swift 工程就可以使用 FinApplet 的 OC 第三方库了。

# 3. 增加权限描述

根据您的实际需求,集成响应的SDK,并在工程info.plist文件中增加权限配置

如果您集成所有的 SDK,那么需要配置的权限包括:相册、相机、麦克风、位置、蓝牙、通讯录。这些权限,全都是调用相应的api和组件时才会触发。

权限名称
权限对应的 KEY
相册读取 NSPhotoLibraryUsageDescription
相册写入 NSPhotoLibraryAddUsageDescription
相机 NSCameraUsageDescription
麦克风 NSMicrophoneUsageDescription
位置 NSLocationAlwaysAndWhenInUseUsageDescription、NSLocationAlwaysUsageDescription、NSLocationWhenInUseUsageDescription
蓝牙 NSBluetoothAlwaysUsageDescription、NSBluetoothPeripheralUsageDescription
通讯录 NSContactsUsageDescription

其中各个SDK中涉及的权限如下(您可以根据实际情况选择集成):

其中核心SDK(FinApplet)涉及的权限:

权限名称 权限对应的 KEY 权限涉及的 API
相册读取 NSPhotoLibraryUsageDescription chooseImage、chooseVideo、chooseMedia
相册写入 NSPhotoLibraryAddUsageDescription saveImageToPhotosAlbum、saveVideoToPhotosAlbum
相机 NSCameraUsageDescription scanCode、chooseImage、chooseVideo、chooseMedia、CameraContext(Camera组件)
麦克风 NSMicrophoneUsageDescription chooseVideo、chooseMedia、CameraContext(Camera组件)

注意

录制视频时,系统会先后访问相机和麦克风权限。

扩展SDK(FinAppletExt)涉及的权限:

权限名称 权限对应的 KEY 权限涉及的 API
麦克风 NSMicrophoneUsageDescription startRecord、RecorderManager
位置 NSLocationAlwaysAndWhenInUseUsageDescription、NSLocationAlwaysUsageDescription、NSLocationWhenInUseUsageDescription chooseLocation、getLocation、openLocation、choosePoi

扩展SDK-WebRTC(FinAppletWebRTC)涉及的权限:

权限名称 权限对应的 KEY 权限涉及的 API
相机 NSCameraUsageDescription webrtc-video组件
麦克风 NSMicrophoneUsageDescription webrtc-video组件

扩展SDK-BDMap(FinAppletBDMap)涉及的权限:

权限名称 权限对应的 KEY 权限涉及的 API
位置 NSLocationAlwaysAndWhenInUseUsageDescription、NSLocationAlwaysUsageDescription、NSLocationWhenInUseUsageDescription Map组件

扩展SDK-GDMap(FinAppletGDMap)涉及的权限:

权限名称 权限对应的 KEY 权限涉及的 API
位置 NSLocationAlwaysAndWhenInUseUsageDescription、NSLocationAlwaysUsageDescription、NSLocationWhenInUseUsageDescription Map组件

扩展SDK-BLE(FinAppletBLE)涉及的权限:

权限名称 权限对应的 KEY 权限涉及的 API
蓝牙 NSBluetoothAlwaysUsageDescription、NSBluetoothPeripheralUsageDescription 蓝牙-通用、蓝牙-低功耗中心设备、蓝牙-低功耗外围设备、蓝牙-信标一些列api

扩展SDK-AgoraRTC(FinAppletAgoraRTC)涉及的权限:

权限名称 权限对应的 KEY 权限涉及的 API
相机 NSCameraUsageDescription live-pusher,live-player组件
麦克风 NSMicrophoneUsageDescription live-pusher,live-player组件

扩展SDK-Contact(FinAppletContact)涉及的权限:

权限名称 权限对应的 KEY 权限涉及的 API
通讯录 NSContactsUsageDescription addPhoneContact

分享SDK-shareSDK(FinAppletShare)涉及的权限:

权限名称 权限对应的 KEY 权限涉及的 API
相册写入 NSPhotoLibraryAddUsageDescription 保存按钮

注意

如果你的工程里已经配置过这些权限,那就不用再添加了。

另外,如果你的小程序中的请求或者网页有使用到http协议的,还需要在工程里配置如下参数:

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

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

# 4. 添加URL Type

注意

第4步和第7步不是必须项,如果您的 App 会通过其他 App(safari、微信等)打开您 App 中的小程序,那么就必须配置第4步和第7步。

选择 Target -> 【Info】 -> 【URL Types】,新增一个URL Schemes(URL Schemes的格式是fat+sdkKey的md5。)

先将 SDK KEY 生成 16 位小写 MD5 ,然后在加上fat前缀。
image.jpg


关于如何使用,可参考使用路由的形式打开小程序

# 5. 设置工程支持的方向

image.jpg

注意

1.由于小程序的公共UI,比如loading页、关于、设置、投诉反馈等页面都是固定竖屏,所以App需要勾选Portrait。 2.小程序内的app.json和page.json里pageOrientation可以设置为portrait、landscape、auto,所以App需要支持横屏和竖屏。

具体的关于SDK横竖屏的处理场景见SDK中横竖屏的详细说明

# 6. 添加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 <FinAppletBLE/FinAppletBLE.h>

如果需要使用封装的声网 SDK,还需要加上下面的代码:

#import <FinAppletAgoraRTC/FinAppletAgoraRTC.h>

如果需要使用封装的联系人 SDK,还需要加上下面的代码:

#import <FinAppletContact/FinAppletContact.h>

如果需要使用封装的剪贴板 SDK,还需要加上下面的代码:

#import <FinAppletClipBoard/FinAppletClipBoard.h>

如果需要使用封装的微信扩展 SDK,还需要加上下面的代码:

#import <FinAppletWXExt/FinAppletWXExt.h>

如果需要使用封装的分享 SDK,还需要加上下面的代码:

#import <FinAppletShare/FinAppletShare.h>

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

# 7. 初始化 SDK

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

注意

2.13.109版本开始,“人民网+”小程序 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.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.apmServer = @"apm统计事件的域名";
[storeArrayM addObject:storeConfig];
   
FATStoreConfig *storeConfig2 = [[FATStoreConfig alloc] init];
storeConfig2.sdkKey = @"您的sdkKey信息";
storeConfig2.sdkSecret = @"您的sdkSecret信息";
storeConfig2.apiServer = @"服务器域名";
storeConfig2.apmServer = @"apm统计事件的域名";
storeConfig2.cryptType = FATApiCryptTypeSM;
[storeArrayM addObject:storeConfig2];

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

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

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

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

// WebRTC初始化
[FATWebRTCComponent registerComponent]

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

// AgoraRTC初始化
[FATAgoraRTCComponent registerComponent]

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

// ContactSDK初始化
[FATContactComponent registerComponent]

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

// ClipBoard初始化
[FATClipBoardComponent registerComponent];

当需要使用微信的支付,登录,获取用户信息等能力时,需要进行初始化注册组件。

// 微信扩展SDL初始化
[FATWXExtComponent registerComponent:@"微信appid" universalLink:@"universalLink"];

并在AppDelegate.m中增加下面的代码。



- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
    /*  微信登录和分享    */
    if ([WXApi handleOpenURL:url delegate:[FATWXApiManager sharedManager]]) {
        return YES;
    }
    return YES;
}

// iOS 9.0 之前
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
    /*  微信登录和分享    */
    // `WeChatHandleURLDelegate ` 为 `WXApiDelegate`代理文件
    if ([WXApi handleOpenURL:url delegate:[FATWXApiManager sharedManager]]) {
        return YES;
    }
    return YES;
}

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
    /*  微信登录和分享    */
    if ([WXApi handleOpenURL:url delegate:[FATWXApiManager sharedManager]]) {
        return YES;
    }
    return YES;
}

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler {
  return [WXApi handleOpenUniversalLink:userActivity delegate:[FATWXApiManager sharedManager]];
}

当需要使用分享能力时,需要进行初始化注册组件。

// 微信扩展SDL初始化
[FATShareComponent registerComponent:@"微信appid" universalLink:@"universalLink" scheme:@"配置的scheme"];

并在AppDelegate.m中增加下面的代码。



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

// iOS 9.0 之前
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
    if ([WXApi handleOpenURL:url delegate:[FATShareApiManager sharedManager]]) {
        return YES;
    }
    return YES;
}

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
    if ([WXApi handleOpenURL:url delegate:[FATShareApiManager sharedManager]]) {
        return YES;
    }
    return YES;
}

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler {
  return [WXApi handleOpenUniversalLink:userActivity delegate:[FATShareApiManager sharedManager]];
}

注意

如果同时使用微信SDK和分享SDK,代理方法的实现类可以只设置[FATWXApiManager sharedManager]来实现。 如果工程中已经自己实现了微信代理方法的实现类,需要处理微信的请求- (void)onReq:(BaseReq*)req方法,并处理req为LaunchFromWXReq类型,得到对应的json字符串后,解析参数并通过核心SDK的打开小程序的方法,才能实现点击分享到微信的链接后打开对应的分享小程序,否则流程无法闭环。 下面是实例代码:

- (void)onReq:(BaseReq *)req {
    if ([req isKindOfClass:[LaunchFromWXReq class]]) {
        LaunchFromWXReq *launchReq = (LaunchFromWXReq *) req;
        [self managerDidRecvLaunchFromWXReq:launchReq];
    }
}

- (void)managerDidRecvLaunchFromWXReq:(LaunchFromWXReq *)launchReq {
    NSString *ext = launchReq.message.messageExt;
    NSDictionary *dic = [self dictionaryWithJsonString:ext];
    NSString *appId = dic[@"appId"];
    [[FATClient sharedClient] closeAllAppletsWithCompletion:^{
        [[FATClient sharedClient] startRemoteApplet:appId startParams:@{@"path":dic[@"path"] ? dic[@"path"] : @"", @"query":dic[@"query"] ? dic[@"query"] : @""} InParentViewController:[FATShareTools topViewController] completion:nil];
    }];
}

- (NSDictionary *)dictionaryWithJsonString:(NSString *)jsonString {
    if (jsonString == nil) {
        return nil;
    }
    NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
    NSError *err;
    NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&err];
    if(err) {
        NSLog(@"json解析失败:%@",err);
        return nil;
    }
    return dic;
}

注意

使用微信扩展SDK必须保证核心SDK版本在2.37.13或以上,使用分享SDK必须保证核心SDK版本在2.39.11或以上。

注意

由于FinAppletWXExt需要覆盖buttonOpenTypeDelegate(2.37.13前的版本为FATAppletDelegate)中的open-type相关的方法,具体为chooseAvatar、contact、feedback、getPhoneNumber、launchApp、shareAppMessage六个方法。 因此若您实现了buttonOpenTypeDelegate并实现了以上六个方法,FinAppletWXExt将会接管getPhoneNumber,剩余的五个方法请按以下方式迁移,若您未实现buttonOpenTypeDelegate或没有用到以上六个方法,可以忽略此处,若是既需要集成FinAppletWXExt又需要实现open-type相关的方法,则参考下边的说明。 1.在核心SDK和微信扩展SDK初始化成功后,设置您的代理方法实现类

[FATDelegateClientHelper sharedHelper].buttonOpenTypeDelegate = [FINWXButtonDelegate sharedHelper];

2.实现buttonOpenTypeDelegate的代理方法

- (BOOL)forwardAppletWithInfo:(NSDictionary *)contentInfo completion:(void (^)(FATExtensionCode code, NSDictionary *result))completion {
    return YES;
}

- (BOOL)getUserInfoWithAppletInfo:(FATAppletInfo *)appletInfo bindGetUserInfo:(void (^)(NSDictionary *result))bindGetUserInfo {
    return YES;
}

- (BOOL)contactWithAppletInfo:(FATAppletInfo *)appletInfo sessionFrom:(NSString *)sessionFrom sendMessageTitle:(NSString *)sendMessageTitle sendMessagePath:(NSString *)sendMessagePath sendMessageImg:(NSString *)sendMessageImg showMessageCard:(BOOL)showMessageCard {
    return YES;
}

- (BOOL)getPhoneNumberWithAppletInfo:(FATAppletInfo *)appletInfo bindGetPhoneNumber:(void (^)(NSDictionary *result))bindGetPhoneNumber {
    NSLog(@"小程序信息:%@", appletInfo);
    return YES;
}

- (BOOL)launchAppWithAppletInfo:(FATAppletInfo *)appletInfo appParameter:(NSString *)appParameter bindError:(void (^)(NSDictionary *result))bindError bindLaunchApp:(void (^)(NSDictionary *result))bindLaunchApp {
    return YES;
}

- (BOOL)feedbackWithAppletInfo:(FATAppletInfo *)appletInfo {
    return YES;
}

- (BOOL)chooseAvatarWithAppletInfo:(FATAppletInfo *)appletInfo bindChooseAvatar:(void (^)(NSDictionary *result))bindChooseAvatar {
    return YES;
}

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

注意

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

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

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

注意

如果未设置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(@"关闭小程序");
}];

其他关于 “人民网+”小程序 SDK 的 API介绍,请查看 API 说明文档

# 10. 扩展SDK

对扩展SDK使用的快速集成说明,详细使用方式参考上面的 集成SDK

# 10.1 微信扩展SDK

微信SDK的快捷接入,提供调起微信通过微信小程序获得登录、用户信息、手机号、支付的能力。 快捷集成方式:

pod 'FinAppletWXExt'

注意

在使用FinAppletWXExt时,需要按照 微信接入指南-iOS 接入指南 (opens new window) 进行配置,具体有如下内容:

  1. 配置应用的Universal Links
  2. 打开Associated Domains开关,将Universal Links域名加到配置上;
  3. 在工程的Target -> 【Info】 -> 【URL Types】,新增一个URL Schemes(key为weixin,value为wx+在微信申请的Appid);
  4. 在工程info.plist中增加应用访问白名单LSApplicationQueriesSchemes,对应的要填写的值为wechatweixinweixinULAPI。记得在苹果开发者中心App ID Configuration处勾选Associated Domains

进行初始化注册组件:

// 微信扩展SDL初始化
[FATWXExtComponent registerComponent:@"微信appid" universalLink:@"universalLink"];

并在AppDelegate.m中增加下面的代码。



- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
    /*  微信登录和分享    */
    if ([WXApi handleOpenURL:url delegate:[FATWXApiManager sharedManager]]) {
        return YES;
    }
    return YES;
}

// iOS 9.0 之前
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
    /*  微信登录和分享    */
    // `WeChatHandleURLDelegate ` 为 `WXApiDelegate`代理文件
    if ([WXApi handleOpenURL:url delegate:[FATWXApiManager sharedManager]]) {
        return YES;
    }
    return YES;
}

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
    /*  微信登录和分享    */
    if ([WXApi handleOpenURL:url delegate:[FATWXApiManager sharedManager]]) {
        return YES;
    }
    return YES;
}

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler {
  return [WXApi handleOpenUniversalLink:userActivity delegate:[FATWXApiManager sharedManager]];
}

注意

使用微信扩展SDK必须保证核心SDK版本在2.37.13或以上。

注意

由于FinAppletWXExt需要覆盖buttonOpenTypeDelegate(2.37.13前的版本为FATAppletDelegate)中的open-type相关的方法,具体为chooseAvatarcontactfeedbackgetPhoneNumberlaunchAppshareAppMessage六个方法。 因此若您实现了buttonOpenTypeDelegate并实现了以上六个方法,FinAppletWXExt将会接管getPhoneNumber,剩余的五个方法请按以下方式迁移,若您未实现buttonOpenTypeDelegate或没有用到以上六个方法,可以忽略此处,若是既需要集成FinAppletWXExt又需要实现open-type相关的方法,则参考下边的说明。
1.在核心SDK和微信扩展SDK初始化成功后,设置您的代理方法实现类

[FATDelegateClientHelper sharedHelper].buttonOpenTypeDelegate = [FINWXButtonDelegate sharedHelper];

2.实现buttonOpenTypeDelegate的代理方法

- (BOOL)forwardAppletWithInfo:(NSDictionary *)contentInfo completion:(void (^)(FATExtensionCode code, NSDictionary *result))completion {
    return YES;
}

- (BOOL)getUserInfoWithAppletInfo:(FATAppletInfo *)appletInfo bindGetUserInfo:(void (^)(NSDictionary *result))bindGetUserInfo {
    return YES;
}

- (BOOL)contactWithAppletInfo:(FATAppletInfo *)appletInfo sessionFrom:(NSString *)sessionFrom sendMessageTitle:(NSString *)sendMessageTitle sendMessagePath:(NSString *)sendMessagePath sendMessageImg:(NSString *)sendMessageImg showMessageCard:(BOOL)showMessageCard {
    return YES;
}

- (BOOL)getPhoneNumberWithAppletInfo:(FATAppletInfo *)appletInfo bindGetPhoneNumber:(void (^)(NSDictionary *result))bindGetPhoneNumber {
    NSLog(@"小程序信息:%@", appletInfo);
    return YES;
}

- (BOOL)launchAppWithAppletInfo:(FATAppletInfo *)appletInfo appParameter:(NSString *)appParameter bindError:(void (^)(NSDictionary *result))bindError bindLaunchApp:(void (^)(NSDictionary *result))bindLaunchApp {
    return YES;
}

- (BOOL)feedbackWithAppletInfo:(FATAppletInfo *)appletInfo {
    return YES;
}

- (BOOL)chooseAvatarWithAppletInfo:(FATAppletInfo *)appletInfo bindChooseAvatar:(void (^)(NSDictionary *result))bindChooseAvatar {
    return YES;
}

# 10.2 地图扩展SDK

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

高德地图SDK最多允许app同时有10个map视图对象

当超过10个map视图对象时,新的地图内容会显示黑屏。所以,当使用高德地图来实现map组件(即依赖高德地图扩展SDK)时,需要小程序在页面的onHide()里移除销毁map,然后在onShow()里创建地图和添加地图内容。

快捷集成方式:

#pod 'FinAppletBDMap'
#pod 'FinAppletGDMap'  // 选择一个放开即可
pod 'FinAppletExt'

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

#import  <FinAppletExt/FinAppletExt.h>
// 根据你实际情况,引入对应的头文件
#import  <FinAppletBDMap/FinAppletBDMap.h>
#import  <FinAppletGDMap/FinAppletGDMap.h>
// 准备地图sdk初始化
// 根据你实际情况,初始化相应的地图
[FATBDMapComponent setBDMapAppKey:@"申请的key"]
[FATGDMapComponent setGDMapAppKey:@"申请的key"]

# 10.3 蓝牙扩展SDK

如果需要在小程序中使用蓝牙功能,可引入蓝牙扩展SDK 快捷集成方式:

pod 'FinAppletBLE'

蓝牙SDK不需要初始化,引入头文件即可

#import <FinAppletBLE/FinAppletBLE.h>

# 10.4 声网扩展SDK

如果需要在小程序中使用live-pusherlive-player功能,可引入声网SDK 快捷集成方式:

pod 'FinAppletAgoraRTC'

进行初始化注册组件:

#import <FinAppletAgoraRTC/FinAppletAgoraRTC.h>
// AgoraRTC初始化
[FATAgoraRTCComponent registerComponent]

# 10.5 WebRTC扩展SDK

如果需要在小程序中使用WebRTC功能,可引入WebRTCSDK 快捷集成方式:

pod 'FinAppletWebRTC'

进行初始化注册组件:

#import <FinAppletWebRTC/FinAppletWebRTC.h>
// WebRTC初始化
[FATWebRTCComponent registerComponent]

# 10.6 联系人扩展SDK

如果需要在小程序中使用addPhoneContact,添加手机通讯录联系人,可引入联系人SDK 快捷集成方式:

pod 'FinAppletContact'

进行初始化注册组件:

#import <FinAppletContact/FinAppletContact.h>
// ContactSDK初始化
[FATContactComponent registerComponent]

# 10.7 剪贴板扩展SDK

如果需要在小程序中使用剪贴板功能,可引入剪贴板SDK 快捷集成方式:

pod 'FinAppletClipBoard'

进行初始化注册组件:

#import <FinAppletClipBoard/FinAppletClipBoard.h>
// ClipBoard初始化
[FATClipBoardComponent registerComponent];

# 10.8 分享SDK

如果需要在小程序中分享功能,可引入分享SDK 快捷集成方式:

pod 'FinAppletShare'

进行初始化注册组件:

#import <FinAppletShare/FinAppletShare.h>
// share初始化
[FATShareComponent registerComponent:@"微信appid" universalLink:@"universalLink" scheme:@"配置的scheme"];

并在AppDelegate.m中增加下面的代码。



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

// iOS 9.0 之前
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
    if ([WXApi handleOpenURL:url delegate:[FATShareApiManager sharedManager]]) {
        return YES;
    }
    return YES;
}

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
    if ([WXApi handleOpenURL:url delegate:[FATShareApiManager sharedManager]]) {
        return YES;
    }
    return YES;
}

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler {
  return [WXApi handleOpenUniversalLink:userActivity delegate:[FATShareApiManager sharedManager]];
}
头顶痛吃什么药效果好 什么人不能吃芒果 黎明是什么时候 上环要做什么检查 乔迁新居送什么礼物
禳是什么意思 舌吻是什么意思 为什么会被鬼压床 午餐吃什么 配伍是什么意思
就不告诉你就不告诉你是什么儿歌 牙龈流血是什么原因 1987年属什么 什么牌子的氨糖好 一贫如什么
疗愈是什么意思 嘴唇有黑斑是什么原因 属鸡的幸运色是什么颜色 什么颜色衣服显白 暴饮暴食容易得什么病
辣条吃多了有什么危害hcv9jop4ns7r.cn 16岁能做什么工作hcv8jop2ns3r.cn 从未是什么意思96micro.com 小什么名字好听hcv9jop7ns0r.cn 为什么手会发麻sanhestory.com
6月1日什么星座hcv9jop1ns0r.cn 天花板是什么意思hcv8jop2ns0r.cn 牛奶不能和什么东西一起吃hcv7jop6ns3r.cn 白醋和小苏打一起用起什么效果hcv9jop2ns1r.cn 后背发凉是什么原因hcv8jop5ns5r.cn
微不足道的意思是什么hcv8jop0ns8r.cn 炒菜用什么油比较好gysmod.com 来大姨妈吃什么水果hanqikai.com 纨绔子弟是什么意思hcv7jop6ns1r.cn 小便尿不出来是什么原因hcv7jop7ns0r.cn
生化妊娠什么意思hcv8jop0ns2r.cn 助听器什么牌子好用hcv9jop6ns1r.cn 前辈是什么意思fenrenren.com 7月22号是什么日子hcv7jop5ns1r.cn 荆棘是什么意思hcv8jop1ns3r.cn
百度