【问题标题】:Facebook permissions crashFacebook 权限崩溃
【发布时间】:2017-05-06 10:49:14
【问题描述】:

一旦用户已经以读取权限登录(这完全可以正常工作),我需要向他询问发布权限:

NSArray *publishPermissions = @[@"publish_actions", @"user_photos"];
    FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
    [login logInWithPublishPermissions:publishPermissions fromViewController:self handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
        NSLog(@"FB error: %@ || result: %@", error, result);
    }];
}

如果在给定的代码 sn-p 中我只要求 publish_actions 一切正常,我得到了日志。如果我只要求user_photos 或两者都要求,应用程序与一般NSException 一起崩溃。

为什么user_photos 会导致这样的问题以及如何使其正常工作?

【问题讨论】:

    标签: ios objective-c facebook permissions


    【解决方案1】:
    if ([FBSDKAccessToken currentAccessToken])
    {    
        NSMutableDictionary* parameters = [NSMutableDictionary dictionary];
        [parameters setValue:@"name,picture.type(large),first_name,last_name,gender,email,birthday" forKey:@"fields"];
    
        [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:parameters] startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error)
         {   
             if (error)
             {
                 NSLog(@"Error --> :%@",error);
             }
             else
             {
                 [self createUserInfoDictionary:result];
             }
         }];
    }
    else
    {
        if (FBSDKLoginBehaviorSystemAccount)
        {
            FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
    
            [login setLoginBehavior:FBSDKLoginBehaviorSystemAccount];
    
            [login logInWithReadPermissions:@[@"public_profile",@"email",@"user_birthday",@"user_about_me"] fromViewController:nil handler:^(FBSDKLoginManagerLoginResult *result, NSError *error)
             {
                 if (error)
                 {
                     NSLog(@"Error --> :%@",error);
                 }
                 else
                 {
                     if ([FBSDKAccessToken currentAccessToken])
                     {
                         NSMutableDictionary* parameters = [NSMutableDictionary dictionary];
                         [parameters setValue:@"name,picture.type(large),first_name,last_name,gender,email,birthday" forKey:@"fields"];
    
                         [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:parameters]
                          startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error)
                          {
                              if (!error)
                              {
                                  [self createUserInfoDictionary:result];
                              }
                          }];
                     }
                 }
             }];
        }
    }
    

    【讨论】:

    • 首先您创建 Facebook 开发者帐户并获取 API 密钥,该 API 密钥您必须添加您的项目 info.plist 文件并获取 Facebook SDK 并将 Facebook SDK 包含到您的项目中并尝试此代码。
    【解决方案2】:
    Swift 3 IOS 10.2
    
    First:
    
    @IBAction func goLoginFacebook(_ sender: UIButton) {
    
            let fbLoginManager : FBSDKLoginManager = FBSDKLoginManager()
    
            fbLoginManager.logIn(withReadPermissions: ["email"], from: self) { (result, error) in
                if (error == nil){
                    let fbloginresult : FBSDKLoginManagerLoginResult = result!
                    if fbloginresult.grantedPermissions != nil {
                        if(fbloginresult.grantedPermissions.contains("email"))
                        {
                            self.getFBUserData()
    //                        fbLoginManager.logOut()
                        }
                    }
                }
            }
        }
    
        func getFBUserData(){
            if((FBSDKAccessToken.current()) != nil){
                FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id, name, first_name, last_name, picture.type(large), email"]).start(completionHandler: { (connection, result, error) -> Void in
                    if (error == nil){
                        self.dict = result as! [String : AnyObject]
                        print(result!)
                        print(self.dict)
                        self.performSegue(withIdentifier: "segueFacebookNavigator", sender: self)
    
                    }
                })
            }
        }
    
    Second: Where require publish add
    
     @IBAction func goPublishFacebook(_ sender: UIButton) {
    
    
            if FBSDKAccessToken.current() != nil
            {
    
                print("User is logged in")
    
                if !(FBSDKAccessToken.current().hasGranted("publish_actions")) {
    
                    print("Request publish_actions permissions")
                    requestPublishPermissions()
                }
                else{
                    sendVideoFacebook()
                }
    
    
    
            }else
            {
                print("User is not logged in")
    
            }
        }
    
        func requestPublishPermissions()
        {
            let login: FBSDKLoginManager = FBSDKLoginManager()
    
            login.logIn(withPublishPermissions: ["publish_actions"], from: self) { (result, error) in
                if (error != nil) {
                    print(error!)
                } else if (result?.isCancelled)! {
                    print("Canceled")
                } else if (result?.grantedPermissions.contains("publish_actions"))! {
                    print("permissions granted")
                    self.sendVideoFacebook()
                }
            }
        }
    
    
        private func sendVideoFacebook()
        {
            var pathURL: NSURL
            var videoData: NSData
            // self.pathVideo path file in disc
            pathURL = NSURL(string: self.pathVideo)!
            videoData = try! NSData.init(contentsOf: NSURL(fileURLWithPath: self.pathVideo) as URL)
    
            let strDesc = txtMessage.text!
            let videoObject: [String : AnyObject] = ["title": "application LetsMovies" as AnyObject, "description": strDesc as AnyObject, pathURL.absoluteString!: videoData]
            let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me/videos", parameters: videoObject, httpMethod: "POST")
    
    
            self.view!.isUserInteractionEnabled = false
    
            graphRequest.start(completionHandler: { (connection, result, error) -> Void in
                self.view!.isUserInteractionEnabled = true
                if ((error) != nil)
                {
                    // Process error
                    print("Error: \(error)")
                }
                else
                {
                    self.dict = result as! [String : AnyObject]
                    print(result!)
                    print(self.dict)
    
                }
            })
    
    
        }
    

    【讨论】:

    • 您的回答没有解释崩溃。发生崩溃是因为 iOS 实现未读取 user_photos 权限请求。这是 Facebook API 中的一个错误(它至少应该返回一个错误,而不是崩溃)。
    【解决方案3】:

    您可以从此代码中获取所有内容:

    {
    NSString *getFbid;
     NSString *getFbFirstName,*getFBlastName, *getFbemail,*getfbBirthday,*getfbGender,*getFBpHone,*getFBlocation,*getFBcountry;
    
    }
    
    
    
    -(void)loginButtonClicked
    {
    
    
    
    FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
    [login
     logInWithReadPermissions: @[@"public_profile",  @"user_friends", @"email"]
     fromViewController:self
     handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
         if (error) {
             DLog(@"Process error======%@",error.description);
             indicators.hidden=YES;
             [indicators stopAnimating];
         } else if (result.isCancelled) {
             DLog(@"Cancelled");
             indicators.hidden=YES;
             [indicators stopAnimating];
         } else {
    
             if ([FBSDKAccessToken currentAccessToken]) {
    
    
    
                 [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:@{@"fields": @"id, name, link, first_name, last_name, picture.type(large), email, birthday, bio ,location ,friends ,hometown , gender ,friendlists"}]
                  startWithCompletionHandler:^(
                                               FBSDKGraphRequestConnection *connection, id result, NSError *error) {
                      if (!error)
                      {
    
                          //  NSLog(@"fetched user:%@", result);
    
                          // [self fetchingFacebookFriends];
    
                          [defFacebookData setObject:[result objectForKey:@"email"] forKey:@"fbEmail"];
    
                          [defFacebookData setObject:[result objectForKey:@"id"] forKey:@"fbID"];
    
    
                          //PASS ID
                          getFbid  = [result objectForKey:@"id"];
        NSLog(@"getFbid========>%@",getFbid);
    
                          //PASS FIRST NAME
                          getFbFirstName=[result objectForKey:@"first_name"];
    
        NSLog(@"first======>%@",getFbFirstName);
    
                          //PASS LAST NAME
                          getFBlastName=[result objectForKey:@"last_name"];
        NSLog(@"first======>%@",getFBlastName);
    
                          //PASS EMAIL
                          getFbemail=[result objectForKey:@"email"];
        NSLog(@"first======>%@",getFbemail);
    
                          //PASS PHONE
                          getfbGender=[result objectForKey:@"gender"];
        NSLog(@"first======>%@",getfbGender);
    
    
                          [defFacebookData setObject:[result objectForKey:@"name"] forKey:@"fbName"];
    
                          // Image
                          FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc]
                                                        initWithGraphPath:[NSString stringWithFormat:@"me/picture?type=large&redirect=false"]
                                                        parameters:nil
                                                        HTTPMethod:@"GET"];
                          [request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection,
                                                                id fbImageResult,
                                                                NSError *error) {
    
    NSString *strURL = [NSString stringWithFormat:@"%@",[[fbImageResult objectForKey:@"data"] objectForKey:@"url"]];
    
        NSLog(@"strURL=====>%@",strURL);
    
    [defFacebookData setObject:strURL forKey:@"fbImage"];
    
                              [defFacebookData synchronize];
    
    
                              NSDictionary *fbdict=[NSDictionary dictionaryWithObjectsAndKeys:getFbid,@"id",getFbFirstName,@"first_name",getFBlastName,@"last_name",getFbemail,@"email",getfbGender,@"gender",strURL,@"fbImage", nil];
    
                              NSLog(@"done=========>%@",fbdict);
    
    
                          }];
                      }
                      else{
    
                          DLog(@"error is %@", error.description);
                      }
                  }];
             }
         }
     }];
    }
    

    【讨论】:

    • 这既不发布任何东西(都是 GET),也不涉及图像的问题。你读过这个问题吗..?
    【解决方案4】:

    基于 Facebook-Swift 实现,只处理以publicmanaged 开头的公共权限,其他所有权限都会导致应用崩溃。

    【讨论】:

      【解决方案5】:

      替换这个。这在我的应用中运行良好

      FBSDKLoginManager *login = [[FBSDKLoginManager alloc]init];
              [FBSDKAccessToken setCurrentAccessToken:nil];
      
              [login logInWithReadPermissions: @[@"public_profile", @"email", @"user_friends",@"user_birthday"]
               fromViewController:self
               handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
      
                   if ([FBSDKAccessToken currentAccessToken]) {
                       [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:@{@"fields": @"email,name,birthday,first_name,last_name,gender"}]
                        startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error)
                        {
                            if (!error)
                            {
      }
                            else
                            {
                                NSLog(@"error : %@",error);
                            }
                        }];
                   }
               }];
      

      【讨论】:

      • Ew。我不想阅读用户资料。我想写信给它。这个答案根本没有帮助。而且它与user_photos 完全没有共同之处!你读过这个问题吗..?
      猜你喜欢
      • 1970-01-01
      • 2016-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-13
      • 2016-08-20
      相关资源
      最近更新 更多