私が使用したコード
if (FBSession.activeSession.state == FBSessionStateOpen
|| FBSession.activeSession.state == FBSessionStateOpenTokenExtended) {
// Close the session and remove the access token from the cache
// The session state handler (in the app delegate) will be called automatically
[FBSession.activeSession closeAndClearTokenInformation];
// If the session state is not any of the two "open" states when the button is clicked
} else {
// Open a session showing the user the login UI
// You must ALWAYS ask for basic_info permissions when opening a session
[FBSession openActiveSessionWithReadPermissions:@[@"basic_info,email"]
allowLoginUI:YES
completionHandler:
^(FBSession *session, FBSessionState state, NSError *error) {
// Retrieve the app delegate
AppDelegate* appDelegate = [UIApplication sharedApplication].delegate;
// Call the app delegate's sessionStateChanged:state:error method to handle session state changes
[appDelegate sessionStateChanged:session state:state error:error];
}];
}
このコードから、ユーザー名とメールIDを取得する必要があります。誰かが解決策を知っている場合は、事前に感謝してください。
次のコードを使用
FBSession *session = [[FBSession alloc] initWithPermissions:@[@"basic_info", @"email"]];
[FBSession setActiveSession:session];
[session openWithBehavior:FBSessionLoginBehaviorForcingWebView
completionHandler:^(FBSession *session,
FBSessionState status,
NSError *error) {
if (FBSession.activeSession.isOpen) {
[[FBRequest requestForMe] startWithCompletionHandler:
^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *user, NSError *error) {
if (!error) {
NSLog(@"accesstoken %@",[NSString stringWithFormat:@"%@",session.accessTokenData]);
NSLog(@"user id %@",user.id);
NSLog(@"Email %@",[user objectForKey:@"email"]);
NSLog(@"User Name %@",user.username);
}
}];
}
}];
if ([FBSDKAccessToken currentAccessToken]) {
[[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:@{@"fields": @"email,name,first_name"}]
startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
if (!error) {
NSLog(@"fetched user:%@", result);
NSLog(@"%@",result[@"email"]);
}
}];
}
新しいコードfacebook SDK ver 4.0以降
これを見てください リンク
未満
// use facebook SDK 3.8
appDelegate.mに以下のメソッドを追加します
-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication: (NSString *)sourceApplication annotation:(id)annotation
{
return [FBAppCall handleOpenURL:url sourceApplication:sourceApplication fallbackHandler:^(FBAppCall *call)
{
NSLog(@"Facebook handler");
}
];
}
- (void)applicationDidBecomeActive:(UIApplication *)application
{
[FBAppEvents activateApp];
[FBAppCall handleDidBecomeActive];
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}
- (void)applicationWillTerminate:(UIApplication *)application
{
[FBSession.activeSession close];
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}
次のコードをビューコントローラ.hに設定します。
#import <UIKit/UIKit.h>
#import <FacebookSDK/FacebookSDK.h>
#import <CoreLocation/CoreLocation.h>
@interface ViewController : UIViewController<FBLoginViewDelegate>
@property (strong, nonatomic) IBOutlet UILabel *lblUserName;
@property (strong, nonatomic) IBOutlet UITextField *txtEmailId;
@property (strong, nonatomic) IBOutlet UIButton *lblCreate;
@property (strong, nonatomic) IBOutlet FBProfilePictureView *profilePic;
@property (strong, nonatomic) id<FBGraphUser> loggedInUser;
- (IBAction)butCreate:(id)sender;
- (void)showAlert:(NSString *)message
result:(id)result
error:(NSError *)error;
@end
//以下のコードをビューコントローラに適用します。
- (void)viewDidLoad
{
[super viewDidLoad];
FBLoginView *loginview=[[FBLoginView alloc]initWithReadPermissions:@[@"email",@"user_likes"]];
loginview.frame=CGRectMake(60, 50, 200, 50);
loginview.delegate=self;
[loginview sizeToFit];
[self.view addSubview:loginview];
}
-(void)loginViewShowingLoggedInUser:(FBLoginView *)loginView
{
self.lblCreate.enabled=YES;
self.txtEmailId.enabled=YES;
self.lblUserName.enabled=YES;
}
-(void)loginViewFetchedUserInfo:(FBLoginView *)loginView user:(id<FBGraphUser>)user
{
self.lblUserName.text=[NSString stringWithFormat:@"%@",user.name];
self.txtEmailId.text=[user objectForKey:@"email"];
//self.profilePic.profileID=user.id;
self.loggedInUser=user;
}
-(void)loginViewShowingLoggedOutUser:(FBLoginView *)loginView
{
self.txtEmailId.text=nil;
self.lblUserName.text=nil;
self.loggedInUser=nil;
self.lblCreate.enabled=NO;
}
-(void)loginView:(FBLoginView *)loginView handleError:(NSError *)error{
NSLog(@"Show the Error ==%@",error);
}
Swift 1.2以降
辞書を作成します。
class ViewController: UIViewController {
var dict : NSDictionary!
}
データの取得:
if((FBSDKAccessToken.currentAccessToken()) != nil){
FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id, name, first_name, last_name, picture.type(large), email"]).startWithCompletionHandler({ (connection, result, error) -> Void in
if (error == nil){
self.dict = result as NSDictionary
println(self.dict)
NSLog(self.dict.objectForKey("picture")?.objectForKey("data")?.objectForKey("url") as String)
}
})
}
出力は:
{
email = "[email protected]";
"first_name" = Karthi;
id = 924483474253864;
"last_name" = keyan;
name = "karthi keyan";
picture = {
data = {
"is_silhouette" = 0;
url = "XXXXXXX";
};
};
}
Userオブジェクトのusernameフィールドは削除され、Graph API v2.0には存在しません。 APIのv2.0では、ユーザーのFBユーザー名を取得する方法はありません。ユーザー名としてもアプリスコープIDを使用できます。
ユーザー名はFacebook経由でメールを送信する1つの方法であるため、Facebookはユーザー名を削除しました。たとえば、URL http://www.facebook.com/sebastian.trug を指定すると、対応するFacebookメールは[email protected]になり、メールで送信された場合、メッセージに直接受信されます。 (メッセージ設定がpublicに設定されている場合)、それ以外の場合は他の受信トレイ。
ソース: https://developers.facebook.com/docs/apps/changelog#v2_0_graph_api
ここにSwift 3.0のコードがあります
let graphRequest:FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me",
parameters: ["fields":"first_name,email, picture.type(large)"])
graphRequest.start(completionHandler: { (connection, result,
error) -> Void in
if ((error) != nil)
{
print("Error: \(error)")
}
else
{
let data:[String:AnyObject] = result as! [String : AnyObject]
print(data)
}
})
ログインに成功した後、次のリクエストを行います。それに対するpublish_actions権限は読み取りません。
/* make the API call */
[FBRequestConnection startWithGraphPath:@"/me"
parameters:nil
HTTPMethod:@"GET"
completionHandler:^(
FBRequestConnection *connection,
id result,
NSError *error
) {
/* handle the result */
}];
このリンクに従ってください: https://developers.facebook.com/docs/graph-api/reference/user
これは現在、FB SDKの最新バージョンで動作します。
FBログインボタンを正しく設定する前のどこか(self.facebookLoginButton
はIBを介して初期化されます):
self.facebookLoginButton.readPermissions = @[@"public_profile", @"email"];
self.facebookLoginButton.delegate = self;
次にloginButton:didCompleteWithResult:error:
:
- (void)loginButton:(FBSDKLoginButton *)loginButton
didCompleteWithResult:(FBSDKLoginManagerLoginResult *)result
error:(NSError *)error
{
NSDictionary *parameters = @{@"fields":@"email,name"};
FBSDKGraphRequest *graphRequest = [[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:parameters];
[graphRequest startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error)
{
LogInfo(@"fetched user:%@", result);
}];
}
こちらが参考になったリファレンスページです: https://developers.facebook.com/docs/graph-api/reference/user
これらの情報はNSDictionary: NSDictionary<FBGraphUser> *user
を使用して取得できます。これらの値にアクセスするには、objectforkey
を使用するだけです。
[user objectForKey:@"id"],
[user objectForKey:@"username"],
[user objectForKey:@"email"].
うまくいけば、それはあなたのために働くでしょう。
このコードを使用してください:
FBSession *session = [[FBSession alloc] initWithPermissions:@[@"public_profile"]];
[FBSession setActiveSession:session];
[session openWithBehavior:FBSessionLoginBehaviorForcingWebView
completionHandler:^(FBSession *session,
FBSessionState status,
NSError *error) {
if (FBSession.activeSession.isOpen)
{
[[FBRequest requestForMe] startWithCompletionHandler:
^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *user, NSError *error)
{
if (!error)
{
NSLog(@"%@", user);
[[[UIAlertView alloc] initWithTitle:@"welcome"
message:[NSString stringWithFormat:@"%@\n%@\n%@\n%@\n%@\n%@",
user[@"name"],
user[@"gender"],
user[@"id"],
user[@"link"],
user[@"email"],
user[@"timezone"]]
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil]
show];
}
}];
}
}];
[FBRequestConnection startWithGraphPath:@"/me"
parameters:nil
HTTPMethod:@"GET"
completionHandler:^(
FBRequestConnection *connection,
NSDictionary *result,
NSError *error
) {
/* handle the result */
_fbId = [result objectForKey:@"id"];
_fbName = [result objectForKey:@"name"];
_fbEmail = [result objectForKey:@"email"];
NSLog(@"%@",_fbId);
NSLog(@"%@",_fbName);
NSLog(@"%@",_fbEmail);
}];
Xcode 8.2.1およびObjective-C
アプリを強制終了した後、任意の場所でログイン情報を取得する
FBRequest *friendRequest = [FBRequest requestForGraphPath:@"me/?fields=name,picture,birthday,email,location"];
[friendRequest startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error)
{
if(error == nil) {
UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"Facebook" message:@"Success in fetching Facebook information." delegate:self cancelButtonTitle:@"OK"otherButtonTitles:nil, nil];
[alert show];
}
else
{
UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"Facebook" message:@"Problem in fetching Facebook Information. Try Later!" delegate:self cancelButtonTitle:@"OK"otherButtonTitles:nil, nil];
[alert show];
}
}];
facebook ios sdk get user name and email Swift 3
FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id, name, first_name, last_name, email"]).start(completionHandler: { (connection, result, error) -> Void in
if (error == nil){
let fbDetails = result as! NSDictionary
print(fbDetails)
}else{
print(error?.localizedDescription ?? "Not found")
}
})