Facebookへの接続を作成しようとしていますが、openUrlの処理に問題があります。
以前は、アプリデリゲートクラスに次のものを追加することができました。
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
return [[viewController facebook] handleOpenURL:url];
}
これは私が期待するように機能しました。ただし、今回は、viewControllerがアプリの他の場所に読み込まれるという意味で、少し異なる状況になります。この問題を回避するために、接続の処理を担当する新しいクラスを作成するというアイデアを思いつきましたが、Facebookの投稿を作成したクラスからもアクセスできます。
ここでさらに説明するのは、私のアプリデリゲートクラスの関連コードです
.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
が呼び出されていないため、残りのコードが実行される機会がないことです。