Appcelerator Titanium:Facebook 图片上传失败

Appcelerator Titanium: Facebook Image Upload fail

我在我的 Titanium 软件中从 Facebook 上传图片时出错,每次我想从我的应用程序上传图片时,我都会得到这个:

Fail: REST API is deprecated for versions v2.1 and higher

但如果我在 KitchenSink 示例应用程序中尝试相同的代码,它会完美运行:

var xhr = Titanium.Network.createHTTPClient({
        onload: function() {
     // first, grab a "handle" to the file where you'll store the downloaded data
            var f = Ti.Filesystem.getFile(Ti.Filesystem.applicationDataDirectory,'mygraphic.png');
            f.write(this.responseData); // write to the file
            var blob = f.read();
            var data = {
                caption: 'behold, a flower',
                picture: blob
            };
            facebook.request('photos.upload', data, showRequestResult);
        },
        timeout: 10000
    });
    xhr.open('GET','http://www.pur-milch.de/files/www/motive/pm_motiv_kaese.jpg');
    xhr.send(); 

在我的应用程序中:

function showRequestResult(e) {
    var s = '';
    if (e.success) {
        s = "SUCCESS";
        if (e.result) {
            s += "; " + e.result;
        }
    } else {
        s = "FAIL";
        if (e.error) {
            s += "; " + e.error;
        }
    }
    alert(s);
}
Ti.App.hs_stats.addEventListener('touchend', function(e){
Ti.App.hs_stats.top = 255;
var xhr = Titanium.Network.createHTTPClient({
        onload: function() {
     // first, grab a "handle" to the file where you'll store the downloaded data
            var f = Ti.Filesystem.getFile(Ti.Filesystem.applicationDataDirectory,'mygraphic.png');
            f.write(this.responseData); // write to the file
            var blob = f.read();
            var data = {
                caption: 'behold, a flower',
                picture: blob
            };
            Ti.App.fb.request('photos.upload', data, showRequestResult);
        },
        timeout: 10000
    });
    xhr.open('GET','http://www.pur-milch.de/files/www/motive/pm_motiv_kaese.jpg');
    xhr.send();     
});

看起来您正在使用 Appcelerator 的 'old' Facebook 模块?我的图片上传适用于个人资料和页面(尽管页面有点不同,我稍后会解释)。这是一些快速代码(我假设您已经通过 Facebook 验证):

 var fb = require('facebook');
 fb.appid = "xxxxxxxxxxxxxxxxx";
 var acc = fb.getAccessToken();

 fb.requestWithGraphPath('me/photos?access_token='+ acc, {picture:image, message: data}, "POST", showRequestResult);

图像变量只是一个 blob - 它直接来自 event.media 来自图库选择或相机意图。数据是您的状态更新的文本。

在您的 tiapp.xml 中添加这些行:

 <property name="ti.facebook.appid">xxxxxxxxxxxxxxxxx</property>

和(如果您正在使用 Android 和 iOS - 添加两者或仅添加您正在使用的平台)

 <modules>
    <module platform="android">facebook</module>
    <module platform="iphone">facebook</module>
</modules>

现在页面有点奇怪:

var endPoint = 'https://graph.facebook.com/v2.1/' + pid + '/photos?access_token='+ acc;
                                            xhr.open('POST',endPoint);
                                            xhr.send({
                                                message: data,
                                                picture: image
                                            });

您必须使用 HTTP 请求,因为无论我尝试什么,我都无法让 requestWithGraphPath() 处理页面。

pid 是你的页面 ID,你可以得到它,或者你是管理员的页面列表(同样,创建一个新的 HTTP 请求(xhr)并使用它):

xhr.open("GET","https://graph.facebook.com/v2.1/me?fields=accounts{access_token,global_brand_page_name,id,picture}&access_token=" +fb.getAccessToken());

这将 return 每个页面的访问令牌、全球品牌名称(基本上是页面名称的干净版本)、它的 ID 和个人资料图片。此 URL 中的访问令牌是您的个人访问令牌(&access_token= 部分)。

据我所知,这些访问令牌不会因页面而过期,因此您可以将其保存在应用程序中的某个地方,或者如果您真的想安全起见,可以在每个 post,但这有点多。

奖金:

如果你想做视频 posts 页面:

var xhr = Titanium.Network.createHTTPClient();
    var endPoint = 'https://graph-video.facebook.com/'+ pid +'/videos?access_token='+ acc;
xhr.open('POST',endPoint);

xhr.setRequestHeader("enctype", "multipart/form-data");

xhr.send({source:video, description:data});

个人资料:

         var acc = fb.getAccessToken();
    var xhr = Titanium.Network.createHTTPClient();
    var endPoint = 'https://graph-video.facebook.com/me/videos?access_token='+ acc;
xhr.open('POST',endPoint);

xhr.setRequestHeader("enctype", "multipart/form-data");

xhr.send({source:video, description:data});

video 是来自您的相机或图库的另一个 blob event.media intent 和 data 是您要用于状态更新的文本。