关于Google、Twitter、Facebook遇到的坑

近来在做关于Google、Twitter、Facebook登录和注册的相关项目中遇到不少坑,下面就简单记录一下操作和相关代码

首先我们需要导入对应的三房库

3.png
  • 1 Google

登录

注册获取key和id
下面是我们注册好的

1.png

在注册完成后,我们将GoogleService-Info.plist文件下载下来,然后倒入工程,检查是不是和我们申请的key和id保持一致

2.png

现在我们差不多配置好了所需要的key和id
下面我们之间上代码
Google登录

#import <GooglePlus/GooglePlus.h>
#import <GoogleOpenSource/GTLPlusConstants.h>
#import <GoogleOpenSource/GTMOAuth2Authentication.h>
#import <GoogleOpenSource/GTMOAuth2ViewControllerTouch.h>
...

//需和plit文件中的id保持一致
static NSString *const kGoogleId = @"1096539491378-53v42rvea90r1rjap674qc3jviob2b36.apps.googleusercontent.com";
static NSString *const kGooglesecret = @"";//此处秘钥如果你的id是web client则需要 否则可以不填

@interface LoginViewController ()<LoginViewDelegate,GPPSignInDelegate>
{
    GPPSignIn *             _signin;
    UINavigationController *    _googleLoginNavigationController;
}
#pragma mark == GPPSignInDelegate
//定义以下方法,在视图控制器中实施 GPPSignInDelegate 以处理登录流程。
- (void)finishedWithAuth: (GTMOAuth2Authentication *)auth
                   error: (NSError *) error
{
//根据google回调的信息  进行自己服务器的登录

    GTLQueryPlus *query = [GTLQueryPlus queryForPeopleGetWithUserId:@"me"];
    NSLog(@"email %@ ", [NSString stringWithFormat:@"Email: %@",[GPPSignIn sharedInstance].authentication.userEmail]);
    NSLog(@"Received error %@ and auth object %@",error, auth);
    // 1. Create a |GTLServicePlus| instance to send a request to Google+.
    GTLServicePlus* plusService = [[GTLServicePlus alloc] init] ;
    plusService.retryEnabled = YES;
    // 2. Set a valid |GTMOAuth2Authentication| object as the authorizer.
    [plusService setAuthorizer:[GPPSignIn sharedInstance].authentication];
    // 3. Use the "v1" version of the Google+ API.*
    plusService.apiVersion = @"v1";
    
    __weak typeof(self)weakSelf = self;
    
    
    [plusService executeQuery:query
            completionHandler:^(GTLServiceTicket *ticket,
                                GTLPlusPerson *person,
                                NSError *error) {
                __strong __typeof(weakSelf)strongSelf = weakSelf;
                
                if (error) {
                    //Handle Error
                } else {
                    NSLog(@"Email= %@", [GPPSignIn sharedInstance].authentication.userEmail);
                    NSLog(@"GoogleID=%@", person.identifier);
                    NSLog(@"User Name=%@", [person.name.givenName stringByAppendingFormat:@" %@", person.name.familyName]);
                    NSLog(@"Gender=%@", person.gender);
                }
            }];
}

- (void)googleLogin
{
    void (^handler)(id, id, id) =
    ^(GTMOAuth2ViewControllerTouch *viewController,
      GTMOAuth2Authentication *auth,
      NSError *error) {
        [self dismissViewControllerAnimated:YES completion:^{

            
        }];
        if (error) {
            NSLog(@"%@", error);
            return;
        } else {
            BOOL signedIn = [[GPPSignIn sharedInstance] trySilentAuthentication];
            if(!signedIn) {
                NSLog(@"Sign In failed");
            }
        }
    };
    
    GTMOAuth2ViewControllerTouch *authViewController;
    authViewController = [GTMOAuth2ViewControllerTouch
                      controllerWithScope:kGTLAuthScopePlusLogin
                      clientID:[GPPSignIn sharedInstance].clientID
                      clientSecret:kGooglesecret
                      keychainItemName:[GPPSignIn sharedInstance].keychainName
                      completionHandler:handler];

    authViewController.initialHTMLString = @"<html><body bgcolor=white><div align=center>Are entering Google login page...</div></body></html>";
    
    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:authViewController];
    navigationController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
    
    _googleLoginNavigationController = navigationController;
    
    [self.navigationController presentViewController:navigationController animated:YES completion:nil];
    
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Cancel", nil)
                                                                         style:UIBarButtonItemStylePlain
                                                                        target:self
                                                                        action:@selector(didCanceledAuthorization)];
        authViewController.navigationItem.rightBarButtonItem = nil;
        authViewController.navigationItem.leftBarButtonItem = cancelButton;
        authViewController.navigationItem.title = @"Google Login";
    });

}

