Facebook Javascript API对我/ invitable_friends的调用仅在cordova上返回25个结果,但在网络上没有

时间:2015-08-02 14:58:33

标签: javascript facebook cordova facebook-graph-api

我正在开发一款使用facebook集成的cordova游戏。我有一个在安全网站上运行的Facebook游戏画布。

朋友请求在网站版本上运行正常(返回超过25个结果,因为我正在迭代也返回的paging.next网址。)

然而,在cordova构建(android)上它只返回第一个25的结果集。它仍然有page.next url JSON字段,但它只返回一个type = website的响应对象。

还有其他人遇到过这个吗?

2 个答案:

答案 0 :(得分:0)

没有办法知道你从cordova vs网站上调用他们的api,所以你身边有一些问题,也许你在corodva和网站上使用了一些不同的api实现,所以cordova发送分页请求或发送到其他api版本进行分页。

答案 1 :(得分:0)

经过大量挖掘后,我发现FacebookLib for Android处理请求的方式存在问题。 com.phonegap.plugins.facebookconnect插件的当前版本使用Android FacebookSDK 3.21.1,因此我不确定这是否仍然是v4的问题。

使用分页网址的图表结果用于请求下一页但是使用整个网址,其中包含https://graph.facebook.com/以及通常的graphAction会导致返回错误的结果集。但是我确定如果删除模式和主机部分,它将是正确的。

我修改了ConnectPlugin.java以检查是否已从graphAction中删除任何架构和主机。似乎现在运作良好。

之前的ConnectPlugin.java:

private void makeGraphCall()  {
    Session session = Session.getActiveSession();

    Request.Callback graphCallback = new Request.Callback() {

        @Override
        public void onCompleted(Response response) {
            if (graphContext != null) {
                if (response.getError() != null) {
                    graphContext.error(getFacebookRequestErrorResponse(response.getError()));
                } else {
                    GraphObject graphObject = response.getGraphObject();

                    JSONObject innerObject = graphObject.getInnerJSONObject();
                    graphContext.success(innerObject);
                }
                graphPath = null;
                graphContext = null;
            }
        }
    };

    //If you're using the paging URLs they will be URLEncoded, let's decode them.
    try {
        graphPath = URLDecoder.decode(graphPath, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }

    String[] urlParts = graphPath.split("\\?");
    String graphAction = urlParts[0];
    Request graphRequest = Request.newGraphPathRequest(null, graphAction, graphCallback);
    Bundle params = graphRequest.getParameters();

    if (urlParts.length > 1) {
        String[] queries = urlParts[1].split("&");

        for (String query : queries) {
            int splitPoint = query.indexOf("=");
            if (splitPoint > 0) {
                String key = query.substring(0, splitPoint);
                String value = query.substring(splitPoint + 1, query.length());
                params.putString(key, value);

                if (key.equals("access_token")) {
                    if (value.equals(session.getAccessToken())) {
                        Log.d(TAG, "access_token URL: " + value);
                        Log.d(TAG, "access_token SESSION: " + session.getAccessToken());
                    }
                }
            }
        }
    }
    params.putString("access_token", session.getAccessToken());

    graphRequest.setParameters(params);
    graphRequest.executeAsync();
}

ConnectPlugin.java之后:

private void makeGraphCall()  {
    Session session = Session.getActiveSession();

    Request.Callback graphCallback = new Request.Callback() {

        @Override
        public void onCompleted(Response response) {
            if (graphContext != null) {
                if (response.getError() != null) {
                    graphContext.error(getFacebookRequestErrorResponse(response.getError()));
                } else {
                    GraphObject graphObject = response.getGraphObject();

                    JSONObject innerObject = graphObject.getInnerJSONObject();
                    graphContext.success(innerObject);
                }
                graphPath = null;
                graphContext = null;
            }
        }
    };

    //If you're using the paging URLs they will be URLEncoded, let's decode them.
    try {
        graphPath = URLDecoder.decode(graphPath, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }

    String[] urlParts = graphPath.split("\\?");
    String graphAction = urlParts[0];

    ///////////////////////
    // SECTION ADDED
    ///////////////////////
    final String GRAPH_BASE_URL = "https://graph.facebook.com/";
    if(graphAction.indexOf(GRAPH_BASE_URL)==0) {
        URL graphUrl = null;
        try {
            graphUrl = new URL(graphAction);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        graphAction = graphUrl.getPath();
    }
    ///////////////////////
    // END SECTION ADDED
    ///////////////////////

    Request graphRequest = Request.newGraphPathRequest(null, graphAction, graphCallback);
    Bundle params = graphRequest.getParameters();

    if (urlParts.length > 1) {
        String[] queries = urlParts[1].split("&");

        for (String query : queries) {
            int splitPoint = query.indexOf("=");
            if (splitPoint > 0) {
                String key = query.substring(0, splitPoint);
                String value = query.substring(splitPoint + 1, query.length());
                params.putString(key, value);

                if (key.equals("access_token")) {
                    if (value.equals(session.getAccessToken())) {
                        Log.d(TAG, "access_token URL: " + value);
                        Log.d(TAG, "access_token SESSION: " + session.getAccessToken());
                    }
                }
            }
        }
    }
    params.putString("access_token", session.getAccessToken());

    graphRequest.setParameters(params);
    graphRequest.executeAsync();
}