Published on

ทำ Login with Facebook ใน React Native (ios)

ทำ Login with Facebook ใน React Native
ทำ Login with Facebook ใน React Native

วันก่อนได้ลองทำ Login with Facebook ใน React Native เลยอยากเป็นที่มาของบทความนี้ครับ ในที่นี้เจมส์จะไม่ได้อธิบายวิธีการลงทะเบียนเป็น develop ใน facebook เน้อครับ แต่คุณผู้อ่านสามารถทำตามขั้นตอนนี้ได้ครับ Register as a Facebook Developer

มาเริ่มกันเลยครับ

สร้าง React Native App

เริ่มต้นเจมส์จะสร้าง React Native App ขึ้นมาก่อนเน้อครับ เจมส์จะใช้ชื่อโปรเจคว่า example-login ดังนั้นเจมส์จะใช้คำสั่งดังนี้ครับ

npx react-native init exampleLogin --template react-native-template-typescript

เมื่อสร้าง Project เรียบร้อยแล้วให้เราเข้าไปใน Project

cd exampleLogin

จากนั้น install react-native-fbsdk-next

npm install --save react-native-fbsdk-next

จากนั้นให้เราเข้าไปใน ios แล้วก็ สั่ง pod install ดังนี้

cd ios && pod install

จากนั้นเดี๋ยวเราจะปรับโค้ดในส่วนของ App.js หน่อยครับ ให้เป็นดังนี้ครับ

App.tsx
import React, {useEffect, useState} from 'react';
import {LoginManager, Profile} from 'react-native-fbsdk-next';
import {Text, View, StyleSheet, TouchableOpacity, Image} from 'react-native';
import FBProfile from 'react-native-fbsdk-next/lib/typescript/src/FBProfile';

function LoginWithFacebook() {
  const [me, setMe] = useState<FBProfile | null>(null);

  useEffect(() => {
    getFacebookProfile();
  }, []);

  const getFacebookProfile = async () => {
    const currentProfile = await Profile.getCurrentProfile();
    setMe(currentProfile);
  };

  const handleLogin = async () => {
    const result = await LoginManager.logInWithPermissions(['public_profile']);
    const isLoginSuccess = result.isCancelled === false;

    if (isLoginSuccess) {
      getFacebookProfile();
    }
  };

  const handleLogout = () => {
    LoginManager.logOut();
    setMe(null);
  };

  return (
    <View style={styles.sectionContainer}>
      <View style={styles.container}>
        <Text style={styles.header}>Facebook Login React Native Example</Text>

        {!me ? (
          <TouchableOpacity onPress={handleLogin} style={styles.facebookButton}>
            <Text style={styles.labelFacebookButton}>Login with Facebook</Text>
          </TouchableOpacity>
        ) : (
          <View style={styles.section}>
            <Image
              source={{uri: me?.imageURL ?? 'defaultImageURI'}}
              style={styles.imageProfile}
            />

            <View style={styles.mt10}>
              <Text style={styles.label}>
                {me.firstName} {me.lastName}
              </Text>
            </View>

            <TouchableOpacity
              onPress={handleLogout}
              style={styles.facebookButton}>
              <Text style={styles.labelFacebookButton}>Logout</Text>
            </TouchableOpacity>
          </View>
        )}
      </View>
    </View>
  );
}

const styles = StyleSheet.create({
  sectionContainer: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
  },
  container: {
    width: '90%',
  },
  section: {
    marginTop: 10,
    display: 'flex',
    justifyContent: 'center',
    alignItems: 'center',
  },
  header: {
    fontSize: 22,
    fontWeight: '800',
  },
  label: {
    fontSize: 18,
    fontWeight: 'bold',
  },
  mt10: {
    marginTop: 10,
  },
  facebookButton: {
    width: '100%',
    marginTop: 20,
    borderRadius: 5,
    padding: 10,
    backgroundColor: '#3B5998',
    alignItems: 'center',
  },
  labelFacebookButton: {
    color: 'white',
    fontSize: 14,
    fontWeight: 'bold',
  },
  imageProfile: {
    width: 120,
    height: 120,
    borderRadius: 60,
    borderColor: 'black',
    shadowColor: 'black',
  },
});

export default LoginWithFacebook;

ตั้งค่า Project ด้วย xcode

จากนั้นเราจะต้องมาตั้งค่า Project เราด้วย xcode กันหน่อยครับ โดยขั้นแรกให้เปิด xcode ขึ้นมาครับ

เปิด xcode ขึ้นมา
เปิด xcode ขึ้นมา

เข้าไปใน project ของเราและเข้าไปใน directory ios แล้วเลือกไฟล์นามสกุล .xcworkspace