- (void)didCanceledAuthorization
{
    [_googleLoginNavigationController dismissModalController];
}

12月16补充说明:最近之前的google登录方式不行了。在官网上找到最新代码,贴在此处以供大家享用

//这个和之前的唯一不同的是需要在info.plist文件中 在 URL Schemes中添加 googlesevice.plist中的 REVERSED_CLIENT_ID的值
- (void)viewDidLoad {
    [super viewDidLoad];
        
    [GIDSignIn sharedInstance].shouldFetchBasicProfile = YES;
    [GIDSignIn sharedInstance].delegate = self;//设置代理,这个是结果回调
    [GIDSignIn sharedInstance].uiDelegate = self;//设置代理,这个是调用授权登录页面的
    [[GIDSignIn sharedInstance] signOut];//注销之前的登录状态
}

- (void)googleLogin
{
    //调用google登录API
    [[GIDSignIn sharedInstance] signIn];
}
#pragma mark - GIDSignInDelegate

- (void)signIn:(GIDSignIn *)signIn
didSignInForUser:(GIDGoogleUser *)user
     withError:(NSError *)error {
    if (error) {
//        _signInAuthStatus.text = [NSString stringWithFormat:@"Status: Authentication error: %@", error];
        return;
    }
//    [self reportAuthStatus];
//    [self updateButtons];
    
    //下面为登录后获取的相关信息
    NSString *email = [GIDSignIn sharedInstance].currentUser.profile.email;
    NSString *givename = [GIDSignIn sharedInstance].currentUser.profile.givenName;
    NSString *familyName = [GIDSignIn sharedInstance].currentUser.profile.familyName;
        
}

- (void)signIn:(GIDSignIn *)signIn
didDisconnectWithUser:(GIDGoogleUser *)user
     withError:(NSError *)error {
    if (error) {
//        _signInAuthStatus.text = [NSString stringWithFormat:@"Status: Failed to disconnect: %@", error];
    } else {
//        _signInAuthStatus.text = [NSString stringWithFormat:@"Status: Disconnected"];
    }
//    [self reportAuthStatus];
//    [self updateButtons];
    NSString *email = [GIDSignIn sharedInstance].currentUser.profile.email;    
    NSString *givename = [GIDSignIn sharedInstance].currentUser.profile.givenName;
    NSString *familyName = [GIDSignIn sharedInstance].currentUser.profile.familyName;
}

- (void)presentSignInViewController:(UIViewController *)viewController {
    [[self navigationController] pushViewController:viewController animated:YES];
}

GoogleMaps

首先可以用cocoapods导入库

pod 'GoogleMaps', '~> 1.13.2'

然后在AppDelegate加入以下代码

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{
    //地图  key和plist文件中的是一样的如上图中的 A....oUYKD5swJDFt5w

    [GMSServices provideAPIKey:GOOGLE_MAP_APIKEY];
    services_ = [GMSServices sharedServices];
}

关于地图具体怎么用,这里就不在详细说明了

  • 2 Facebook
    先在plist文件中设置
5.png

然后在AppDelegate加入以下代码

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{
    //facebook
    [[FBSDKApplicationDelegate sharedInstance] application:application
                             didFinishLaunchingWithOptions:launchOptions];

return YES;
}

在要分享的地方 导入头文件 并执行以下代码

#import <FBSDKShareKit/FBSDKShareKit.h>
....
- (void)ShareFacebook
{
    FBSDKShareLinkContent *content = [[FBSDKShareLinkContent alloc] init];
        content.contentURL = [NSURL URLWithString:@"http://www.baidu.com"];
        content.contentTitle = @"分享标题";
        content.contentDescription = @"Is a good restaurant";
        content.imageURL = [NSURL URLWithString:@"分享图片"];
        [FBSDKShareDialog showFromViewController:self withContent:content delegate:(id)self];
}
//分享回调代理
#pragma mark == facebook shareDelegate
- (void)sharer:(id<FBSDKSharing>)sharer didCompleteWithResults:(NSDictionary *)results
{
//分享成功
}

