Как следует из названия, теперь я использую новый 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];
}