Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
391 lines (345 sloc) 20.2 KB

#魔窗Android SDK FAQ

FAQ分类

  • A. 魔窗位
    • a1.魔窗位活动不能展示
    • a2.分享弹框缺少图标
    • a3.不能分享
    • a4.Jar包重复(暂未集成新浪微博分享,忽略此步)
    • a5.sdk中微信jar包比微信开放平台上的小很多
  • B. mLink
    • b1.短链内的参数值能动态修改么?
    • b2.App安装的前提下,短链依旧前往下载App页面。
    • b3.App安装的前提下,短链只能打开首页,未能进入具体页面(调起应用后没有执行注册的回调函数)。
    • b4.通过短链进入具体页面后,清除数据再次打开App,依旧进入短链对应的具体页面。
    • b5.mLink短链动态参数如何传递中文?
    • b6.如果使用注解,怎么在App中获取参数?
    • b7.App未安装时,通过短链跳转到下载页面,安装后,第一次打开未能实现场景还原。
    • b8.通过mLink跳转直达的页面,如何做到“先显示启动动画,然后再做相应跳转”
    • b9.通过mLink跳转直达的页面,如何做到“返回时进入首页,而不是退出程序”
    • b10.跳转到具体页面后,如何获取动态参数。
    • b11.提示MLink内的defaultMLinkCallback持有activity导致内存泄露。
    • b12.mLink集成跳转到相应activity时黑屏。
    • b13.App卸载后再安装,再次进入具体页面,或者没点击过短链的手机也出现了场景还原。
    • b14.如果想实现用户登录后再场景还原,需要怎么做?
    • b15.App只有一个activity(单activity),如何集成?
    • b16.集成了应用宝跳转,但是从微信打开时没有直接跳转,或者依旧会显示中间页,没有直接打开App。
    • b17.集成了应用宝跳转,但是手机上没有安装应用宝怎么办?
    • b18.程序在后台时,短链跳转无法跳转到具体页。
    • b19.如何开启应用宝跳转
    • b20.开启了应用宝跳转,为何getIntent().getData()为空
    • b21.应用打开具体页面后,又重新打开了首页。
    • b22.checkYYB()是如何实现的?为何YYBCallback只有一个onFailed()?
  • C. 其他

魔窗位

a1.魔窗位活动不能展示

A:如果出现此问题,请按照以下步骤排查。

  1. AndroidManifest.xml内正确填写魔窗APP_ID以及MWActivity等。
  2. 魔窗后台正确开启活动,并投放到相应的魔窗位
  3. 确保代码中MWImageView绑定正确的魔窗位key
  4. 正确集成Session

a2.分享弹框缺少图标

A:将assets文件夹下的文件拷贝到相应文件夹即可。

a3.不能分享

A:现阶段魔窗支持微信分享。
1)前往微信开放平台申请微信AppID, 参考文档
注意:包名以及应用签名不要写错。
2)将微信AppID填写在魔窗后台->帐号设置->应用管理->设置分享平台

a4.Jar包重复(暂未集成新浪微博分享,忽略此步)

A:如果显示微信分享等jar包重复。(特别如果集成了shareSDK,会报微博的jar包重复)

  1. 将微信jar包libmma.jar删除。
  2. 初始化魔窗SDK时,启用shareSDK
  MWConfiguration config = new MWConfiguration(this);
  config.setSharePlatform(MWConfiguration.SHARE_SDK);

a5.sdk中微信jar包比微信开放平台上的小很多

A:sdk中的微信jar包是我们找到的最小可用的包,做过兼容性测试是没有问题的。从sdk大小角度来考虑,才使用此包。
您如果已经从微信开放平台上下载了,直接用微信开放平台上的。

MLink

b1.短链内的参数值能动态修改么?

A:可以,短链支持将参数的动态值作为 query 放在后面
例如:http://a.t.mlinks.cc/ANax?id=12345

b2.App安装的前提下,短链依旧前往下载App页面。

A:换一台其他品牌的手机验证或者换一个浏览器进行验证比如UC、QQ浏览器,因为有些机型原生浏览器不支持scheme。如果依旧不行,则排查是否Scheme配置错误。
遇到这个问题的时候,我们的第一反应是检查Scheme有没有配置错误。因为程序未能打开App,所以肯定是集成的初始阶段出了问题。
①检查AndroidManifest.xml内的Scheme是否配置正确。此处比较容易出错的是,后台配置scheme需要”://”,而Android内配置时不需要”://”
②后台填写Scheme和配置mLink服务需要注意,其中Scheme需要用全小写字母。如果有数字,数字不能放在开头。

b3.App安装的前提下,短链只能打开首页,未能进入具体页面(调起应用后没有执行注册的回调函数)。

