2009-12-31 2 views
22

Я пытаюсь использовать Facebook Connect с iPhone webapp, поэтому он будет похож на то, как он выглядит в родном приложении для iPhone, которое использует iPhone Connect iPhone для iPhone.Как использовать Facebook Connect в iPhone webapp

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.

Насколько я знаю, родительская страница не может контролировать URL-адрес iframe.

Я мог бы открыть соединение Comet с сервером с родительской страницы и переадресовать Facebook на мой сервер, который затем будет уведомлять родительскую страницу об успешном завершении. Но мне не нравится идея вторжения серверного компонента в мой webapp только из-за этого.

У кого-нибудь есть умные идеи?

Редактировать: Это примерно веб-приложение, а не родное приложение.

+0

Вы нашли решение этой проблемы? У вас такая же проблема с OpenID, и вам будет интересно узнать, с чем вы столкнулись. Спасибо! – Cimm

+0

Я действительно собирался опубликовать эту ту же проблему. Я не думал о том, чтобы поместить его в iframe - это отличная идея. – steve

ответ

0

Похоже, что вы можете выполнить это через OAuth 2.0. Документация в Facebook довольно тонкая - есть хорошее обсуждение этого вопроса на http://www.raywenderlich.com/1488/how-to-use-facebooks-new-graph-api-from-your-iphone-app

Это сообщение в блоге об использовании OAuth и нового графического API в приложении для iPhone, но я нашел, что обсуждение OAuth лучше, чем где-либо еще. Вы можете использовать URL-адреса и поток, которые он обсуждает в вашем веб-приложении, чтобы выполнить одно и то же.

1

ИТАК только небольшой тест, но я попытался это:

var iframe = $("<iframe src='http://google.com'></iframe"); 
$("body").append(iframe); 
$("body").find("iframe:last").attr("src"); // => http://google.com 

И это, казалось, нормально работать. У меня была такая же проблема, поэтому сегодня я собираюсь попробовать это же решение в своем приложении. Я не хочу делать интервал, который постоянно проверяет SRC, поэтому я увижу, могу ли я инициировать событие при изменении этого SRC.

Также альтернативой работе с кометами является WebSockets. Хороший, простой в использовании сервис - это PusherApp (который я все равно использую в своем приложении), поэтому, если я не могу понять, как инициировать событие после изменения атрибута SRC iframe, я, вероятно, просто нажму " auth_succeeded "для клиента и обрабатывать его таким образом.

Спасибо за идею iframe. Мне было интересно, как я буду поддерживать FB Connect в iPhone Webapp, не создавая окно Safari и не вынимая их из моего приложения.

+0

src iframe не изменится. –

-1

Использование Sharekit - хороший вариант, пока вы просто не захотите покинуть проблему. Поскольку он предоставляет готовые классы для вас. Просто методов вызова было бы достаточно даже для других сайтов социальных сетей, а также для Twitter. Кроме того, вы можете добавить свои собственные методы в соответствии с вашими потребностями.

-1

Вы можете использовать каждую социальные сети API индивидуальны, или вы можете использовать ShareKit

0

Я сделал мобильный веб-приложение, на прошивке и Android, со всем подключением Facebook. Конечно, все было размещено на сервере и не было развернуто на устройстве iOS в качестве веб-приложения.

Основная идея: использовать FB Javascript SDK для загрузки диалогового окна для входа/выхода из системы, обработать результат на сервере как «вошел в систему» ​​(отобразить что-либо) и «не войти в систему» ​​показать сообщение об ошибке или незарегистрированный контент.

В ссылке iFrames, которую я также сделал для приложений FB, но на холсте не в Web mobiel, вы ссылаетесь на URL-адрес входа в систему как «_top», а входящий, вы перенаправляете обратно в iFrame (дайте ему имя) с различными данными signed_request. Так что да, там есть серверные скрипты для обработки зарегистрированного состояния/выхода из системы (если это то, о чем вы говорили выше).

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. 
Смежные вопросы