0

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が呼び出されていないため、残りのコードが実行される機会がないことです。

4

1 に答える 1

1

アプリデリゲートでシングルトンを使用していないため、接続ハンドラークラスの新しいインスタンスを作成しています:

それ以外の

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インスタンスを作成する責任をFacebook接続ハンドラクラスにすることも検討しますコントローラーはそれをしなければなりません:)

于 2012-05-16T13:19:54.703 に答える