[HN Gopher] Building cross-platform Rust for Web, Android and iO...
       ___________________________________________________________________
        
       Building cross-platform Rust for Web, Android and iOS - a minimal
       example
        
       Author : andsoitis
       Score  : 67 points
       Date   : 2023-07-09 16:54 UTC (6 hours ago)
        
 (HTM) web link (www.artificialworlds.net)
 (TXT) w3m dump (www.artificialworlds.net)
        
       | dylanowen wrote:
       | I found https://github.com/antoniusnaumann/cargo-swift pretty
       | nice for iOS. It uses UniFFI under the hood but automates the
       | other pieces with building an xcode project.
        
       | LoveMortuus wrote:
       | Macroquads can also nicely build cross-platform. For Web,
       | Android, Windows, Linux and from what I understand there also
       | work being done for iOS.
       | 
       | I personally like it and use it because it clicks with how I
       | think, so there isn't much extra additional learning to be done.
        
       | jwells89 wrote:
       | This is cool, but it's worth noting that depending on how
       | network-heavy the app in question is it may not be advisable to
       | build the networking portion of an app as part of the shared
       | core.
       | 
       | The reason for this is because iOS has a multitude of device
       | specific optimizations built into the native networking stack to
       | my knowledge is opted out of with the usage of cross platform
       | networking. This includes features coalescence of calls across
       | apps to occur when the antenna is already awake (to save power)
       | and transparent management of multi-connection situations (e.g.
       | when the phone has both wifi and cell available). The result is
       | more power used and less fluidity in some situations.
       | 
       | I don't think this is as much of an issue on Android where third
       | party networking libs like OkHTTP are the norm anyway.
       | 
       | With this in mind I believe the best functionality to put in a
       | shared core is generic common logic which does not have platform
       | optimizations.
        
         | manmal wrote:
         | A handy feature of NSURLSession comes to mind: You can
         | configure requests to enqueue ,,forever" (eg when offline)
         | until they are finally successful. No retry mechanism
         | necessary, or exponential backoff which can add nontrivial idle
         | time.
         | 
         | Features like this one are certainly not available when using
         | an alternative networking stack.
        
         | j45 wrote:
         | It's early and it will get figured out.
         | 
         | It's just nice to see Rust and WebAssembly mature little by
         | little.
        
       | jamil7 wrote:
       | UniFFI is pretty amazing productivity-wise for sharing common
       | components across clients and teams. I haven't really figured out
       | the WASM side yet though or if it's even really feasible.
        
       | arcticbull wrote:
       | I spent some time doing exactly this a couple of months ago, and
       | I agree, Mozilla's UniFFI is really cool. It's also what I'd
       | probably recommend at this time if you're trying do Rust code
       | sharing across higher-level platforms like iOS and Android.
       | 
       | You do have to write an export header spec in 'UDL' (a Mozilla
       | authored interface definition language with a JetBrains plug-in
       | to make it easier to write) - but in exchange, you get proper
       | (idiomatic) Kotlin, Swift, Ruby and Python bindings for your Rust
       | modules. It's nice that for instance the Swift bindings are
       | actually 'native' instead of implemented via Objective-C interop
       | (which would have arguably been simpler).
       | 
       | [edit] I should note that the Kotlin bindings are a little wonky
       | for non-scalar types because they're exported as AutoCloseable
       | resources, and care must be taken to use them correctly. [1]
       | 
       | [1] https://mozilla.github.io/application-
       | services/book/howtos/u...
        
       ___________________________________________________________________
       (page generated 2023-07-09 23:00 UTC)