我正在使用 PhoneGap 将图片发布到 iPhone 的 FaceBook墙。
我可以登录FaceBook帐户并发布HOSTED图像(http://www.mysite.com/my_image.jpg
),但不能发布iPhone中的图像。
这是发布到FB的脚本:
function fbPost() {
$.ajax({
type: 'POST',
url: "https://graph.facebook.com/me/feed",
data: {
message: "<FACEBOOK MESSAGE>",
PICTURE: "<IMAGE URL>",
name: "<TITLE OF POST>",
link: "<LINK TO APP>",
caption: "<SHOWN BELOW TITLE>",
description: "<SHOWN BELOW CAPTION>",
access_token: access_token,
format: "json"
},
success: function (data) {
navigator.notification.alert("success!", null, "Thanks!")
},
},
dataType: "json",
timeout: 10000
})
}
以下是从iPhone(相机胶卷或相册)获取图像的代码:
navigator.camera.getPicture(onSuccess, onFail, { quality: 50,
destinationType: Camera.DestinationType.FILE_URI });
function onSuccess(imageURI) {
var image = document.getElementById('myImage');
image.src = imageURI;
}
(http://docs.phonegap.com/phonegap_camera_camera.md.html)。
当我使用iPhone中的图像时,图像的URI类似于:
file:///var/mobile/Applications/..../Documents/tmp/photo_001.jpg
同样,我可以在指定托管(http://...
)图像时发布图像,但是当它是来自iPhone的图像时则不能。
我会非常感激任何帮助。
谢谢。
罗布
答案 0 :(得分:3)
Facebook无法访问您手机上的本地文件。我不知道您可以将照片上传到Facebook的方式,但正如您之前所说,如果您使用公共托管文件,它可以工作。
所以我认为你有两个选择: 将照片上传到服务器,然后将文件的URL发布到Facebook。 (你可以使用phonegap的文件api来做这件事,theres event是一个上传插件),但我认为这不是一个很好的解决方案。
我建议您查找是否可以将图像数据发布到Facebook(可能是base64编码)并使用phonegap api获取foto的base64编码内容并将其直接发布到Facebook
答案 1 :(得分:2)
我使用Graph API编写了一个PhoneGap插件,用于将照片从iPhone / iPad发布到Facebook。此插件还可以使用Facebook地址ID发布照片(意味着它可以使用照片检查Facebook )并在iOS 6.0上正常工作。
它基于PhoneGap 2.1和phonegap-plugin-facebook-connect,不需要任何中间主机,也许它可以解决您的问题;)
首先, PhotoCheckin.h 是......
#import <Foundation/Foundation.h>
#import "Facebook.h"
#import "FBConnect.h"
#import <Cordova/CDV.h>
@interface PhotoCheckin : CDVPlugin
<FBDialogDelegate>
- (void) sendPost:(CDVInvokedUrlCommand*)command;
@end
其次, PhotoCheckin.m 如下。
#import "PhotoCheckin.h"
#import "FBSBJSON.h"
@implementation PhotoCheckin
- (void) sendPost:(CDVInvokedUrlCommand*)command {
UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[command.arguments objectAtIndex:0]]]];
NSString* message = [command.arguments objectAtIndex:1];
NSString* place_id = [command.arguments objectAtIndex:2];
NSLog(@"%@",message);
NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys:image, @"source",message,@"message",place_id, @"place", nil];
if (FBSession.activeSession.isOpen) {
[FBRequestConnection startWithGraphPath:@"me/photos"
parameters:params
HTTPMethod:@"POST"
completionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
NSString *resultStr = nil;
if (error) {
//resultStr = [NSString stringWithFormat:@"error: domain = %@, code = %d",error.domain, error.code];
resultStr = [[CDVPluginResult resultWithStatus:CDVCommandStatus_JSON_EXCEPTION messageAsString:[NSString stringWithFormat:@"error: domain = %@, code = %d",error.domain, error.code]] toErrorCallbackString:command.callbackId];
}else{
//resultStr = [NSString stringWithFormat:@"Posted action, id: %@",[result objectForKey:@"id"]];
resultStr = [[CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:[NSString stringWithFormat:@"Posted action, id: %@",[result objectForKey:@"id"]]] toSuccessCallbackString:command.callbackId];
}
//[[[UIAlertView alloc] initWithTitle:@"Check-in Result" message:resultStr delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil] show];
[self writeJavascript:resultStr];
}];
}else{
NSLog(@"no active session");
NSArray *permissions = [[NSArray alloc] initWithObjects:@"publish_stream",nil];
// more "permissions strings" at http://developers.facebook.com/docs/authentication/permissions/
// OPEN Session
[FBSession openActiveSessionWithPermissions:permissions
allowLoginUI:YES
completionHandler:^(FBSession *session,
FBSessionState status,
NSError *error) {
if (FB_ISSESSIONOPENWITHSTATE(status)) {
[[[UIAlertView alloc] initWithTitle:@"Got FB session!" message:@"please check-in again." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil] show];
}else{
[self writeJavascript:[[CDVPluginResult resultWithStatus:CDVCommandStatus_JSON_EXCEPTION messageAsString:[NSString stringWithFormat:@"error: domain = %@, code = %d",error.domain, error.code]] toErrorCallbackString:command.callbackId]];
/*[[[UIAlertView alloc] initWithTitle:@"Login Fail"
message:[NSString stringWithFormat:
@"error: domain = %@, code = %d",
error.domain, error.code]
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil]
show];*/
}
}];
}
}
@end
注意:此方法将在发布时回调,某些代码行被注释掉,这可以向用户发出警告。
第三, PhotoCheckin.js 如下。
var PhotoCheckin = {
sendPost: function(photo_uri, message, place_id, success, fail) {
return Cordova.exec(success, fail, "PhotoCheckin", "sendPost", [photo_uri, message, place_id]);
}
}
最后,当我们使用插件时,我们按如下方式编写js。 (在.html / .js中)
PhotoCheckin.sendPost(photo_uri, message, place_id,
function(result){
navigator.notification.confirm(
'message: '+result,
null,
'Photo Posted',
'OK'
);
},
function(error){
navigator.notification.confirm(
'message: '+error,
null,
'Photo Fail',
'OK'
);
}
);
注意: photo_uri 是照片的uri(例如文件:/// ...),消息是用户的评论, place_id 是Facebook中的地方ID(例如106522332718569)。
和其他插件一样,我们必须编辑 Resources / Cordova.plist ,将 photoCheckin 添加为关键字,将 PhotoCheckin 添加为值插件。并将 PhotoCheckin.h &amp; PhotoCheckin.m 添加到名为插件的文件夹中,在您的文件中包含 PhotoCheckin.js js代码。
玩得开心!来自台湾:)