Android 原生配置
分享后能否跳回 App 全靠回调 Activity 的注册。模板别凭记忆编,逐项核对本页。
android/app/src/main/AndroidManifest.xml
<uses-permission>与<queries>——@unif/react-native-umeng的 library Manifest 已声明INTERNET/ACCESS_NETWORK_STATE/ACCESS_WIFI_STATE权限,以及<queries>(com.tencent.mm微信、com.alibaba.android.rimet钉钉);Android manifest merger 自动合并到宿主。- 友盟相关
<meta-data>—— appkey 等通过 JSCommon.preInit(config)传。
仅需注册两个回调 Activity(微信 / 钉钉 SDK 硬限制:必须在宿主包名下,SDK 用 getPackageName() + ".wxapi.WXEntryActivity" / + ".ddshare.DDShareActivity" 反射查找,不能放在 library 包):
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application>
<!-- 微信回调 Activity(超类见下,一行空类) -->
<activity
android:name=".wxapi.WXEntryActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:theme="@android:style/Theme.Translucent.NoTitleBar"/>
<!-- 钉钉回调 Activity(必须叫 DDShareActivity;包路径固定) -->
<activity
android:name=".ddshare.DDShareActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:launchMode="singleInstance"
android:theme="@android:style/Theme.Translucent.NoTitleBar"/>
</application>
</manifest>
微信回调 — <appPkg>/wxapi/WXEntryActivity.kt
继承友盟提供的基类 WXCallbackActivity,空类即可:
package com.example.app.wxapi
import com.umeng.socialize.weixin.view.WXCallbackActivity
class WXEntryActivity : WXCallbackActivity()
WXCallbackActivity超类必须是 com.umeng.socialize.weixin.view.WXCallbackActivity(友盟封装了微信 IWXAPIEventHandler 的回调链路),不是微信原生的 WXEntryActivity。包路径必须是 <宿主包名>.wxapi.WXEntryActivity。
钉钉回调 — <appPkg>/ddshare/DDShareActivity.kt
继承 Activity 并实现 IDDAPIEventHandler:
package com.example.app.ddshare
import android.app.Activity
import android.os.Bundle
import com.example.app.BuildConfig
import com.android.dingtalk.share.ddsharemodule.DDShareApiFactory
import com.android.dingtalk.share.ddsharemodule.IDDAPIEventHandler
import com.android.dingtalk.share.ddsharemodule.IDDShareApi
import com.android.dingtalk.share.ddsharemodule.message.BaseReq
import com.android.dingtalk.share.ddsharemodule.message.BaseResp
class DDShareActivity : Activity(), IDDAPIEventHandler {
private lateinit var iddShareApi: IDDShareApi
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// ⚠️ 这个 appId 必须跟 JS 端 Common.preInit({ dingtalkAppId: '...' }) 传的值一致。
// 钉钉 SDK 要求 Activity onCreate 时就传 appId 建 ShareApi 实例,且冷启动可能直接
// 拉起本 Activity(JS 还没跑),所以只能 native 侧拿、读不到 JS config —— 这是钉钉
// 官方 Android 接入的固有形态。为避免两处写死漂移,用构建时单一数据源
// BuildConfig.DINGTALK_APPID(定义见下)。
val appId = BuildConfig.DINGTALK_APPID
iddShareApi = DDShareApiFactory.createDDShareApi(this, appId, false)
iddShareApi.handleIntent(intent, this)
}
override fun onReq(req: BaseReq) {}
override fun onResp(resp: BaseResp) {
// 友盟钉钉回调由 SDK 内部 hook,此处 finish 即可
finish()
}
}
preInit({ dingtalkAppId }) 一致钉钉 appId 在 DDShareActivity.onCreate 传入,同一个值也要传给 JS Common.preInit({ dingtalkAppId })。推荐用 BuildConfig.DINGTALK_APPID 作为单一数据源,避免两处写死漂移。
BuildConfig 单一数据源(推荐):
// android/app/build.gradle
android {
defaultConfig {
buildConfigField "String", "DINGTALK_APPID", "\"dingoaXXXXXXXX\""
}
buildFeatures { buildConfig = true } // AGP 8+ 默认关,需显式开
}
宿主依赖 — 显式声明钉钉 / 微信 SDK
回调 Activity 落在宿主包名下、直接 import 钉钉 / 友盟微信 SDK 类,而 @unif/react-native-umeng 以 Gradle implementation 声明这些 SDK(不向宿主传递编译期依赖)。因此宿主 app/build.gradle 需显式声明:
// android/app/build.gradle —— 版本对齐 @unif/react-native-umeng 的 android/build.gradle
dependencies {
implementation "com.alibaba.android:ddsharesdk:1.2.2" // DDShareActivity import 的钉钉 SDK
implementation "com.umeng.umsdk:share-wx:7.3.7" // WXEntryActivity 继承的 WXCallbackActivity
implementation "com.tencent.mm.opensdk:wechat-sdk-android:6.8.34" // 上者超类链(编译期可见)
}
仅做钉钉分享:只需
ddsharesdk;仅做微信:只需share-wx+wechat-sdk-android。runtime 所需的其余友盟 SDK(common/asms/share-core/share-dingding)由 library 的implementation经 runtime classpath 提供,宿主不用重复。
宿主 MainActivity
不需要 override onActivityResult / onDestroy 转发给 UMShareAPI —— UmengShareModule 实现 ActivityEventListener + LifecycleEventListener,自动接管 Activity 回调链路,并在 onHostDestroy / invalidate() 时释放 UMShareAPI。
Proguard / R8
@unif/react-native-umeng 通过 android/consumer-rules.pro 自动给宿主 App 合并 R8 / proguard 规则(保留友盟 / 微信 / 钉钉相关 class 不被混淆)。release build 直接 ./gradlew assembleRelease,不会因混淆 crash。
平台支持
| 配置项 | iOS | Android |
|---|---|---|
| AndroidManifest 回调 Activity | — | ✅ 必填 |
WXEntryActivity.kt | — | ✅ 必填 |
DDShareActivity.kt | — | ✅ 必填 |
宿主 build.gradle 声明钉钉/微信 SDK | — | ✅ 必填(不自动,见 #sdk-deps) |
权限 / <queries> | — | ✅ 自动合并 |
| MainActivity override | — | ❌ 不需要 |
| Proguard rules | — | ❌ 不需要(自动合并) |
相关
- iOS 原生配置 —— Info.plist / AppDelegate 转发
- 快速上手 —— 完整接入流程
- 常见问题 → 分享无回调 —— 原生未注册的排障