पोर्टल्स स्विफ्ट में निर्मित एक मैक ऐप है । यह खुला स्रोत है और एंड-टू-एंड एन्क्रिप्टेड ओकैम पोर्टल्स पर अपने दोस्तों के साथ आपके मैक से टीसीपी या HTTP सेवाओं को निजी तौर पर साझा करने के लिए ओकैम रस्ट लाइब्रेरी का उपयोग करता है। एक साझा सेवा उनके लोकलहोस्ट पर दिखाई देती है!
इस पोस्ट में, हम जानेंगे कि स्विफ्टयूआई मैकओएस ऐप रस्ट कोड के साथ कैसे इंटरैक्ट करता है।
यदि आप Mac के लिए पोर्टल आज़माने के लिए उत्सुक हैं। आप इस लेख में इसके बारे में अधिक जान सकते हैं और होमब्रू का उपयोग करके इसे निम्नानुसार इंस्टॉल कर सकते हैं:
brew install build-trust/ockam/portals
यहां क्रियाशील एप्लिकेशन का 2 मिनट का वीडियो है:
पोर्टल कार्यक्षमता ओकम रस्ट लाइब्रेरी में पहले से ही लागू की गई थी। हम एक बेहतरीन macOS-नेटिव अनुभव बनाने के लिए तैयार हैं।
ऐप बनाने का हमारा पहला प्रयास टॉरी का उपयोग करना था। यह समझ में आता है क्योंकि हम ओकम रस्ट लाइब्रेरी का उपयोग करना चाहते थे और हमारी टीम के अधिकांश लोग रस्ट में चीजें बनाने में सहज हैं। इस पहले संस्करण को बनाना आसान था और इसमें वे सभी बुनियादी सुविधाएँ थीं जो हम चाहते थे। हालाँकि, ऐप का उपयोग करने का अनुभव अच्छा नहीं था। टौरी ने हमें केवल इस पर न्यूनतम नियंत्रण दिया कि मेनू को कैसे प्रस्तुत किया गया और जब कोई उपयोगकर्ता मेनू के साथ इंटरैक्ट करता है तो क्या होता है। ऐप का यह संस्करण ऐसा महसूस हुआ जैसे यह macOS के 10 साल पुराने संस्करण से संबंधित है, जब इसकी तुलना macOS सोनोमा में निर्मित मेनूबार आइटम का उपयोग करने में बेहद आसान है।
हमें एहसास हुआ कि जो समृद्ध अनुभव हम चाहते हैं उसके लिए हमें स्विफ्टयूआई का उपयोग करके ऐप बनाना होगा।
दुर्भाग्य से, हम स्विफ्ट और रस्ट को एकीकृत करने के लिए एक ऑफ-द-शेल्फ समाधान नहीं ढूंढ सके, जो हमें दोनों दुनियाओं का सर्वश्रेष्ठ प्रदान कर सके; रस्ट की सुरक्षा, और स्विफ्टयूआई का समृद्ध macOS-नेटिव अनुभव। कुछ और खोजबीन के बाद हमें एहसास हुआ कि हम सी-89 का उपयोग करके दोनों को जोड़ सकते हैं। रस्ट सी कॉलिंग कन्वेंशन के साथ संगत है, और स्विफ्ट ऑब्जेक्टिव-सी के साथ इंटरऑपरेबल है, जो सी-89 का सुपरसेट है।
हमने रस्ट डेटा संरचनाएँ लिखीं जिन्हें स्विफ्ट को दो बार दिखाई देने की आवश्यकता थी। एक संस्करण रस्ट में मुहावरेदार और उपयोग में आसान है। दूसरा संस्करण पॉइंटर्स और मेमोरी का उपयोग करके सी संगत है जिसे मैन्युअल रूप से मॉलोक के साथ आवंटित किया गया है। हमने कुछ सी-संगत एपीआई को भी उजागर किया है जो मुहावरेदार डेटा संरचनाओं को उनके सी-संगत संस्करणों में परिवर्तित करने के लिए असुरक्षित जंग में कच्चे-पॉइंटर्स का उपयोग करते हैं। अंत में हमने cbindgen लाइब्रेरी की मदद से स्वचालित रूप से एक C हेडर तैयार किया।
स्विफ्ट की ओर, हम सीधे सी एपीआई को कॉल कर सकते थे, लेकिन स्विफ्ट में सी डेटा संरचनाएं प्रथम श्रेणी के नागरिक नहीं हैं। इससे उन्हें स्विफ्टयूआई कोड के भीतर मुहावरेदार रूप से उपयोग करना कठिन हो जाता है। इसके बजाय, हमने स्विफ्ट में डेटा संरचनाओं की नकल करना और सी और स्विफ्ट के बीच कनवर्ट करना चुना। यह बोझिल लग सकता है, लेकिन व्यावहारिक रूप से, साझा स्थिति बहुत बार नहीं बदलती है। if let ...
, ForEach
, enum
आदि जैसे निर्माणों का उपयोग करके स्विफ्टयूआई में घटकों को जल्दी से बनाने की क्षमता बहुत उपयोगी है और व्यापार के लायक है।
यहां उसी संरचना का उसके 4 रूपों में एक उदाहरण दिया गया है:
// Rust idiomatic structure #[derive(Default, Clone, Debug, Eq, PartialEq)] pub struct LocalService { pub name: String, pub address: String, pub port: u16, pub shared_with: Vec<Invitee>, pub available: bool, } // Rust C-compatible structure #[repr(C)] pub struct LocalService { pub(super) name: *const c_char, pub(super) address: *const c_char, pub(super) port: u16, pub(super) shared_with: *const *const Invitee, pub(super) available: u8, } // Generated C header structure typedef struct C_LocalService { const char *name; const char *address; uint16_t port; const struct C_Invitee *const *shared_with; uint8_t available; } C_LocalService; // Swift idiomatic structure class LocalService { let name: String @Published var address: String? @Published var port: UInt16 @Published var sharedWith: [Invitee] @Published var available: Bool }
संकलन समय पर स्विफ्ट ऐप हमारे रस्ट लिब से स्थिर रूप से जुड़ा हुआ है। डेटा प्रवाह सरल है: यूआई इंटरैक्शन को सी एपीआई को कॉल करके क्रियाओं के रूप में स्विफ्ट से रस्ट में भेजा जाता है, परिवर्तन की घटनाएं केवल रस्ट द्वारा उत्सर्जित होती हैं, और स्विफ्ट को कॉलबैक का उपयोग करके सूचित किया जाता है जो यूआई में अपडेट की ओर ले जाता है।
स्विफ्टयूआई दृश्यों में अधिकांश कोड किसी भी अन्य स्विफ्टयूआई एप्लिकेशन की तरह ही दिखता है।
VStack(alignment: .leading, spacing: 0) { Text(service.sourceName).lineLimit(1) HStack(spacing: 0) { Image(systemName: "circle.fill") .font(.system(size: 7)) .foregroundColor( service.enabled ? (service.available ? .green : .red) : .orange) if !service.enabled { Text(verbatim: "Not connected") } else { if service.available { Text(verbatim: service.address.unsafelyUnwrapped + ":" + String(service.port)) } else { Text(verbatim: "Connecting") } } } ...
यदि आप अधिक जानने के लिए उत्सुक हैं, तो ockam_app_lib क्रेट और स्विफ्ट में पोर्टल ऐप के लिए कोड देखें। स्विफ्ट फ़ोल्डर में मेकफ़ाइल यह पता लगाने के लिए एक अच्छी जगह है कि सब कुछ कैसे बनाया और एक साथ लिंक किया गया है।
यदि आप मैक के स्विफ्ट या रस्ट कोड के लिए पोर्टल में योगदान करने में रुचि रखते हैं, तो हम हर हफ्ते नए अच्छे प्रथम अंक जोड़ते हैं और नए योगदानकर्ताओं की मदद करना पसंद करते हैं। योगदानकर्ताओं की कलह पर हमसे जुड़ें।
यहाँ भी दिखाई देता है.