google上架遇到问题总结以及facebook延迟深度链接的问题

1.通讯录短信通话记录等权限优先级

google现在的政策是禁止拿用户的通话记录和短信的,不要触碰,通讯录在你有正当使用的场景的时候是可以拿到的但是必须做到一下四点
1.通讯录的应用场景必须合适,使用时弹窗提示用户我们拿通讯录的用途
2.上传之前必须能够提示用户要上传通讯录了,让用户能够做出选择
3.上传不能太频繁
4.隐私政策声明
还有一个问题就是在10.0之后是没法拿到用户的获取通话次数,通话时间了。

2.最新的位置权限要求(goolge于2020 年 4 月 16 日更新)

  • 如果应用不再需要利用受位置权限(例如 ACCESS_FINE_LOCATION、ACCESS_COARSE_LOCATION、ACCESS_BACKGROUND_LOCATION)保护的数据来提供应用内的现有功能或服务,就不得再使用这些数据。
  • 您不得纯粹出于广告投放或数据分析的目的而请求用户授予位置权限。如果应用在此类数据的许可用途基础上额外将其用于广告投放的目的,则必须遵守我们的广告政策
  • 即使是出于提供现有功能或服务的目的而需要使用位置信息,应用也应请求最小范围的必要权限(即应请求粗略权限、前台权限,而非精细权限、后台权限),并且为相应功能或服务所请求的位置权限级别应在用户的合理预期范围内。例如,如果应用请求或访问后台位置信息,但理由缺乏说服力,我们可能会拒绝该应用。
  • 后台位置信息仅可用于提供对用户有益及与应用核心功能相关的功能。

在满足以下条件的情况下,应用可以使用前台服务(当应用仅有前台访问权限时,例如“使用时”)权限访问位置信息:

  • 使用此权限使是为了完成用户在应用内发起的操作的后续操作;并且
  • 在应用按用户发起操作的意图完成相关用例后立即终止使用该权限。
    这次更新对位置的权限使用更严格了,有相关下架风险的要及时修改

3.应用更新的问题

上次有个问题就是我们应用自带更新功能导致从google play下架
根据google邮件提示就是我们自己的APP可能会从我们自己的服务器上下载APK包,把我们自己的内部更新去掉统一走google商店更新就好了。

4.获取用户的wifi_ssid和具体gps定位的问题。

先把我自己获取wifi_ssid的代码贴上来

public static String getWIFISSID() {
        String ssid = "";
        if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.O) {
            WifiManager mWifiManager = (WifiManager) BaseApplication.getContext().getApplicationContext().getSystemService(Context.WIFI_SERVICE);
            assert mWifiManager != null;
            WifiInfo info = mWifiManager.getConnectionInfo();

            if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {
                return info.getSSID().replace("\"", "");
            } else {
                return info.getSSID();
            }
        } else if (Build.VERSION.SDK_INT == Build.VERSION_CODES.O_MR1) {
            ConnectivityManager connManager = (ConnectivityManager) BaseApplication.getContext().getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
            assert connManager != null;
            NetworkInfo networkInfo = connManager.getActiveNetworkInfo();
            if (networkInfo == null) {
                return ssid;
            } else if (networkInfo.isConnected()&&networkInfo.getExtraInfo() != nul) {
                    return networkInfo.getExtraInfo().replace("\"", "");
            }
        } else {
            WifiManager wifiManager = (WifiManager) BaseApplication.getContext().getApplicationContext().getSystemService(Context.WIFI_SERVICE);
            assert wifiManager != null;
            WifiInfo info = wifiManager.getConnectionInfo();
            int networkId = info.getNetworkId();
            List<WifiConfiguration> configurations = wifiManager.getConfiguredNetworks();
            for (WifiConfiguration c : configurations) {
                if (c.networkId == networkId) {
                    return c.SSID.replace("\"", "");
                }
            }
        }
        return ssid;
    }

直接说答案了...如果你的手机版本是9及以上在你获取用户的wifi_ssid和具体gps定位的时候必须要得到ACCESS_FINE_LOCATION这个权限,另外还需要开启手机的gps开关。9以下就没这些问题了。

5.facebook的延迟深度链接问题

需求场景:我们目前的项目都是主要在facebook上投放广告导流,虽然说是facebook后台也提供了一些统计的工具,但是我们自己的广告后台也需要看一些广告的数据,比如区分一些广告流量和自然流量等等。还有为什么我这里只说facebook的延迟深度链接,facebook的常规深度链接在他们的开发者文档和一些博客介绍的很详细了,我贴一个链接有需要的可以看这里的Android Deeplink,Facebook 广告deeplink配置与测试

其实延迟深度链接的配置和一般的深度链接都是一样的可以参考上面的那篇文章,另外测试也是那个网址,不过你需要勾选上延迟选项。测试时有一点需要说明是你的广告后台的测试账号需要和你手机登录facebook的app账号相同。
其实延迟深度链接就是在你的application中增加这一行

 AppLinkData.fetchDeferredAppLinkData(this,
                new AppLinkData.CompletionHandler() {
                    @Override
                    public void onDeferredAppLinkDataFetched(AppLinkData appLinkData) {
                        if (appLinkData!=null&&appLinkData.getTargetUri()!=null){
                          //你的                          //你的上报处理appLinkData.getTargetUri().toString()
处理appLinkData.getTargetUri().toString()
                        }
                    }
                }
        );