A:有如下可能原因。
① 检查register回调有没有写错。(register要写在启动页的onCreate内)
② 检查router入口有没有漏掉或者写错位置。 (router是真正的入口,如果有启动动画等,可以方在动画后。)
③ 程序做了混淆,但是没有将魔窗的keep出来。
④ 如果开启了应用宝跳转,则检查checkYYB接口有没有漏写,(checkYYB需要放在耗时的启动之后,跟启动首页的startActivity放在一起。)
如果以上都没有错误,我们可以利用Charles抓包,查看dpls/v2接口内有没有正确返回mLink的服务uri。从而判断后台是否配置正确。

b4.通过短链进入具体页面后,清除数据再次打开App,依旧进入短链对应的具体页面。

A:“程序安装后第一次打开,魔窗mLink会跟后台通信实现场景还原。App清除数据后,mLink会判断程序为第一次安装。此时请求后台并匹配成功。所以会进入具体页面”。
用户实际使用时基本不会发生此类情况。属于极小概率事件。

b5.mLink短链动态参数如何传递中文?

A:短链后面如果需要添加中文等字符,需要将相关value值encode一下。

b6.如果使用注解,怎么在App中获取参数?

A:可以用如下的方式获取

        Intent intent = getIntent();
        if (intent != null) {
            String param = intent.getStringExtra("param");
        }

b7.App未安装时,通过短链跳转到下载页面,安装后,第一次打开未能实现场景还原。

A: ①新版本SDK需要在初始化结束后手动调用MLinkAPIFactory.createAPI(this).deferredRouter()接口。
②后台mLink服务高级设置内“场景还原有效时间”确保不能是0。
③尝试换一台手机试试,因为场景还原靠的是模糊匹配。有一定概率失败(成功率大于80%) ④在启动页调用一下调用一下MLink.getInstance(this)初始化一下mLink。

b8.通过mLink跳转直达的页面,如何做到“先显示启动动画,然后再做相应跳转”

A:可以在动画结束时再调用router,如下:

         Uri mLink = getIntent().getData();
         if(mLink!=null){
              MLinkAPIFactory.createAPI(this).router(mLink);
         }            

b9.通过mLink跳转直达的页面,如何做到“返回时进入首页,而不是退出程序”

A:有两种方法:
方法①
启动页面调用router的地方稍作调整,将跳转到首页的代码放在getIntent().getData()!=null的判断外面:

@Override
public void onCreate(Bundle savedInstanceState) {
// TODO其他代码

    //跳转到首页
    gotoHome();
    //跳转router调用
    if (getIntent().getData()!=null) {
        MLinkAPIFactory.createAPI(this).router(getIntent().getData());
    } else {
        //如果需要应用宝跳转,则调用。否则不需要
        MLinkAPIFactory.createAPI(this).checkYYB();
    }
    //跳转后结束当前activity
    finish();
}

方法②
可以处理直达页面的返回函数。
我们以跳转页为DetailActivity为例:
第一步,在MLinkAPIFactory.createAPI(this).register()函数的回调函数增加一个intent.putExtra("mlink",true);

