paint-brush
মাস্টার iOS মাল্টিপিয়ার কানেক্টিভিটি এবং ইন্টারনেট অ্যাক্সেস ছাড়াই একাধিক ডিভাইসে ডেটা শেয়ার করুনদ্বারা@bugorbn
251 পড়া

মাস্টার iOS মাল্টিপিয়ার কানেক্টিভিটি এবং ইন্টারনেট অ্যাক্সেস ছাড়াই একাধিক ডিভাইসে ডেটা শেয়ার করুন

দ্বারা Boris Bugor12m2024/08/19
Read on Terminal Reader

অতিদীর্ঘ; পড়তে

মাল্টিপিয়ার কানেক্টিভিটি প্রথাগত সার্ভারকে বাইপাস করে Wi-Fi, ব্লুটুথ এবং ইথারনেট ব্যবহার করে অ্যাপল ডিভাইসগুলির মধ্যে সরাসরি ডেটা আদান-প্রদানের অনুমতি দেয়। নিবন্ধটি আপনার প্রকল্পগুলিতে এই প্রযুক্তিকে একীভূত করার সুবিধা, সীমাবদ্ধতা এবং পদক্ষেপগুলির রূপরেখা দেয়৷
featured image - মাস্টার iOS মাল্টিপিয়ার কানেক্টিভিটি এবং ইন্টারনেট অ্যাক্সেস ছাড়াই একাধিক ডিভাইসে ডেটা শেয়ার করুন
Boris Bugor HackerNoon profile picture
0-item


মাল্টিপিয়ার কানেক্টিভিটি হল সাধারণ ডেটা এক্সচেঞ্জ ফরম্যাটের বিকল্প। একটি মধ্যবর্তী ব্রোকারের মাধ্যমে Wi-Fi বা সেলুলার নেটওয়ার্কের মাধ্যমে ডেটা আদান-প্রদানের পরিবর্তে, যা সাধারণত একটি ব্যাকএন্ড সার্ভার, মাল্টিপিয়ার কানেক্টিভিটি মধ্যস্থতাকারী ছাড়াই আশেপাশের একাধিক ডিভাইসের মধ্যে তথ্য বিনিময় করার ক্ষমতা প্রদান করে৷


আইফোন এবং আইপ্যাড ওয়াই-ফাই এবং ব্লুটুথ প্রযুক্তি ব্যবহার করে, যেখানে ম্যাকবুক এবং অ্যাপল টিভি ওয়াই-ফাই এবং ইথারনেটের উপর নির্ভর করে।


এখান থেকে, এই প্রযুক্তির সুবিধা এবং অসুবিধাগুলি অবিলম্বে অনুসরণ করে। সুবিধার মধ্যে রয়েছে বিকেন্দ্রীকরণ এবং তদনুসারে, মধ্যস্থতাকারী ছাড়া তথ্য বিনিময় করার ক্ষমতা।


অসুবিধাগুলি — ভাগ করা আইফোন এবং আইপ্যাডের জন্য ওয়াই-ফাই এবং ব্লুটুথ কভারেজ বা ম্যাকবুক এবং অ্যাপল টিভির জন্য ওয়াই-ফাই এবং ইথারনেটের মধ্যে সীমাবদ্ধ। অন্য কথায়, তথ্যের আদান-প্রদান ডিভাইসগুলির আশেপাশেই করা যেতে পারে।


মাল্টিপিয়ার সংযোগের একীকরণ জটিল নয় এবং নিম্নলিখিত পদক্ষেপগুলি নিয়ে গঠিত:

  1. প্রজেক্ট প্রিসেট

  2. অন্যান্য ডিভাইসের জন্য দৃশ্যমানতা সেটআপ করুন

  3. পরিসরে দৃশ্যমান ডিভাইসের জন্য স্ক্যান করুন

  4. ডেটা বিনিময়ের জন্য একজোড়া ডিভাইস তৈরি করা

  5. ডেটা বিনিময়


আসুন উপরের ধাপগুলির প্রতিটিটি ঘনিষ্ঠভাবে বিবেচনা করি।


1. প্রজেক্ট প্রিসেট

এই পর্যায়ে, মাল্টিপিয়ার কানেক্টিভিটি বাস্তবায়নের জন্য প্রকল্পটি প্রস্তুত করতে হবে। এটি করার জন্য, আপনাকে স্ক্যান করতে সক্ষম হওয়ার জন্য ব্যবহারকারীর কাছ থেকে অতিরিক্ত অনুমতি নিতে হবে:

  • গোপনীয়তা যোগ করুন — ব্যবহারের উদ্দেশ্য বর্ণনা সহ 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 (আরও নির্ভরযোগ্য এবং কম নির্ভরযোগ্য) ব্যবহার করে। আপনার কোন প্রোটোকল প্রয়োজন তা যদি আপনি না জানেন তবে আপনার উভয়ই প্রবেশ করা উচিত।

2. অন্যান্য ডিভাইসের জন্য দৃশ্যমানতা সেটআপ করুন

মাল্টি-পিয়ার সংযোগের জন্য ডিভাইসের দৃশ্যমানতার সংগঠন 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 ব্যবহার করে ডিভাইসের দৃশ্যমানতা পরিবর্তন করার অনুমতি দেবে।

3. পরিসরে দৃশ্যমান ডিভাইসগুলির জন্য স্ক্যান করুন৷

একটি মাল্টি-পিয়ার সংযোগের জন্য ডিভাইসের দৃশ্যমানতা স্ক্যানিং 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 মাধ্যমে ডিভাইসের দৃশ্যমানতা সক্ষম/অক্ষম করা হবে।
ফলস্বরূপ, এই পর্যায়ে, ডিভাইসগুলির সনাক্তকরণ এবং প্রদর্শন সঠিকভাবে কাজ করা উচিত।


4. ডেটা বিনিময়ের জন্য একজোড়া ডিভাইস তৈরি করা

প্রতিনিধি পদ্ধতি 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 আমন্ত্রণ, অনুমতি এবং সেশন পাঠানোর ডিভাইসটি ফিরিয়ে দেবে।


ফলস্বরূপ, সফলভাবে আমন্ত্রণ গ্রহণ করার পরে, একটি জোড়া তৈরি করা হবে:


5. ডেটা বিনিময়

একটি জোড়া তৈরি করার পরে, 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() এ ফায়ার করে।


মাল্টিপিয়ার কানেক্টিভিটি ইন্টিগ্রেশন প্রোটোটাইপ সম্পর্কে আরও বিশদ এতে পাওয়া যাবে ভান্ডার . উদাহরণ হিসেবে, এই প্রযুক্তি ডিভাইসের মধ্যে বার্তা বিনিময় করার ক্ষমতা প্রদান করেছে।



আমার সাথে যোগাযোগ করতে দ্বিধা করবেন না টুইটার যদি আপনার কোন প্রশ্ন থাকে। এছাড়াও, আপনি সবসময় করতে পারেন আমাকে একটা কফি কিনে দাও .