mobileresearch / weibo_android_sdk

sina weibo android sdk
642 stars 764 forks source link

关于Android Package Name 的问题; #61

Open dingweijie opened 10 years ago

dingweijie commented 10 years ago

由于项目需求,Android APK是通过服务端动态生成APK的,所以Manifest里的Package也是有服务端动态更改的,

例如: 包名:"com.sina.android" 那么经过服务端生成的APK后,该APK的包名会变更为:"com.sina.android3421";这样造成的问题新浪微博无法登陆、无法SSO授权的现象,如果包名和新浪开发平台的应用信息里的Android 应用程序包名一样的话就可以正常登陆使用。 我在新浪开发平台的应用信息里的Android 应用程序包名尝试配置:例如:"com.sina." 或:"com.sina.android" 在二级或三级后面用*星号代替,但毫无作用。求大神给予帮助!

dingweijie commented 10 years ago

为什么*星号不显示??

我在新浪开发平台的应用信息里的Android 应用程序包名尝试配置:例如:"com.sina.(_星号)" 或:"com.sina.android(_星号)" 在二级或三级后面用*星号代替,但毫无作用。求大神给予帮助!

dingweijie commented 10 years ago

@woyaowenzi

求助~~~

dingweijie commented 10 years ago

@mobileresearch

求助~~

sinaweibosdk commented 10 years ago

@dingweijie "com.sina." 本身就是一个不确定的应用,现在包名就是代表应用的,和应用是关联的,按你的想法,那岂不是所有匹配 "com.sina." 的应用,都能够通过SSO?显示这是不可能的,你需要遵守平台规则。这个问题肯定不会被解决的。So,你想想其它办法吧。

dingweijie commented 10 years ago

@woyaowenzi

你好,很开心能得到你的回复,但我想你并没有理解我所提的问题,"com.sina." 这只是的举例,我的实际报名"net.digielec.iphoto_mini".通过服务端动态生成APK后,APK的包名就会在我的程序包名后面加服务端生成的码(这个码通过MD5加密的。)变成:"net.digielec.iphoto_mini2345" 后面的“2345”就是服务端生成的码,这样做的意图是因为不同的包名才会在Android手机上装相同的应用不是吗?如果包名相同的话,手机上安装必然会提示覆盖。

也就是说 每个APK的包名都是不同的,只不过包名的前面是统一:“net.digielec.iphoto_mini” ,我在新浪开发平台里的应用信息中的Android包名配置:“net.digielec.iphoto_mini” 是登录不上去的。

dingweijie commented 10 years ago

@sinaweibosdk @mobileresearch @woyaowenzi

最近查了一下资料,因为Android APK使用过Web端生成的,要想在同一台手机设备上安装两个相同版本的APK,只能通过修改包名(Package Name),才可以,不然安装设备上系统就会默认覆盖安装。若修改包名的话,就无法和新浪开发平台的应用信息里的Android 应用程序包名一致,导致无法登陆。

不知道大神们有没有解决办法?

sinaweibosdk commented 10 years ago

还是之前所说的,这个问题只能通过包名来做,暂时没有其它方式。