MLinkAPIFactory.createAPI(this).register("mLink的Key", new MLinkCallback() {
            public void execute(Map<String, String> paramMap, Uri uri, Context context) {
                Intent intent = new Intent(context, DetailActivity.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
                if (paramMap != null) {
                    for (Map.Entry<String, String> param : paramMap.entrySet()) {
                        intent.putExtra(param.getKey(), param.getValue());
                    }
                }
                intent.putExtra("mlink",true);
                context.startActivity(intent);

            }
        });        

第二步:在DetailActivity内的返回函数内,根据intent.getBooleanExtra("mlink",false)是否为true来跳转到首页。

b10.跳转到具体页面后,如何获取动态参数。

A:例如,我们想获取id这样的动态参数:
①在魔窗后台“mLink服务-->Android URI”那,如下配置mwdemo://host?id=:id
②配置短链时,可以配置id的默认值,也可以在query直接赋值
例如:http://a.t.mlinks.cc/Aaaa?id=12345
注意:动态参数不能以"mw_"开头,此为魔窗保留字。
③代码内可以如下获取。
如果利用register,则所有的参数,都放在MLinkCallback回调的Map paramMap内。
如果利用注解,则可用getIntent().getStringExtra("key")获取。

b11.提示MLink内的defaultMLinkCallback持有activity导致内存泄露。

A:register内的回调需要用application的Context。具体如下

public void registerForMLinkCallback() {
    MLinkAPI mLink = MLinkAPIFactory.createAPI(mContext.getApplicationContext);
    mLink.register("mLink服务Key", new MLinkCallback() {
        public void execute(Map<String, String> paramMap, Uri uri, Context context) {
            //跳转
            MLinkIntentBuilder.buildIntent(paramMap, context, DetailActivity.class);

        }
    });
    mLink.register("detail", new MLinkCallback() {
        public void execute(Map<String, String> paramMap, Uri uri, Context context) {

            Toast.makeText(context, "open detail:" + uri, Toast.LENGTH_LONG).show();
            MLinkIntentBuilder.buildIntent(paramMap, context, DetailActivity.class);

        }
    });
    mLink.register("product", new MLinkCallback() {
        public void execute(Map<String, String> paramMap, Uri uri, Context context) {
            Intent intent = new Intent(context, DetailActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
            if(paramMap !=null){
                for (Map.Entry<String, String> param : paramMap.entrySet()) {
                    intent.putExtra(param.getKey(), param.getValue());
                }
            }
            context.startActivity(intent);

        }
    });
}

或者把registerForMLinkCallback()写在一个单独的工具类中。

b12.mLink集成跳转到相应activity时黑屏

引起这个的原因是跳转到具体页面前,App首页或启动页加载了过多数据导致。
有两个方案:
方案① 利用handler延迟一会再进行跳转。
方案②
A:第一步:xxx/res/values/styles.xml中加入自定义Activity的Theme,如下所示:

<style name="Transparent" parent="android:Theme.Light">  
        <!--ActivityTheme设置成透明-->  
        <item name="android:windowIsTranslucent">true</item>  
    </style>  

第二步:在AndroidManifest.xml中将第二个Activity的"android:theme"属性设置成刚才自定义的主题样式。如下所示:

<activity  
    android:name="com.yutao.customer.CustomerActivity"  
    android:label="@string/app_name"  
    android:theme="@style/Transparent"/>

b13.App卸载后再安装,再次进入具体页面,或者没点击过短链的手机也出现了场景还原。

A:场景还原是通过魔窗后台的模糊匹配进行的。而模糊匹配的结果时效是一个小时。也就是说在一个小时内,你重新安装App都会场景还原。 模糊匹配用到的UA主要有分辨率、IP地址等,只要在同一个局域网内点击过短链,会有概率出现没点过短链的手机,第一次安装也会实现场景还原。 用户实际使用的场景内,不会有影响。

b14.如果想实现用户登录后再场景还原,需要怎么做?

A:用户登陆完以后调用一个api:

    MLinkAPIFactory.createAPI(this).deferredRouter();

deferredRouter()是在sdk内部会判断App是否需要进行场景还原,并且记录了场景还原的uri scheme。然后如果需要场景还原的话,deferedRounter()会调用类似router()。

b15.App只有一个activity(单activity),如何集成?

 @Override
    public void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_splash);
        initMW();
        registerForMLinkCallback();
        Uri mLink = getIntent().getData();
        MLinkAPIFactory.createAPI(SplashActivity.this).deferredRouter();

        if (mLink != null) {
            MLinkAPIFactory.createAPI(this).router(mLink);
        } else {
            MLinkAPIFactory.createAPI(this).checkYYB();
        }
    }
    private void initMW() {
        MWConfiguration config = new MWConfiguration(this);
        config.setDebugModel(true)
                .setPageTrackWithFragment(true)
                .setWebViewBroadcastOpen(true)
                .setSharePlatform(MWConfiguration.ORIGINAL);
        MagicWindowSDK.initSDK(config);
    }
    private void registerForMLinkCallback() {
        MLinkAPI mLink = MLinkAPIFactory.createAPI(mContext.getApplicationContext());
        mLink.registerDefault(new MLinkCallback() {
            @Override
            public void execute(Map<String, String> paramMap, Uri uri, Context context) {
                //todo: 获取动态参数,用来处理
                String id = "";
                if (paramMap != null) {
                    id = paramMap.get("id");
                } else if(uri!=null) {
                    id = uri.getQueryParameter("id");
                }
                //todo: 此处可以根据获取的动态参数id来做相应的处理

//                Intent intent = new Intent(context, WXEntryActivity.class);
//                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
//                context.startActivity(intent);
            }
        });
    }

    @Override
    public void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        Uri mLink = intent.getData();
        setIntent(intent);
        if (mLink != null) {
            MLinkAPIFactory.createAPI(mContext).router(mLink);
        } else {
            MLinkAPIFactory.createAPI(this).checkYYB();
        }
    }

b16.集成了应用宝跳转,但是从微信打开时没有直接跳转,或者依旧会显示中间页,没有直接打开App。

A:
①确保后台打开应用宝开关。魔窗后台将下载链接改为应用宝的地址,并且在“产品管理”->"App信息"内打开应用宝跳转开关。
②保证应用宝商店里的App跟手机里的App的版本号、包名和签名保持一致

