使用静态库(facebook-ios-sdk)中定义的协议时出现不完整的协议警告

Posted

技术标签:

【中文标题】使用静态库(facebook-ios-sdk)中定义的协议时出现不完整的协议警告【英文标题】:Incomplete protocols warning when using a protocol define in a static lib (facebook-ios-sdk) 【发布时间】:2012-03-19 22:30:15 【问题描述】:

我正在尝试将 facebook ios SDK 集成到我使用 ARC 的项目中。正如facebook developer documentation 中所建议的,建议将 facebook SDK 构建为此类集成的静态库。我运行提供的脚本来构建静态库,然后通过以下方式添加到我的项目中:

    直接拖拽输出目录lib的所有内容: lib\facebook-ios-sdk(包含 lib 和相关的标头)

    在我的目标项目的库链接二进制文件/构建阶段部分,我明确添加了我的静态库

我有一个实现 FBSessionDelegate 的所有方法的类。但是,对于这个委托的每个方法,我都有一些警告,这些方法没有被编译器实现:

Semantic Issue
Method in protocol not implemented
Required for direct or indirect protocol 'FBSessionDelegate'

相关的方法是那些:

- (void)fbDidLogin;
- (void)fbDidNotLogin:(BOOL)cancelled;
- (void)fbDidExtendToken:(NSString*)accessToken
               expiresAt:(NSDate*)expiresAt;
- (void)fbDidLogout;
- (void)fbSessionInvalidated;

我真的不明白为什么编译器会给我这些警告:-\ 有没有人知道我们为什么会有这样的行为?我在this blog 中看到他们将整个 facebook-ios-sdk 添加到项目中,但理想情况下我只想添加 lib 而不是完整的项目。

任何澄清/帮助将不胜感激!

[编辑] 只需按照此页面的教程来测试与 facbook here 上的应用程序的连接,就可以轻松地重现我提到的问题。在下面我已经实现了 fDidLogin 方法,但我仍然有这个方法的警告......

我的头文件看起来像:

#import <UIKit/UIKit.h>

#import "FBConnect.h"

@class SCLViewController;

@interface SCLAppDelegate : UIResponder <UIApplicationDelegate, FBSessionDelegate>

@property (strong, nonatomic) UIWindow *window;

@property (strong, nonatomic) SCLViewController *viewController;

@property (strong, nonatomic) Facebook *facebook;

@end

和.m:

#import "SCLAppDelegate.h"

#import "SCLViewController.h"

@implementation SCLAppDelegate

@synthesize window = _window;
@synthesize viewController = _viewController;
@synthesize facebook = _facebook;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

     _facebook = [[Facebook alloc] initWithAppId:@"MY-APP-ID" 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]) 
        [_facebook authorize:nil];
    
   
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.viewController = [[SCLViewController alloc] initWithNibName:@"SCLViewController" bundle:nil];
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
    
    
    return YES;


- (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];
    


@end

【问题讨论】:

带来完整的 facebook ios sdk 的同样问题... 【参考方案1】:

在您的代码中,您指定您的接口正在实现 FBsesionDelegate 协议,但您实际上并未通过创建协议方法回调来为其创建任何实现。如果您不需要它们,只需删除实现声明或添加空方法。在任何情况下,这些警告都不会影响编译或在您的代码中产生任何问题,除非您确实需要一些会话回调。

【讨论】:

我已经实现了 fbDidLogin 方法,但事实上我没有为这个协议实现其他方法,即使是 fbDidLogin 也会出现一些警告。我通过简单地添加空方法来解决警告。谢谢。

以上是关于使用静态库(facebook-ios-sdk)中定义的协议时出现不完整的协议警告的主要内容,如果未能解决你的问题,请参考以下文章

facebook-ios-SDK 问题

如何在使用 facebook-ios-sdk 的应用中实现聊天

Cloudbees Jenkins shell 访问被拒绝 Facebook-iOS-SDK

在 Facebook-Ios-Sdk 中关闭 Facebook 会话

使用新的 facebook-ios-sdk 在 iphone 上未显示 Facebook Connect 登录对话框

facebook-ios-sdk 注销问题