我正在尝试创建与Facebook的连接,但是我遇到了处理openUrl的问题。
过去,我已经能够在我的app委托类中添加以下内容:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
return [[viewController facebook] handleOpenURL:url];
}
这是我所期望的。但是,这次我在viewController加载到应用程序的其他地方的意义上略有不同。为了解决这个问题,我提出了一个创建一个负责处理连接的新类的想法,但也可以从我创建Facebook帖子的类中访问。
这里要进一步解释的是我的app delegate class
中的相关代码的.m
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
FacebookConnectionHandler *fbConnHandler = [[FacebookConnectionHandler alloc] init];
return [[fbConnHandler facebook] handleOpenURL:url];
}
然后这是FacebookConnectionHandler
类中的代码:
·H
#import <Foundation/Foundation.h>
#import "Other_ViewController.h"
#import "Facebook.h"
@interface FacebookConnectionHandler : NSObject <FBSessionDelegate>
{
Other_ViewController *otherView;
Facebook *facebook;
}
@property(nonatomic, strong)Other_ViewController *otherView;
@property(nonatomic, strong)Facebook *facebook;
+ (id)sharedManager;
@end
的.m
#import "FacebookConnectionHandler.h"
@implementation FacebookConnectionHandler
@synthesize otherView;
@synthesize facebook;
static FacebookConnectionHandler *mySingleton = nil;
+ (id)sharedManager
{
@synchronized(self)
{
if (mySingleton == nil) mySingleton = [[self alloc] init];
}
return mySingleton;
}
- (void)fbDidLogin
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"];
[defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"];
[defaults synchronize];
// Allow the user to create a post
[self.otherView createFacebookPost];
}
@end
最后......这是Other_ViewController
类中的相关代码(正在创建帖子的位置):
·H
#import "FBConnect.h"
@interface Other_ViewController : UIViewController <FBSessionDelegate>
{
Facebook *facebook;
}
@property(nonatomic, retain)Facebook *facebook;
- (void)createFacebookPost;
@end
的.m
- (void)createFacebookPost
{
// Create the post
NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
@"Blah", @"name",
@"", @"caption",
@"", @"description",
@"http://www.xyz.com", @"link",
@"", @"picture",
nil];
// Post it to the users feed
[facebook dialog:@"feed" andParams:params andDelegate:nil];
}
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
switch (buttonIndex)
{
case kFacebookButton:
{
if (facebook == nil || ![facebook isSessionValid])
{
// Setup Facebook connection
facebook = [[Facebook alloc] initWithAppId:@"1111111111" andDelegate:self];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if ([defaults objectForKey:@"FBAccessTokenKey"]
&& [defaults objectForKey:@"FBExpirationDateKey"])
{
facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"];
facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"];
}
// Set the connection handler
FacebookConnectionHandler *fbConnectionHandler = [[FacebookConnectionHandler alloc] init];
fbConnectionHandler.mapView = self;
fbConnectionHandler.facebook = self.facebook;
if (![facebook isSessionValid])
{
NSArray *permissions = [[NSArray alloc] initWithObjects:@"publish_actions", nil];
[facebook authorize:permissions];
}
}
else
{
// Create the post
[self createFacebookPost];
}
break;
}
default:
break;
}
}
我可能会以完全错误的方式解决这个问题,并且完全使问题过于复杂,但是我对整个facebook SDK都不熟悉,而且此时我真的很难过。有人可以提供解决方案吗?
注意:要清楚,问题是没有调用方法fbDidLogin
,因此剩下的代码没有机会运行。
答案 0 :(得分:1)
您未在app委托中使用单件,您正在创建连接处理程序类的新实例:
而不是
FacebookConnectionHandler *fbConnHandler = [[FacebookConnectionHandler alloc] init];
return [[fbConnHandler facebook] handleOpenURL:url];
试
return [[[FacebookConnectionHandler sharedManager] facebook] handleOpenURL:url];
您还没有在Other_ViewController
课程中使用单身人士。
如果您要使用单例体系结构模式,则必须记住始终使用sharedManager
并且永远不要分配/初始化新的模式:)
我有时会让init
抛出一个异常来提醒我有一个单例方法。
static FacebookConnectionHandler *mySingleton = nil;
- (id)init {
@throw [NSException exceptionWithName:self.class.description reason:@"Please use the sharedManager, don't make a new one of these!" userInfo:nil];
}
- (id)initInternal {
// Put your real init stuff in here
}
+ (id)sharedManager
{
@synchronized(self)
{
if (mySingleton == nil) mySingleton = [[self alloc] initInternal];
}
return mySingleton;
}
PS使用单独的Facebook课程正是我在以前编写过的应用程序中完成的方式 - 您的架构很好:)我还会考虑让Facebook连接hander类负责制作它#39;自己的Facebook实例而不是视图控制器必须这样做:)