เข้าไปใน project ของเราและเข้าไปใน directory ios แล้วเลือกไฟล์นามสกุล .xcworkspace
เข้าไปใน project ของเราและเข้าไปใน directory ios แล้วเลือกไฟล์นามสกุล .xcworkspace

เมื่อเปิดมาแล้วจะพบหน้าจอดังรูปด้านล่างครับ

แสดงหน้าจอ xcode หลังจากเปิดไฟล์ .xcworkspace
แสดงหน้าจอ xcode หลังจากเปิดไฟล์ .xcworkspace

จากนั้นเลือกไปที่ AppDelegate.mm ดังภาพด้านล่างครับ

จากนั้นเลือกไปที่ `AppDelegate.mm` ครับ
จากนั้นเลือกไปที่ AppDelegate.mm ครับ

จากนั้นให้เพิ่ม Code เข้าไปดังนี้ครับ

AppDelegate.mm
#import <FBSDKCoreKit/FBSDKCoreKit-swift.h>

โดยเพิ่มเข้าไปอยู่ด้านใต้ #import <React/RCTAppSetupUtils.h>

จากนั้นให้เพิ่ม

AppDelegate.mm
[[FBSDKApplicationDelegate sharedInstance] application:application
    didFinishLaunchingWithOptions:launchOptions];

เข้าไปอยู่ด้านใต้ RCTAppSetupPrepareApp(application);

