إدارة الاتصالات

بدء الاتصال

عند العثور على الأجهزة المجاورة، يمكن لجهاز الاستكشاف بدء الاتصالات. يطلب المثال التالي اتصالاً بجهاز فور رصده.

Swift

extension Example: DiscovererDelegate {
  func discoverer(
    _ discoverer: Discoverer, didFind endpointID: EndpointID, with context: Data) {
    // An endpoint was found. We request a connection to it. The endpoint info can be used
    // to provide arbitrary information to the discovering device (e.g. device name or type).
    discoverer.requestConnection(to: endpointID, using: "My Device".data(using: .utf8)!)
  }

  func discoverer(_ discoverer: Discoverer, didLose endpointID: EndpointID) {
    // A previously discovered endpoint has gone away.
  }
}

وبناءً على حالة استخدامك، قد ترغب بدلاً من ذلك في عرض قائمة بالأجهزة التي تم اكتشافها للمستخدمين، ما يسمح لهم باختيار الأجهزة التي يتصلون بها.

قبول عملية ربط أو رفضها

بعد أن تطلب أداة الاكتشاف إمكانية التواصل مع أحد المعلنين، يتم إشعار المعلِن بطلب الاتصال من خلال طريقة التفويض advertiser(_:didReceiveConnectionRequestFrom:with:connectionRequestHandler:).

Swift

extension Example: AdvertiserDelegate {
  func advertiser(
    _ advertiser: Advertiser, didReceiveConnectionRequestFrom endpointID: EndpointID,
    with context: Data, connectionRequestHandler: @escaping (Bool) -> Void) {
    // Call with `true` to accept or `false` to reject the incoming connection request.
    connectionRequestHandler(true)
  }
}

بعد قبول المُعلِن، يتم إرسال إشعار إلى كلا الطرفَين ويجب أن يتحقّقا من الاتصال من خلال طريقة تفويض connectionManager(_:didReceive:from:verificationHandler:).

نقترح أن يتحقّق تطبيقك من الاتصال باستخدام رمز إثبات الهوية الذي توفّره طريقة التفويض. وهذا يوفر طريقة تتيح للمستخدمين تأكيد أنهم يتصلون بالجهاز المقصود. ويُمنح كلا الجهازين الرمز نفسه، وهو عبارة عن سلسلة عشوائية قصيرة، ويعود لك قرار تحديد كيفية إثبات الملكية. ويشمل ذلك عادةً عرض الرمز المميَّز على كلا الجهازين ومطالبة المستخدمين بإجراء مقارنة يدوية وتأكيدها، كما هو الحال مع مربّع حوار إقران البلوتوث.

Swift

extension Example: ConnectionManagerDelegate {
  func connectionManager(
    _ connectionManager: ConnectionManager, didReceive verificationCode: String,
    from endpointID: EndpointID, verificationHandler: @escaping (Bool) -> Void) {
    // Optionally show the user the verification code. Your app should call this handler
    // with a value of `true` if the nearby endpoint should be trusted, or `false`
    // otherwise.
    verificationHandler(true)
  }
}

لا يتم إنشاء الاتصال بالكامل إلا بعد قبول كلا الطرفين. في حال رفض أحدهما أو كليهما، يتم تجاهل الاتصال.

توضّح الأمثلة أعلاه الاتصال الذي يقبله الطرفان تلقائيًا، ولكن استنادًا إلى حالة استخدامك، قد ترغب في تقديم هذا الخيار للمستخدم بطريقة ما.