发件人: Noodles [mailto:notifications@github.com] 发送时间: 2013年12月16日 星期一 14:56 收件人: mobileresearch/weibo_android_sdk 抄送: SinaWeiboSDK 主题: Re: [weibo_android_sdk] 关于Android Package Name 的问题; (#61)

@sinaweibosdk https://github.com/sinaweibosdk
@mobileresearch https://github.com/mobileresearch
@woyaowenzi https://github.com/woyaowenzi

最近查了一下资料,因为Android APK使用过Web端生成的,要想在同一台手机设备上安装两个相同版本的APK,只能通过修改包名(Package Name),才可以,不然安装设备上系统就会默认覆盖安装。若修改包名的话,就无法和新浪开发平台的应用信息里的Android 应用程序包名一致,导致无法登陆。

不知道大神们有没有解决办法?

— Reply to this email directly or view it on GitHub https://github.com/mobileresearch/weibo_android_sdk/issues/61#issuecomment-30639387 . https://github.com/notifications/beacon/6027949__eyJzY29wZSI6Ik5ld3NpZXM6QmVhY29uIiwiZXhwaXJlcyI6MTcwMjcwOTc1MCwiZGF0YSI6eyJpZCI6MjE5OTY0MTJ9fQ==--b2831da4912b9e28ea3faa9139cd54e62fcdf177.gif

sinaweibosdk commented 10 years ago

@dingweijie 现在想起来有一种办法来解决你的问题。使用Code来获取Token,详情请查看Demo和文档。使用Code来获取Token时,是不需要传入包名和签名的,只需要app_keyapp_secret。请查看Demo中,WBAuthCodeActivity这个类。 但请注意:不要将你的app_secret暴露于你的应用中,因为别人通过反编译,能直接看到对应的app_secret。 建议你通过如下步骤来获取Token:

  1. 通过Web授权来获取code
  2. 将app_key和code传入你自己的服务器,在服务器那边拼接URL来获取token,即使用app_key+code+app_secret来获取token 服务器简单示意代码如下:
/**
 * 异步获取 Token。
 * 
 * @param authCode  授权 Code,该 Code 是一次性的,只能被获取一次 Token
 * @param appSecret 应用程序的 APP_SECRET,请务必妥善保管好自己的 APP_SECRET,
 *                  不要直接暴露在程序中,此处仅作为一个DEMO来演示。
 */
public void fetchTokenAsync(String authCode, String appSecret) {
    WeiboParameters requestParams = new WeiboParameters();
    requestParams.add(WBConstants.AUTH_PARAMS_CLIENT_ID,     Constants.APP_KEY);
    requestParams.add(WBConstants.AUTH_PARAMS_CLIENT_SECRET, appSecret);
    requestParams.add(WBConstants.AUTH_PARAMS_GRANT_TYPE,    "authorization_code");
    requestParams.add(WBConstants.AUTH_PARAMS_CODE,          authCode);
    requestParams.add(WBConstants.AUTH_PARAMS_REDIRECT_URL,  Constants.REDIRECT_URL);

    /**
     * 请注意:
     * {@link RequestListener} 对应的回调是运行在后台线程中的,
     * 因此,需要使用 Handler 来配合更新 UI。
     */
    AsyncWeiboRunner.request(OAUTH2_ACCESS_TOKEN_URL, requestParams, "POST", new RequestListener() {
        @Override
        public void onComplete(String response) {
            LogUtil.d(TAG, "Response: " + response);

            // 获取 Token 成功
            Oauth2AccessToken token = Oauth2AccessToken.parseAccessToken(response);
            if (token != null && token.isSessionValid()) {
                LogUtil.d(TAG, "Success! " + token.toString());

                mAccessToken = token;
                mHandler.obtainMessage(MSG_FETCH_TOKEN_SUCCESS).sendToTarget();
            } else {
                LogUtil.d(TAG, "Failed to receive access token");
            }
        }

        @Override
        public void onComplete4binary(ByteArrayOutputStream responseOS) {
            LogUtil.e(TAG, "onComplete4binary...");
            mHandler.obtainMessage(MSG_FETCH_TOKEN_FAILED).sendToTarget();
        }

        @Override
        public void onIOException(IOException e) {
            LogUtil.e(TAG, "onIOException: " + e.getMessage());
            mHandler.obtainMessage(MSG_FETCH_TOKEN_FAILED).sendToTarget();
        }

        @Override
        public void onError(WeiboException e) {
            LogUtil.e(TAG, "WeiboException: " + e.getMessage());
            mHandler.obtainMessage(MSG_FETCH_TOKEN_FAILED).sendToTarget();
        }
    });
}
viviant1224 commented 7 years ago

请教楼主,这个动态更改包名的方式怎么实现。