但是我发现facebook的延迟深度链接TargetUri并不需要严格按照你的配置文件进行推送,因为不管我推的的什么uri过来只要触发了这个回调并且appLinkData不为null,我们就可以拿到他的TargetUri。在看完facebook sdk相关源码后觉得一切顺理成章,在AppLinkData这个类中会异步调用fetchDeferredAppLinkFromServer这个方法,顾名思义就是这个applink这个值是存在facebook后台的。打开APP就会去facebook后台进行查询

 public static void fetchDeferredAppLinkData(
            Context context,
            String applicationId,
            final CompletionHandler completionHandler) {
        Validate.notNull(context, "context");
        Validate.notNull(completionHandler, "completionHandler");

        if (applicationId == null) {
            applicationId = Utility.getMetadataApplicationId(context);
        }

        Validate.notNull(applicationId, "applicationId");

        final Context applicationContext = context.getApplicationContext();
        final String applicationIdCopy = applicationId;
        FacebookSdk.getExecutor().execute(new Runnable() {
            @Override
            public void run() {
                fetchDeferredAppLinkFromServer(
                        applicationContext, applicationIdCopy, completionHandler);
            }
        });
    }

    private static void fetchDeferredAppLinkFromServer(
            Context context,
            String applicationId,
            final CompletionHandler completionHandler) {

        JSONObject deferredApplinkParams = new JSONObject();
        try {
            deferredApplinkParams.put("event", DEFERRED_APP_LINK_EVENT);
            Utility.setAppEventAttributionParameters(deferredApplinkParams,
                    AttributionIdentifiers.getAttributionIdentifiers(context),
                    AppEventsLogger.getAnonymousAppDeviceGUID(context),
                    FacebookSdk.getLimitEventAndDataUsage(context));
            Utility.setAppEventExtendedDeviceInfoParameters(
                    deferredApplinkParams,
                    FacebookSdk.getApplicationContext());
            deferredApplinkParams.put("application_package_name", context.getPackageName());
        } catch (JSONException e) {
            throw new FacebookException("An error occurred while preparing deferred app link", e);
        }

        String deferredApplinkUrlPath = String.format(DEFERRED_APP_LINK_PATH, applicationId);
        AppLinkData appLinkData = null;

        try {
            GraphRequest deferredApplinkRequest = GraphRequest.newPostRequest(
                    null, deferredApplinkUrlPath, deferredApplinkParams, null);
            GraphResponse deferredApplinkResponse = deferredApplinkRequest.executeAndWait();
            JSONObject jsonResponse = deferredApplinkResponse.getJSONObject();
            if (jsonResponse != null) {
                final String appLinkArgsJsonString =
                        jsonResponse.optString(DEFERRED_APP_LINK_ARGS_FIELD);
                final long tapTimeUtc =
                        jsonResponse.optLong(DEFERRED_APP_LINK_CLICK_TIME_FIELD, -1);
                final String appLinkClassName =
                        jsonResponse.optString(DEFERRED_APP_LINK_CLASS_FIELD);
                final String appLinkUrl = jsonResponse.optString(DEFERRED_APP_LINK_URL_FIELD);

                if (!TextUtils.isEmpty(appLinkArgsJsonString)) {
                    appLinkData = createFromJson(appLinkArgsJsonString);

                    if (tapTimeUtc != -1) {
                        try {
                            if (appLinkData.arguments != null) {
                                appLinkData.arguments.put(ARGUMENTS_TAPTIME_KEY, tapTimeUtc);
                            }
                            if (appLinkData.argumentBundle != null) {
                                appLinkData.argumentBundle.putString(
                                        ARGUMENTS_TAPTIME_KEY, Long.toString(tapTimeUtc));
                            }
                        } catch (JSONException e) {
                            Utility.logd(TAG, "Unable to put tap time in AppLinkData.arguments");
                        }
                    }

                    if (appLinkClassName != null) {
                        try {
                            if (appLinkData.arguments != null) {
                                appLinkData.arguments.put(
                                        ARGUMENTS_NATIVE_CLASS_KEY, appLinkClassName);
                            }
                            if (appLinkData.argumentBundle != null) {
                                appLinkData.argumentBundle.putString(
                                        ARGUMENTS_NATIVE_CLASS_KEY, appLinkClassName);
                            }
                        } catch (JSONException e) {
                            Utility.logd(TAG, "Unable to put tap time in AppLinkData.arguments");
                        }
                    }

                    if (appLinkUrl != null) {
                        try {
                            if (appLinkData.arguments != null) {
                                appLinkData.arguments.put(ARGUMENTS_NATIVE_URL, appLinkUrl);
                            }
                            if (appLinkData.argumentBundle != null) {
                                appLinkData.argumentBundle.putString(
                                        ARGUMENTS_NATIVE_URL, appLinkUrl);
                            }
                        } catch (JSONException e) {
                            Utility.logd(TAG, "Unable to put tap time in AppLinkData.arguments");
                        }
                    }
                }
            }
        } catch (Exception e) {
            Utility.logd(TAG, "Unable to fetch deferred applink from server");
        }

        completionHandler.onDeferredAppLinkDataFetched(appLinkData);
    }

总结了以下Facebook的延迟深度链接大概原理就是,如果用户尚未安装这个广告的APP点击进入googleplay就会把这个设备的一些信息和TargetUri进行上传,当有用户下载了打开了这个APP就去facebook后台查询获取这个用户特定的TargetUri,由于从facebook跳转到google商店之后的操作facebook是无法控制的所以只能采取这种方法了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,904评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,581评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,527评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,463评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,546评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,572评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,582评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,330评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,776评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,087评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,257评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,923评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,571评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,192评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,436评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,145评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容