মাল্টিপিয়ার কানেক্টিভিটি হল সাধারণ ডেটা এক্সচেঞ্জ ফরম্যাটের বিকল্প। একটি মধ্যবর্তী ব্রোকারের মাধ্যমে Wi-Fi বা সেলুলার নেটওয়ার্কের মাধ্যমে ডেটা আদান-প্রদানের পরিবর্তে, যা সাধারণত একটি ব্যাকএন্ড সার্ভার, মাল্টিপিয়ার কানেক্টিভিটি মধ্যস্থতাকারী ছাড়াই আশেপাশের একাধিক ডিভাইসের মধ্যে তথ্য বিনিময় করার ক্ষমতা প্রদান করে৷
আইফোন এবং আইপ্যাড ওয়াই-ফাই এবং ব্লুটুথ প্রযুক্তি ব্যবহার করে, যেখানে ম্যাকবুক এবং অ্যাপল টিভি ওয়াই-ফাই এবং ইথারনেটের উপর নির্ভর করে।
এখান থেকে, এই প্রযুক্তির সুবিধা এবং অসুবিধাগুলি অবিলম্বে অনুসরণ করে। সুবিধার মধ্যে রয়েছে বিকেন্দ্রীকরণ এবং তদনুসারে, মধ্যস্থতাকারী ছাড়া তথ্য বিনিময় করার ক্ষমতা।
অসুবিধাগুলি — ভাগ করা আইফোন এবং আইপ্যাডের জন্য ওয়াই-ফাই এবং ব্লুটুথ কভারেজ বা ম্যাকবুক এবং অ্যাপল টিভির জন্য ওয়াই-ফাই এবং ইথারনেটের মধ্যে সীমাবদ্ধ। অন্য কথায়, তথ্যের আদান-প্রদান ডিভাইসগুলির আশেপাশেই করা যেতে পারে।
মাল্টিপিয়ার সংযোগের একীকরণ জটিল নয় এবং নিম্নলিখিত পদক্ষেপগুলি নিয়ে গঠিত:
প্রজেক্ট প্রিসেট
অন্যান্য ডিভাইসের জন্য দৃশ্যমানতা সেটআপ করুন
পরিসরে দৃশ্যমান ডিভাইসের জন্য স্ক্যান করুন
ডেটা বিনিময়ের জন্য একজোড়া ডিভাইস তৈরি করা
ডেটা বিনিময়
আসুন উপরের ধাপগুলির প্রতিটিটি ঘনিষ্ঠভাবে বিবেচনা করি।
এই পর্যায়ে, মাল্টিপিয়ার কানেক্টিভিটি বাস্তবায়নের জন্য প্রকল্পটি প্রস্তুত করতে হবে। এটি করার জন্য, আপনাকে স্ক্যান করতে সক্ষম হওয়ার জন্য ব্যবহারকারীর কাছ থেকে অতিরিক্ত অনুমতি নিতে হবে:
Info.plist
ফাইলে স্থানীয় নেটওয়ার্ক ব্যবহারের বিবরণ ;Info.plist
নিম্নলিখিত লাইনগুলির সাথে সম্পূরক করতে হবে:
<key>NSBonjourServices</key> <array> <string>_nearby-devices._tcp</string> <string>_nearby-devices._upd</string> </array>
এটি লক্ষ্য করা গুরুত্বপূর্ণ যে nearby-devices
সাবস্ট্রিং এই প্রসঙ্গে একটি উদাহরণ হিসাবে ব্যবহৃত হয়। আপনার প্রকল্পে, এই কীটি অবশ্যই নিম্নলিখিত প্রয়োজনীয়তাগুলি পূরণ করবে:
1-15 অক্ষর দীর্ঘ এবং বৈধ অক্ষরগুলির মধ্যে রয়েছে ASCII ছোট হাতের অক্ষর, সংখ্যা এবং হাইফেন, যাতে কমপক্ষে একটি অক্ষর থাকে এবং কোন সংলগ্ন হাইফেন থাকে না।
আপনি প্রয়োজনীয়তা সম্পর্কে আরও পড়তে পারেন__ এখানে __।
যোগাযোগ প্রোটোকলের জন্য, উদাহরণ tcp
এবং upd
(আরও নির্ভরযোগ্য এবং কম নির্ভরযোগ্য) ব্যবহার করে। আপনার কোন প্রোটোকল প্রয়োজন তা যদি আপনি না জানেন তবে আপনার উভয়ই প্রবেশ করা উচিত।
মাল্টি-পিয়ার সংযোগের জন্য ডিভাইসের দৃশ্যমানতার সংগঠন MCNearbyServiceAdvertiser
দ্বারা প্রয়োগ করা হয়। আসুন একটি ক্লাস তৈরি করি যা ডিভাইসগুলির মধ্যে তথ্য সনাক্তকরণ, প্রদর্শন এবং ভাগ করে নেওয়ার জন্য দায়ী।
import MultipeerConnectivity import SwiftUI class DeviceFinderViewModel: ObservableObject { private let advertiser: MCNearbyServiceAdvertiser private let session: MCSession private let serviceType = "nearby-devices" @Published var isAdvertised: Bool = false { didSet { isAdvertised ? advertiser.startAdvertisingPeer() : advertiser.stopAdvertisingPeer() } } init() { let peer = MCPeerID(displayName: UIDevice.current.name) session = MCSession(peer: peer) advertiser = MCNearbyServiceAdvertiser( peer: peer, discoveryInfo: nil, serviceType: serviceType ) } }
মাল্টিপিয়ারের মূল হল একটি MCSession
, যা আপনাকে ডিভাইসগুলির মধ্যে সংযোগ এবং ডেটা বিনিময় করতে দেয়৷
serviceType
হল উপরে উল্লিখিত কী, যা Info.plist
ফাইলে এক্সচেঞ্জ প্রোটোকলের সাথে যোগ করা হয়েছিল।
isAdvertised
সম্পত্তি আপনাকে Toggle
ব্যবহার করে ডিভাইসের দৃশ্যমানতা পরিবর্তন করার অনুমতি দেবে।
একটি মাল্টি-পিয়ার সংযোগের জন্য ডিভাইসের দৃশ্যমানতা স্ক্যানিং MCNearbyServiceBrowser
দ্বারা সঞ্চালিত হয়:
class DeviceFinderViewModel: NSObject, ObservableObject { ... private let browser: MCNearbyServiceBrowser ... @Published var peers: [PeerDevice] = [] ... override init() { ... browser = MCNearbyServiceBrowser(peer: peer, serviceType: serviceType) super.init() browser.delegate = self } func startBrowsing() { browser.startBrowsingForPeers() } func finishBrowsing() { browser.stopBrowsingForPeers() } } extension DeviceFinderViewModel: MCNearbyServiceBrowserDelegate { func browser(_ browser: MCNearbyServiceBrowser, foundPeer peerID: MCPeerID, withDiscoveryInfo info: [String : String]?) { peers.append(PeerDevice(peerId: peerID)) } func browser(_ browser: MCNearbyServiceBrowser, lostPeer peerID: MCPeerID) { peers.removeAll(where: { $0.peerId == peerID }) } } struct PeerDevice: Identifiable, Hashable { let id = UUID() let peerId: MCPeerID }
সমস্ত দৃশ্যমান ডিভাইসের একটি তালিকা peers
মধ্যে সংরক্ষণ করা হবে। MCNearbyServiceBrowser
প্রতিনিধি পদ্ধতিগুলি একটি MCPeerID
যোগ বা মুছে ফেলবে যখন কোনো পিয়ার পাওয়া যায় বা হারিয়ে যায়।
startBrowsing
এবং finishBrowsing
পদ্ধতিগুলি স্ক্রীন প্রদর্শিত হলে দৃশ্যমান ডিভাইসগুলি আবিষ্কার করা শুরু করতে বা স্ক্রীন অদৃশ্য হয়ে যাওয়ার পরে অনুসন্ধান বন্ধ করতে ব্যবহার করা হবে৷
নিম্নলিখিত View
UI হিসাবে ব্যবহার করা হবে:
struct ContentView: View { @StateObject var model = DeviceFinderViewModel() var body: some View { NavigationStack { List(model.peers) { peer in HStack { Image(systemName: "iphone.gen1") .imageScale(.large) .foregroundColor(.accentColor) Text(peer.peerId.displayName) .frame(maxWidth: .infinity, alignment: .leading) } .padding(.vertical, 5) } .onAppear { model.startBrowsing() } .onDisappear { model.finishBrowsing() } .toolbar { ToolbarItem(placement: .navigationBarTrailing) { Toggle("Press to be discoverable", isOn: $model.isAdvertised) .toggleStyle(.switch) } } } } }
Toggle
মাধ্যমে ডিভাইসের দৃশ্যমানতা সক্ষম/অক্ষম করা হবে।
ফলস্বরূপ, এই পর্যায়ে, ডিভাইসগুলির সনাক্তকরণ এবং প্রদর্শন সঠিকভাবে কাজ করা উচিত।
প্রতিনিধি পদ্ধতি MCNearbyServiceAdvertiserdidReceiveInvitationFromPeer
একটি জোড়া ডিভাইসের মধ্যে একটি আমন্ত্রণ পাঠানোর জন্য দায়ী৷ তাদের উভয়কেই এই অনুরোধটি পরিচালনা করতে সক্ষম হতে হবে।
class DeviceFinderViewModel: NSObject, ObservableObject { ... @Published var permissionRequest: PermitionRequest? @Published var selectedPeer: PeerDevice? { didSet { connect() } } ... @Published var joinedPeer: [PeerDevice] = [] override init() { ... advertiser.delegate = self } func startBrowsing() { browser.startBrowsingForPeers() } func finishBrowsing() { browser.stopBrowsingForPeers() } func show(peerId: MCPeerID) { guard let first = peers.first(where: { $0.peerId == peerId }) else { return } joinedPeer.append(first) } private func connect() { guard let selectedPeer else { return } if session.connectedPeers.contains(selectedPeer.peerId) { joinedPeer.append(selectedPeer) } else { browser.invitePeer(selectedPeer.peerId, to: session, withContext: nil, timeout: 60) } } } extension DeviceFinderViewModel: MCNearbyServiceAdvertiserDelegate { func advertiser( _ advertiser: MCNearbyServiceAdvertiser, didReceiveInvitationFromPeer peerID: MCPeerID, withContext context: Data?, invitationHandler: @escaping (Bool, MCSession?) -> Void ) { permissionRequest = PermitionRequest( peerId: peerID, onRequest: { [weak self] permission in invitationHandler(permission, permission ? self?.session : nil) } ) } } struct PermitionRequest: Identifiable { let id = UUID() let peerId: MCPeerID let onRequest: (Bool) -> Void }
যখন selectedPeer
সেট করা হয়, তখন সংযোগ পদ্ধতিটি চালু হয়। যদি এই peer
বিদ্যমান peers
তালিকায় থাকে তবে এটি joinedPeer
অ্যারেতে যোগ করা হবে। ভবিষ্যতে, এই সম্পত্তি UI দ্বারা প্রক্রিয়া করা হবে।
সেশনে এই পিয়ারের অনুপস্থিতিতে, browser
এই ডিভাইসটিকে একটি জোড়া তৈরি করতে আমন্ত্রণ জানাবে।
এর পরে, আমন্ত্রিত ডিভাইসের জন্য didReceiveInvitationFromPeer
পদ্ধতিটি প্রক্রিয়া করা হবে। আমাদের ক্ষেত্রে, didReceiveInvitationFromPeer
শুরু হওয়ার পরে, একটি বিলম্বিত কলব্যাকের সাথে একটি permissionRequest
তৈরি করা হয়, যা আমন্ত্রিত ডিভাইসে একটি সতর্কতা হিসাবে দেখানো হবে:
struct ContentView: View { @StateObject var model = DeviceFinderViewModel() var body: some View { NavigationStack { ... .alert(item: $model.permissionRequest, content: { request in Alert( title: Text("Do you want to join \(request.peerId.displayName)"), primaryButton: .default(Text("Yes"), action: { request.onRequest(true) model.show(peerId: request.peerId) }), secondaryButton: .cancel(Text("No"), action: { request.onRequest(false) }) ) }) ... } } }
অনুমোদনের ক্ষেত্রে, অনুমতি সফল হলে didReceiveInvitationFromPeer
আমন্ত্রণ, অনুমতি এবং সেশন পাঠানোর ডিভাইসটি ফিরিয়ে দেবে।
ফলস্বরূপ, সফলভাবে আমন্ত্রণ গ্রহণ করার পরে, একটি জোড়া তৈরি করা হবে:
একটি জোড়া তৈরি করার পরে, MCSession
ডেটা বিনিময়ের জন্য দায়ী:
import MultipeerConnectivity import Combine class DeviceFinderViewModel: NSObject, ObservableObject { ... @Published var messages: [String] = [] let messagePublisher = PassthroughSubject<String, Never>() var subscriptions = Set<AnyCancellable>() func send(string: String) { guard let data = string.data(using: .utf8) else { return } try? session.send(data, toPeers: [joinedPeer.last!.peerId], with: .reliable) messagePublisher.send(string) } override init() { ... session.delegate = self messagePublisher .receive(on: DispatchQueue.main) .sink { [weak self] in self?.messages.append($0) } .store(in: &subscriptions) } } extension DeviceFinderViewModel: MCSessionDelegate { func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) { guard let last = joinedPeer.last, last.peerId == peerID, let message = String(data: data, encoding: .utf8) else { return } messagePublisher.send(message) } }
মেথড func send(_ data: Data, toPeers peerIDs: [MCPeerID], with mode: MCSessionSendDataMode) throws
সহকর্মীদের মধ্যে ডেটা পাঠাতে সহায়তা করে।
ডেলিগেট মেথড func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID)
বার্তা প্রাপ্ত ডিভাইসে ট্রিগার করা হয়।
এছাড়াও, একটি মধ্যবর্তী প্রকাশক messagePublisher
বার্তাগুলি গ্রহণ করতে ব্যবহৃত হয়, যেহেতু MCSession
প্রতিনিধি পদ্ধতিগুলি DispatchQueue global()
এ ফায়ার করে।
মাল্টিপিয়ার কানেক্টিভিটি ইন্টিগ্রেশন প্রোটোটাইপ সম্পর্কে আরও বিশদ এতে পাওয়া যাবে
আমার সাথে যোগাযোগ করতে দ্বিধা করবেন না