我正在尝试从iPhone webapp 使用Facebook Connect,因此它看起来与使用Facebook Connect iPhone SDK的原生iPhone应用程序的外观类似。
iPhone SDK通过访问:
获得了不错的登录页面http://www.facebook.com/login.php?fbconnect=1&connect_display=touch&api_key=<key>&next=fbconnect://success
(见http://github.com/facebook/facebook-iphone-sdk/blob/master/src/FBLoginDialog.m)
由于我不希望Safari打开,我看到显示此页面的唯一方法是使用iframe。
然后就是检测成功和失败的问题。
SDK只需使用webView:shouldStartLoadWithRequest:
委托方法并检查fbconnect://success
和fbconnect://cancel
就可以做到这一点。
据我所知,父页面无法监控iframe的网址。
我可以从父页面打开与服务器的Comet连接,并将Facebook重定向到我的服务器,然后成功通知父页面。但是我不喜欢因为这个而将服务器组件引入我的webapp的想法。
有没有人有任何聪明的想法?
编辑:这是关于网络应用,而不是原生应用。
答案 0 :(得分:1)
好吧,这只是一个小测试,但我尝试了这个:
var iframe = $("<iframe src='http://google.com'></iframe");
$("body").append(iframe);
$("body").find("iframe:last").attr("src"); // => http://google.com
似乎工作正常。我有同样的问题,所以今晚我将在我的应用程序中尝试相同的解决方案。我不想做一个不断检查SRC的间隔,所以我会看看是否可以触发更改该SRC的事件。
处理Comet的另一种方法是WebSockets。一个很好的,易于处理的服务是PusherApp(我已经在我的应用程序中使用了),所以如果我无法弄清楚iframe SRC属性改变后如何触发事件,我可能会只需将“auth_succeeded”事件推送到客户端并以这种方式处理它。
感谢iframe的想法。我想知道如何在iPhone webapp中支持FB Connect,而不会产生Safari窗口并将其从我的应用程序中取出。
答案 1 :(得分:1)
To use facebook from your app just download FBConnect and drag and drop all files of FBConnect to your project.Make sure copy the files in project option is checked.After adding files make your .h file in which you have to share something like this
#import <Foundation/Foundation.h>
#import "cocos2d.h"
#import "Facebook.h"
#import "FBConnect.h"
@interface GameOverPage :CCLayer<FBSessionDelegate,FBDialogDelegate,FBLoginDialogDelegate,FBRequestDelegate>
{
//for sharing
BOOL isFBLogged;
Facebook *facebook;
}
after this add following delegate methods to .m file.To use facebook just call [self facebookLogin];
- (void) facebookLogin
{
// App ID
// ****************
//
// App secret
// *****************************
if (facebook == nil) {
facebook = [[Facebook alloc] initWithAppId:@"**********************"];
NSLog(@"reached in if facebook nill");
}
NSArray* permissions = [[NSArray arrayWithObjects:
@"publish_stream", @"offline_access", nil] retain];
[facebook authorize:permissions delegate:self];
// If you want to add Logout capability:
if (isFBLogged) {
NSLog(@"in isFBLogggged");
[facebook logout:self];
}
// } else { // then the code above inside the else
}
-(void) postdata
{
UIImage *facebookimage=[self takeScreenShot];
NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
facebookimage,@"message",
nil];
[facebook requestWithGraphPath:@"me/photos" // use page ID instead of 'me'
andParams:params
andHttpMethod:@"POST"
andDelegate:self];
NSLog(@"Uploading screenshot. Please wait...");
}
- (void)fbDidLogin {
NSLog(@"in fbDidLogin");
isFBLogged = YES;
[self postdata];
}
-(void)fbDidNotLogin:(BOOL)cancelled {
if (cancelled) {
NSLog(@"LOGIN CANCELLED");
} else {
NSLog(@"login error");
}
//self.visible = YES;
}
- (void)fbDidLogout {
NSLog(@"in fbDidLogOut");
isFBLogged = NO;
//-facebookLoginButton.visible = YES;
//-facebookLogoutButton.visible = NO;
}
#pragma mark -
#pragma mark FBRequestDelegate
/**
* Called when the Facebook API request has returned a response. This callback
* gives you access to the raw response. It's called before
* (void)request:(FBRequest *)request didLoad:(id)result,
* which is passed the parsed response object.
*/
- (void)request:(FBRequest *)request didReceiveResponse:(NSURLResponse *)response {
}
/**
* Called when a request returns and its response has been parsed into
* an object. The resulting object may be a dictionary, an array, a string,
* or a number, depending on the format of the API response. If you need access
* to the raw response, use:
*
* (void)request:(FBRequest *)request
* didReceiveResponse:(NSURLResponse *)response
*/
- (void)request:(FBRequest *)request didLoad:(id)result {
NSLog(@"posted");
};
/**
* Called when an error prevents the Facebook API request from completing
* successfully.
*/
- (void)request:(FBRequest *)request didFailWithError:(NSError *)error {
NSLog(@"an error occured");
};
#pragma mark -
#pragma mark FBDialogDelegate
/**
* Called when a UIServer Dialog successfully return.
*/
- (void)dialogDidComplete:(FBDialog *)dialog {
NSLog(@"publish successfully");
}
you can override all delegate methods according to your requirement or leave the same way they are.This will work fine.You should have appid of facebook which you will get after registration on Facebook.
答案 2 :(得分:0)
听起来您可以通过OAuth 2.0实现这一目标。 Facebook文档相当薄 - 在http://www.raywenderlich.com/1488/how-to-use-facebooks-new-graph-api-from-your-iphone-app
对它进行了很好的讨论该博客文章是关于在iPhone应用程序中使用OAuth和新的Graph API,但我发现OAuth讨论比其他任何地方都要好。您可以使用他在webapp中讨论的URL和流来完成同样的事情。
答案 3 :(得分:0)
我已经在iOS和Android上完成了一个移动网络应用程序,具有所有Facebook连接功能。当然,它全部托管在服务器上,而不是作为Web应用程序部署在iOS设备上。
基本思路是:使用FB Javascript SDK加载登录/注销对话框,在“已登录”(显示内容)与“未登录”显示错误消息中处理服务器上的结果未登录的内容。
在参考iFrames中 - 我也为FB应用程序做过,但在画布上没有在Web mobiel中 - 你链接到登录URL作为“_top”,并且传入,你重定向回iFrame(给它一个name)与各种signed_request数据。所以是的,那里有服务器脚本来处理登录/注销状态(如果这是你上面提到的)。
答案 4 :(得分:0)
答案 5 :(得分:-1)
使用Sharekit是一个不错的选择,直到你想摆脱问题。因为它为您提供现成的课程。即使对于其他社交网站以及Twitter,简单地调用方法也足够了。此外,您可以根据需要添加自定义方法。
答案 6 :(得分:-1)
您可以单独使用每个社交网络API,也可以使用ShareKit