我正在为iOS和Android开发带有角度和离子的混合应用程序,并且在将图像发布到Facebook时遇到错误。该错误仅在我在Android设备上运行该应用程序时出现。我正在使用cordova-plugin-facebook4,并且诸如获取好友和登录之类的查询工作正常。
该特定部分的代码:
function makeCallToFacebookWithImage(url){
console.log("share that to facebook with image");
var facebookString = "/me/photos?method=post&url="+encodeURI(url)+"&caption="+$scope.comment;
console.log("facebookString with image: "+facebookString);
facebookConnectPlugin.getLoginStatus(function(loginStatus){
// if already loggedIn
if(loginStatus.status == "connected"){
facebookConnectPlugin.api(facebookString, ["publish_actions"], function(response){
// success
console.log("success "+JSON.stringify(response));
}, function(response){
// error
console.log("error "+JSON.stringify(response));
});
}
}, function(error){
console.log(error);
})
}
第4行的console.log:
带有图片的facebookString:/ me / photos?method = post&url = https://firebasestorage.googleapis.com/URL?alt=media&token=4420080a-41d8-4816-bf62-5bfb159d1da5&caption=FBTest
错误信息:
错误{“ errorCode”:“ 100”,“ errorType”:“ OAuthException”,“ errorMessage”:“参数无效”,“ errorUserMessage”:“您的照片无法上传。照片应小于4 MB并另存为JPG,PNG,GIF或TIFF文件。“,” errorUserTitle“:”无法读取文件“}
如您所见,我将图像存储在firebase数据库中(我用URL替换了确切的url,以便不在此处发布它),在调用Facebook post函数之前,该图像已经上传并压缩,并且为.jpg格式,因此Facebook帖子的错误消息不正确或无济于事。除此之外,确切的代码可以在iOS上正常运行。
我正在寻找针对此错误的解决方案已有几个小时,因此可能有人在这里可以帮助我解决该问题。有人以前有这个问题,可能知道解决方案吗?
编辑:
带有完整URL的console.log:
iOS:
/me/photos?method=post&url=https://firebasestorage.googleapis.com/v0/b/appname-50cd0.appspot.com/o/post%252F-KbyHksSP_EV2MTjvCb5.jpg?alt=media&token=64f43c60-47fa-40b2-b85b-e1e5ae1dea13&caption=Rest
Android:
/me/photos?method=post&url=https://firebasestorage.googleapis.com/v0/b/appname-50cd0.appspot.com/o/post%252F-KbxypBFRqs6eyYNk8ZR.jpg?alt=media&token=4420080a-41d8-4816-bf62-5bfb159d1da5&caption=FB
显然不同的图片,但是URL结构是相同的。
编辑2:
到目前为止我尝试过的是:
在config.xml中将graph.facebook.com列入白名单,其中包括:
<access origin="*graph.facebook.com*" subdomains="true"/>
->相同的错误
我目前将Nexus 5和Android 6.0.1用作测试设备,目前无法访问另一台Android设备,但是一旦获得,我将在另一台设备上尝试使用。
编辑3:
所以我在另外2个Android设备上对其进行了测试,但确实导致了相同的错误
我将facebook4插件更新为支持facebook sdk 4.22.1的最新版本,但错误仍然存在
我试图将FB.init函数(第147行)中cordova-plugin-facebook4 / www / facebook-browser.js中的版本从2.7更改为2.9(最新),但错误仍然存在
编辑4已解决
最后,解决方案在评论中。当您使用包含参数字符(如?)的下载网址时,这是android设备上cordova-plugin-facebook4的错误。&和=,这是Firebase存储的功能。
解决了
几个小时后,我发现了问题。cordova-plugin-facebook4与firebase存储的组合在Android上不起作用,因为该插件内部的编码处理不正确。
在cordova-plugin-facebook4 / src / android / ConnectPlugin.java文件中,有以下功能:
private void makeGraphCall() {...}
此函数解码整个“ facebookString”,然后按特殊字符对其段进行排序?&和=。Firebase存储下载链接确实包含安全令牌的参数,因此,此刻,插件尝试将Firebase变量解释为facebook参数,并剪切Firebase url的url参数。
我所做的就是修改函数的这一部分:
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);
}
}
至:
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());
if(key.equals("url") || key.equals("caption")){
value = URLDecoder.decode(value);
}
params.putString(key, value);
}
}
在有角的部分,我对原始firebase URL的包含参数的部分进行了编码,然后在将其传递给facebookstring之前,再次对整个URL进行了解码。
我的Angular代码段:
function makeCallToFacebookWithImage(url) {
console.log("share to facebook with image");
var newURL = url;
var caption = $scope.comment;
if (ionic.Platform.isAndroid()) { //prep only neccessary on android
console.log("Is Android device");
var index = url.indexOf("%2F"); //firebase link specific encoding for folders
var leftSide = url.substring(0, index);
var rightSide = url.substring(index, url.length);
newURL = leftSide + encodeURIComponent(rightSide);
caption = encodeURIComponent(caption);
}
newURL = encodeURIComponent(newURL);
var facebookString = "/me/photos?method=post&url=" + newURL + "&caption=" + encodeURIComponent(caption);
...
我将就此错误与facebook4插件的开发人员联系。我希望这对其他可能会卡在该特定错误上的人有所帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句