ส่วนที่ 1 และ ส่วนที่ 2 ที่เพิ่มใน AppDelegate.mm` ครับ
ส่วนที่ 1 และ ส่วนที่ 2 ที่เพิ่มใน AppDelegate.mm

สุดท้ายให้เพิ่ม

AppDelegate.mm
- (BOOL)application:(UIApplication *)app
            openURL:(NSURL *)url
            options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{
  return [[FBSDKApplicationDelegate sharedInstance]application:app
                                                      openURL:url
                                                      options:options];
}

ให้อยู่ด้านใต้ if statement ของ

AppDelegate.mm
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
}
<- เพิ่มอันสุดท้ายตรงนี้
ส่วนที่ 3 ที่เพิ่มใน AppDelegate.mm
ส่วนที่ 3 ที่เพิ่มใน AppDelegate.mm

เดี๋ยวเราจะหยุดที่ตรงนี้ไว้ก่อนครับ ขั้นตอนต่อไป เดี๋ยวเรามาสร้าง App ใน Facebook กันครับ

สร้าง App ใน Facebook

โดยให้เข้าไปที่ลิงค์ https://developers.facebook.com/

แล้วเลือกที่ Menu "My App" หรือ "แอพของฉัน" ดังรูปด้านล่างครับ

เลือก Menu "แอพของฉัน"
เลือก Menu "แอพของฉัน"

คลิกที่ปุ่ม "สร้างแอพ"

คลิกที่ปุ่ม "สร้างแอพ"
คลิกที่ปุ่ม "สร้างแอพ"

จากนั้นให้เลือกประเภทของแอพ ซึ่งในที่นี้เจมส์จะเลือกเป็น "ผู้บริโภค" เน้อครับ ตามรูปด้านล่างเลยครับ

เลือกประเภทของแอพ ซึ่งในที่นี้เจมส์จะเลือกเป็น "ผู้บริโภค"
เลือกประเภทของแอพ ซึ่งในที่นี้เจมส์จะเลือกเป็น "ผู้บริโภค"

จากนั้นให้กดปุ่ม "ถัดไป"

จากนั้นจะมี Form ให้กรอกข้อมูล App ที่เราต้องการสร้าง ในที่นี้เจมส์จะตั้งชื่อแอพว่า Example Login เน้อครับ

ในตัวอย่างเจมส์ตั้งชื่อแอพว่า Example Login
ในตัวอย่างเจมส์ตั้งชื่อแอพว่า Example Login

จากนั้นให้กดปุ่ม "สร้างแอพ"

ถ้าหากไม่มีอะไรผิดพลาดจะแสดงหน้าจอดังภาพด้านล่างครับ

หน้าจอที่ได้หลังจากกดสร้างแอพ ให้เลือกที่ "ตั้งค่า" ใน Card การเข้าสู่ระบบ Facebook
หน้าจอที่ได้หลังจากกดสร้างแอพ ให้เลือกที่ "ตั้งค่า" ใน Card การเข้าสู่ระบบ Facebook

จากนั้นให้กดที่ปุ่ม "ตั้งค่า" ตรง Card การเข้าสู่ระบบ Facebook ดังภาพด้านบนที่แสดงครับ

จากนั้นให้เลือกที่ iOS ดังภาพด้านล่างครับ

เลือกที่ iOS
เลือกที่ iOS

ขั้นตอนต่อไปคือให้เลือกที่ "SDK: Cocoapods"

เลือกที่ "SDK: Cocoapods"
เลือกที่ "SDK: Cocoapods"

เมื่อเลือก "SDK: Cocoapods" จะแสดงดังภาพด้านล่าง

เลือกที่ iOS
เลือกที่ iOS

จากนั้นให้กดที่ปุ่ม "ถัดไป"

จากนั้นให้กรอกข้อมูล "ID ของชุดรวม" (Bundle Identifier) โดยดูใน xcode ได้เลยครับ ดังภาพด้านล่าง

กรอกข้อมูล "ID ของชุดรวม" (Bundle Identifier)
เกรอกข้อมูล "ID ของชุดรวม" (Bundle Identifier)
ข้อมูล Bundle Identifier ที่เอามากรอก
ข้อมูล Bundle Identifier ที่เอามากรอก

จากนั้นให้กดที่ปุ่ม "Save" ครับ เบื้องต้นเรากรอกเท่านี้ก่อนก็ได้ครับ

ตั้งค่า Info.plist

ให้คุณผู้อ่านเปิด Project ขึ้นมาใน vscode ครับ แล้วกดปุ่ม "command + p" เพื่อหาไฟล์ชื่อ Info.plist เมื่อเจอแล้วให้เปิดเข้าไปครับ

เมื่อเปิดโปรเจคจะอยู่ใน directory ios/ชื่อโปรเจค/Info.plist (ของเจมส์จะอยู่ที่ ios/exampleLogin/Info.plist) ครับ

จากนั้นให้เพิ่มโค้ดในส่วนนี้เข้าไปด้านล่างครับ ก่อน tag ปิดของ dict

Info.plist
<key>CFBundleURLTypes</key>
<array>
  <dict>
  <key>CFBundleURLSchemes</key>
  <array>
    <string>fb[ตามด้วยFacebookAppID]</string>
  </array>
  </dict>
</array>
<key>FacebookAppID</key>
<string>[FacebookAppID]</string>
<key>FacebookClientToken</key>
<string>[FacebookClientToken]</string>
<key>FacebookDisplayName</key>
<string>[ชื่อ App]</string>
<key>LSApplicationQueriesSchemes</key>
<array>
  <string>fbapi</string>
  <string>fb-messenger-share-api</string>
</array>

ของเจมส์จะเป็นประมาณนี้ครับ

info.plist
<key>CFBundleURLTypes</key>
<array>
  <dict>
  <key>CFBundleURLSchemes</key>
  <array>
    <string>fb539270015039941</string>
  </array>
  </dict>
</array>
<key>FacebookAppID</key>
<string>539270015039941</string>
<key>FacebookClientToken</key>
<string>a1f0617447f359ee3a69cccdf384fd93</string>
<key>FacebookDisplayName</key>
<string>Example Login</string>
<key>LSApplicationQueriesSchemes</key>
<array>
  <string>fbapi</string>
  <string>fb-messenger-share-api</string>
</array>

FacebookClientToken เราสามารถดูได้ในเมนู "การตั้งค่า > ขั้นสูง" แล้วไปที่ Card "การรักษาความปลอดภัย" คือ value ของ Client Token ครับ

คราวนี้ให้เราเปิด Terminal ที่ Root Project ของเราแล้วสั่ง npm run ios ดูครับ จะพบว่าแสดงดังรูปด้านล่างครับ

แสดงหน้าจอ App ที่แสดง
แสดงหน้าจอ App ที่แสดง

และเมื่อเราลองกดปุ่ม "Login with Facebook"

แสดงหน้าจอ App ที่แสดง
แสดงหน้าจอ App ที่แสดง
แสดงหน้าจอ App ที่แสดง
แสดงหน้าจอ App ที่แสดง

ในส่วนนี้ จริง ๆ แล้วตรงส่วน handleLogin ใน App.js เมื่อ Login สำเร็จแล้ว ควรจะต้องดึง Access Token เพื่อส่งไปที่ Backend เพื่อไปเช็คใน Backend ต่อครับ แต่ในตัวอย่างนี้เจมส์ทำตัวอย่างแค่ดึงข้อมูล แค่ในส่วน Client อย่างเดียวเน้อครับ

เย้! เรียบร้อยแล้วครับ หากคุณผู้อ่านติดตรงส่วนไหน สามารถพิมพ์สอบถามได้ใน Comment ได้เลยเน้อครับ หวังว่าบทความนี้จะมีประโยชน์กับคุณผู้อ่านเน้อครับ ^^

Reference