- (void)sharer:(id<FBSDKSharing>)sharer didFailWithError:(NSError *)error
{
 //失败   
}

- (void)sharerDidCancel:(id<FBSDKSharing>)sharer
{
//取消
}

在登录的地方 导入头文件

#import <FBSDKLoginKit/FBSDKLoginKit.h>
#import <FBSDKCoreKit/FBSDKCoreKit.h>

登录的时候 执行以下函数

- (void)facebookLogin
{
__weak typeof(self)weakSelf = self;
//已经登录过
    if ([FBSDKAccessToken currentAccessToken])
    {
        FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
        [login logOut];
    }
    else
    {
        //@"publish_actions"
        FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
        
        //获取对应的信息 email 等
        [login logInWithReadPermissions:@[@"public_profile",@"email",@"user_friends"]
                     fromViewController:self
                                handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
                                    if (error) {
                                        return;
                                    }
            
            if ([FBSDKAccessToken currentAccessToken] &&
                [[FBSDKAccessToken currentAccessToken].permissions containsObject:@"public_profile"]) {
                
//登录成功 获取信息
                [weakSelf getFacebookUserinfo];
                
                NSLog(@" 打印信息:%@",[FBSDKAccessToken currentAccessToken].tokenString);
                
                return;
            }
        }];
    }
}

- (void)getFacebookUserinfo
{
    NSMutableDictionary* parameters = [NSMutableDictionary dictionary];
    [parameters setValue:@"id,name,email" forKey:@"fields"];
    
    FBSDKGraphRequest *graphRequest = [[FBSDKGraphRequest alloc]initWithGraphPath:@"me" parameters:parameters];
    [graphRequest startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id loginresult, NSError *error) {
        
        if (error) {
            return ;
        }
        else
        {
            NSDictionary *faceLoginDic = (NSDictionary *)loginresult;
            
            NSLog(@" 打印信息facebook_email:%@",faceLoginDic);
            //服务器登录
        }
    }];
}
  • 3 Twitter

先去官网注册账号,并且通过Twitter的fabric导入库


12.png
    //twitter
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{
    [TwitterKit startWithConsumerKey:@"Twitter-key"
     
                                    consumerSecret:@"Twitter 秘钥"];
    [Fabric with:@[TwitterKit]];//通过这个集成Twitter  应该是
  //CrashlyticsKit这是一个可以手机崩溃信息的
}

下面是登录和分享,Twitter的分享好像是要先进行登录,所以这里就弄成一起
先导入头文件

#import <TwitterKit/TwitterKit.h>
#import <Twitter/Twitter.h> 

然后在分享的时候 执行下面的函数

- (void)TwitterShare
{
        NSURL *imageUrlString = [NSURL URLWithString:self.restaurantListData.img];
        NSData *imageData = [NSData dataWithContentsOfURL:imageUrlString];
        
        UIImage *image = [UIImage imageWithData:imageData];
        
        [[Twitter sharedInstance] logInWithCompletion:^(TWTRSession *session, NSError *error) {
            if (session) {
                //登录成功
                TWTRComposer *composer = [[TWTRComposer alloc] init];
                
                [composer setText:self.restaurantListData.restaurantname];
                [composer setImage:image];
                
                
                [composer showWithCompletion:^(TWTRComposerResult result) {
                    if (result == TWTRComposerResultCancelled) {
                        NSLog(@"Tweet composition cancelled");
                    }
                    else {

                    }
                }];
                
                NSLog(@"signed in as %@", [session userName]);
            } else {
                NSLog(@"error: %@", [error localizedDescription]);
            }
        }];
}

以上就是关于这些的一个坑,地图这块没写,等有空了就写一个,现在要准备面试了,明天还要面试。有什么不对的,还请多多指教,大家一起共同进步 -.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,451评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,019评论 4 62
  • 个人日常开发工具 Xcode,有道云笔记,Alfred3(非常提高效率的工具),AndroidStudio(and...
    ios小菜阅读 202评论 0 2
  • 我是山里的孩子,自然爱山。 小时候爱山,是因为好玩儿。对于家乡山水的这份感情是深入骨髓里的,也赋予我亦柔亦刚的性格...
    轻轻飘过阅读 389评论 4 4