b17.集成了应用宝跳转,但是手机上没有安装应用宝怎么办?

A: 可以在应用宝的H5页面里,点击普通打开,并选择继续,就能打开app了。具体可以看下面的动画。

b18.程序在后台时,短链跳转无法跳转到具体页。

     首先说明一点,Android的默认机制是“程序在后台时,用scheme打开App,默认进入当前页。”
所以程序在后台时,通过短链打开App进入后台的当前页是正常的行为。但是如果你想进入具体页的话,可参照下面方法:

A:首先切换一下网络,排除因网络不稳定导致的失败(应用宝跳转需要根据checkYYB()接口去跟后台通信。通过模糊匹配来进行具体页面跳转)。除此之外,可按照以下情况调整: 情况①,在公共Activity的onStart()方法中调用如下代码。

public class BaseActivity extends AppCompatActivity {
  @Override
  protected void onStart() {
    super.onStart();
    Uri mLink = getIntent().getData();
    if (mLink != null) {
        MLinkAPIFactory.createAPI(this).router(mLink);
    } else {
        MLinkAPIFactory.createAPI(this).checkYYB();
    }
  }
}

情况②,启动页的启动方式为singleTop模式时,需要在其Activity内覆写onNewIntent()

    @Override
    public void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        this.setIntent(intent);
        
        Uri mLink = intent.getData();
        if (mLink != null) {
            MLinkAPIFactory.createAPI(this).router(mLink);
        } else {
            MLinkAPIFactory.createAPI(this).checkYYB();
        }
   }

b19.如何开启应用宝跳转。

A:

  1. 在魔窗后台,进入“产品管理”->"App信息",填写应用宝微下载地址。如何配置微下载地址: 登录腾讯开放平台,选择一款Android应用,选择“运营服务”中的“微下载”获取微下载地址,格式为“http://a.app.qq.com/o/simple.jsp?pkgname=包名”,http://a.app.qq.com/o/simple.jsp?pkgname=me.bolo.android.client 为波罗蜜的微下载地址。
  2. 配置完上述内容后,在“产品管理”->"App信息"中开启“Android开启应用宝跳转”的开关。
  3. 代码集成,要在代码的相应位置需要调用checkYYB(在耗时的启动之后,跟启动首页的startActivity并列放置) http://www.magicwindow.cn/doc/sdk-android.html#begin-start/mLink 中章节5.2.5 4.应用宝上的包名与版本号要与App的保持一致。否则应用宝无法打开App。

b20.开启了应用宝跳转,为何getIntent().getData()为空

A:应用宝打开App是通过包名来直接打开App的,而不是scheme,所以getData()为空。
也正因如此,所以我们需要在getData()为空时调用checkYYB()接口,来通过后台拿到具体页面的Scheme。从而跳转到具体页面

b21.应用打开具体页面后,又重新打开了首页。

A:此问题分两种情况
①未开启应用宝时, 说明router调用时,有一个handler之类的延迟操作重新打开了首页。走router时需要将handler排除掉。
②开启应用宝时,将checkYYB()接口更换为带有callback的checkYYB()接口,且将进入首页的逻辑移到callback内即可。

b22.checkYYB()是如何实现的?为何YYBCallback只有一个onFailed()?

A: 如果用户在微信中使用短链接,建议App在我们后台开启应用宝。
因为从微信过来的是拿不到getIntent().getData()的,无法调用router()。 所以需要使用checkYYB()。而checkYYB()是一个模糊匹配的过程,它会调用网络的接口,然后在sdk内部进行匹配,如果匹配上了它本身会调用类似router(),所以无需成功的回调。 checkYYB()方法建议使用带YYBCallback的,因为checkYYB()本身有超时机制,超过一定的时间或者没匹配上就会走onFailed()。 onFailed()可以是跳到App的MainActivity之类的。

b23.app进程被杀死后,再点击短链接只能进入首页

A: 在启动页的onCreate()内调用router()

其他

经过以上分析,我们总结一下常见错误以及注意点:
① 基础配置不要写错,比如Session和AndroidManifest.xml内的APP_ID。
② register不要写错。(注解方式和自定义方式二选一)
③ router不要漏写,且注意书写的位置。如果有开机动画,或者handler之类,要根据实际情况填写。
④ 如果开启了应用宝,注意checkYYB接口不要遗漏,注意一定要写在耗时的初始化之后,跟进入首页的startActivity放在一起。
⑤ 混淆时注意将魔窗keep出来。
⑥ 后台填写Scheme和配置mLink服务需要注意,其中Scheme需要用全小写字母。如果有数字,数字不能放在开头。