Интеграция с SDK Facebook - использование контроллера представления вместо делегата приложения - PullRequest
2 голосов
/ 06 февраля 2012

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

Я следил за этим введением, изложенным на сайте разработчиков Facebook, и все работает как надо - по крайней мере, в соответствии с их реализацией.

Их способ работы означает, что пользователю предоставляется возможность подключить свою учетную запись к приложению после вызова applicationDidFinishLaunching через серию методов и вызовов внутри делегата приложения.

Вместо этого я хотел бы принудительно нажимать это только при выборе кнопки в контроллере представления, похороненном в другом месте приложения. То есть я не хочу иметь дело с авторизацией при вызове applicationDidFinishLaunching - я хочу, чтобы мой собственный метод в контроллере представления вызывал его. Кроме того, я буду ссылаться на классы Facebook из нескольких моих собственных контроллеров представления, если это будет иметь какое-либо значение.

Я искал повсюду и до сих пор не нашел полностью объясненного решения (или вообще чего-либо вообще) для решения этой проблемы. Если у кого-то есть идеи, как это сделать, пожалуйста, дайте мне знать. StackOverflow - последнее средство в большинстве случаев :)

Редактировать: Поскольку бериллий описан ниже, я могу просто взять все, что должно быть в делегате приложения, и добавить его в каждый отдельный контроллер представления. Это работает, но это лучший способ справиться с этой уникальной ситуацией или есть лучшая реализация?

Спасибо,

Соответствующий код ниже:

sampleAppDelegate.h

@interface sampleAppDelegate : NSObject <UIApplicationDelegate,FBRequestDelegate, FBSessionDelegate, FBDialogDelegate, FBLoginDialogDelegate> {

Facebook *facebook;
}

@property (nonatomic, retain) Facebook *facebook;

@end

sampleAppDelegate.m

  @synthesize facebook;

      facebook = [[Facebook alloc] initWithAppId:@"102698856525645" andDelegate:self];

        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        if ([defaults objectForKey:@"FBAccessTokenKey"] 
            && [defaults objectForKey:@"FBExpirationDateKey"]) {
            facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"];
            facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"];
        }

        if (![facebook isSessionValid]) {
            NSArray *permissions = [[NSArray alloc] initWithObjects:
                                    @"offline_access", 
                                    @"publish_stream",
                                    nil];
            [facebook authorize:permissions];
            [permissions release];   
        } 
    }
    // For 4.2+ support
    - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
      sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
        return [facebook handleOpenURL:url]; 
    }

    - (void)fbDidLogin {
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        [defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"];
        [defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"];
        [defaults synchronize];

    } 
/*methods required by Facebook SDK to handle issues with connectivity--all currently empty*/

viewController.h

#import "FBConnect.h"
#import "sampleAppDelegate.h"

@class sampleAppDelegate;


@interface viewController : UIViewController <FBRequestDelegate> {
    Facebook *facebook;
        UnitedUpdatesAppDelegate *facebookSampleAppDelegate;


}
@property (nonatomic, retain) sampleAppDelegate *appDelegate;
@property (nonatomic, retain) Facebook *facebook;

viewController.m

-(void) facebookPost {
    NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys:

                                   @"http://stackoverflow.com", @"link",
                                   @"Message name", @"name",
                                   @"Caption", @"caption",
                                   @"Description", @"description",
                                   @"Message",  @"message",
                                   nil];

    [sampleAppDelegate dialog:@"feed" andParams:params andDelegate: sampleAppDelegate];
}

Ответы [ 2 ]

2 голосов
/ 06 февраля 2012

Я считаю, что этот код Facebook не должен быть частью какого-либо контроллера представления. Я предпочитаю создать класс Singleton для связи с Facebook. Этот Singleton соответствует определенному интерфейсу, что делает более удобным добавление в приложение других служб, таких как Twitter (каждая служба может обрабатываться отдельным синглтоном, соответствующим общему интерфейсу).

Интерфейс может определять методы, такие как -login: , -logout: , -postMessage: , т.е. методы, используемые большинством служб.

Синглтон может использовать делегаты или блоки для обработки ответов веб-службы аналогичным образом, например, в случае реализации делегата некоторые методы могут называться -service: didSucceedWithStatus: или -service: didFailWithError: (где параметр service будет указывать тип экземпляр службы или одноэлементный сервер, который отправляет сообщение делегата).

Я действительно написал некоторый код в соответствии с приведенным выше описанием и мог бы опубликовать его здесь, если вам интересно.

0 голосов
/ 06 февраля 2012

Если вы спрашиваете, возможно ли или даже лучше использовать методы делегата в других местах, чем AppDelegate, ответ - ДА.

Моя идея состоит в том, чтобы подготовить класс, содержащий все вещи для FB, и иметькнопка, которая может инициировать вход в систему и / или аутентификацию.

Обычно этого достаточно, чтобы заставить ваш контроллер принять протоколы, необходимые классам FB, и делегировать его для ответа на обратный вызов.

Я пробовал аналогичный подходи работает нормально.

...