الانتقال إلى المحتوى الرئيسي

ASWebAuthenticationSession

بالنسبة للاستخدام على iOS، يُعد استخدام ASWebAuthenticationSession إحدى الطرق الموصى بها.

بعد إنشاء المعاملة والحصول على رابط المعاملة، يُوصى بالتنفيذ التالي:

  • في تدفقك المعتاد (الذي يتضمن التحقق من البطاقة غير الحاضرة)، ستفتح ASWebAuthenticationSession بالرابط الذي تم إنشاؤه عبر API.
  • يمكنك تخصيص هذا الفتح بالطريقة الأنسب لتطبيقك.
  • ستراقب ما إذا تغيّر الرابط (URL) (إلى redirectUrl) ثم تغلق الصفحة.

لكي يعمل التدفق، تحتاج إلى اتباع الخطوات التالية:

الخطوة 1: إنشاء وحدة تحكم مصادقة الدفع

الخطوة الأولى هي إنشاء وحدة تحكم مصادقة الدفع. للقيام بذلك، أنشئ فئة (class) باسم IDPayAuthenticationController (أو أي اسم تفضله).

بعد ذلك، قم باستيراد إطار العمل AuthenticationServices في أعلى الفئة (class).

أعلن عن الفئة (class) كـ NSObject وقم بتنفيذ بروتوكول ASWebAuthenticationPresentationContextProviding.

يجب أن تكون النتيجة كالتالي:

import AuthenticationServices

class IDPayAuthenticationController: NSObject, ASWebAuthenticationPresentationContextProviding {
func presentationAnchor(for session: ASWebAuthenticationSession) -> ASPresentationAnchor {
if let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene {
if let mainWindow = windowScene.windows.first {
return mainWindow
}
}
return ASPresentationAnchor()
}
}

الخطوة 2: تنفيذ المصادقة

افتح الملف الذي ستقوم فيه بتنفيذ المصادقة وأضف عمليات الاستيراد (imports) اللازمة (في مثالنا، نقوم بذلك في ContentView.swift).

import SwiftUI
import AuthenticationServices

للتحكم في حالة المصادقة، سننشئ خاصية (property) من نوع @State.

@State private var isAuthenticated = false

أنشئ نسخة (instance) من الفئة IDPayAuthenticationController خارج جسم (body) هيكل (structure) ContentView.

let idPayController = IDPayAuthenticationController()

للتحقق من صحة الدفع، أنشئ دالة (function) باسم authenticatePayment.

func authenticatePayment() {
guard let url = URL(string: "URL_AUTHENTICATION") else { return }

var session: ASWebAuthenticationSession?
session = ASWebAuthenticationSession(url: url, callbackURLScheme: "BUNDLE") { callbackURL, error in
guard callbackURL != nil else {
if let error = error {
return print("Error during authentication: \(error.localizedDescription)")
}
return
}

// Processes the callback URL to check whether authentication succeeded
session?.cancel()
isAuthenticated = true
}

session?.presentationContextProvider = idPayController
session?.prefersEphemeralWebBrowserSession = true
session?.start()
}
خطر

تذكّر تغيير الرابط URL_AUTHENTICATION إلى رابط المصادقة الذي تم استلامه في معاملتك، وكذلك callbackURLScheme BUNDLE إلى إعادة التوجيه (redirect) المقدمة عند إنشاء معاملتك (نوصي باستخدام Bundle Identifier الخاص بتطبيقك).

ملاحظة

من المهم ضبط prefersEphemeralWebBrowserSession على true لضمان مصادقة فريدة لكل معاملة.

ملاحظة

بعض الأذونات مطلوبة لكي يعمل بشكل صحيح، مثل:

  • الكاميرا
  • الموقع الجغرافي

لمعرفة المزيد، نوصي بقراءة وثائق ASWebAuthenticationSession الرسمية.