背景
日常使用场景中经常需要从app外部唤起app,比如短信链接,浏览器页面点击按钮等。传统的方式都可以使用android系统自带的拦截url ,也就是schema方式,但这种方式在拦截生效时会弹出所有可以处理此连接的app出来供用户选择,如果用户没有选择我们的app,那么这个唤起也就不成功。现在市面上有很多成熟的方案,目前美菜商城采用的是极光魔链sdk来处理。
极光魔链sdk使用
可以参考极光魔链接入方式 极光魔链 - JMLink 产品简介 - 极光文档
商城接入
-
接入依赖
//极光魔链
implementation(rootProject.ext.dependencies["jmlink"]) {
exclude group: 'com.tencent.mm.opensdk'
}
-
配置入口
<activity
android:name=".welcome.act.WelComeActivity"
android:enabled="true"
android:icon="@drawable/app_launch_icon"
android:label="${label_name}"
android:screenOrientation="portrait"
android:theme="@style/LauncherAppTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<!-- 为微信打开APP提供入口 -->
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="wxb75d18e8d4f35a2a" />
</intent-filter>
<intent-filter>
<!-- 为H5打开APP提供入口 -->
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="meicaistore" />
</intent-filter>
</activity>
-
极光魔链平台设置app
-
代码初始化
...
private static final String TASK_MW_INIT = "TASK_MW_Init";//魔窗
private static final String TASK_JM_LINK = "Task_Jm_Link";//极光魔链
...
case TASK_MW_INIT:
return new Task(TASK_MW_INIT, false) {
@Override
public void run() {
MainApp.getInstance().getUserPrefs().deepLinkUrl().set("");
registerForMLinkCallback();
if (uri != null) {
redirectUri(uri);
} else {
JMLinkAPI.getInstance().replay(new MyReplayCallback(mContext));
}
}
};
case TASK_JM_LINK:
return new Task(TASK_JM_LINK, false) {
@Override
public void run() {
//极光魔链SDK从浏览器直接转跳到APP具体页面
JMLinkAPI.getInstance().setDebugMode(BuildConfig.TEST_ENTRY);
JMLinkAPI.getInstance().init(mContext.getApplicationContext());
}
};
...
private void registerForMLinkCallback() {
JMLinkAPI.getInstance().registerDefault((map, uri) -> {
if (uri != null) {
LogUtils.e("===jmlink=execute==" + uri.toString());
redirectUri(uri);
}
});
}
/**
* scheme及魔窗短链启动APP指定页面
*
* @param uri intent data
*/
private void redirectUri(Uri uri) {
LogUtils.e("===jmlink===" + uri.toString());
//取出短链中的url,url的value需要encode
String routerUrl = uri.getQueryParameter("url");
if (!TextUtils.isEmpty(routerUrl)) {
LogUtils.e("===jmlink===" + routerUrl);
MainApp.getInstance().getUserPrefs().deepLinkUrl().set(URLDecoder.decode(routerUrl));
} else {
MainApp.getInstance().getUserPrefs().deepLinkUrl().set("");
}
}
...
public void unregisterJMLink() {
JMLinkAPI.getInstance().unregisterDefault();
}
- 魔链设置
可以在平台上设备短链接
具体操作可以参考极光魔链接入方式 中接入指南一项 极光魔链 - JMLink 产品简介 - 极光文档