I am building a mobile and web SDK to consume our platform API (s). We are a very small team and do not want to depend on multiple mobile and web platforms.
I was reading about kotlin multiplatform and using the official guidance, we can achieve interoperability (IMO) in terms of writing a single code base and a plug-in as a library to multiple platforms such as JS, Native Android, IOS, and non-native platforms such as react-native and Flutter.
What would be the good approach and links to develop such a library incase it's possible? Any thoughts on it?
Thanks
We do this with multiple clients. Doing this is becoming easier with better tooling, and on native, the new non-strict memory model. Of course, the tech is relatively new, so the more difficult part will be packaging and distribution, but that's the kind of config work you'd likely need to do anyway regardless of implementation.
I don't have a great single link for you. Just several from people on the Touchlab team, with one notable exception.
https://twitter.com/shaktiman_droid/status/1546592640879165440
https://twitter.com/KevinSchildhorn/status/1519024016203333633
https://dev.to/touchlab/add-kotlinjs-support-to-your-kmm-library-48d9
https://dev.to/touchlab/dividing-kotlin-multiplatform-work-in-teams-2cad
mParticle actually generates a shared SDK with KMP, from an analytics data file. https://docs.mparticle.com/developers/smartype/. I haven't played with it in over a year, but they do seem to be updating it: https://github.com/mParticle/smartype.
Also, we had a few Kotlin/JS talks at Droidcon NYC this year. Those videos aren't public yet, but check them out when they are.
We (Touchlab) are about to release something that enables this much more easily for native mobile targets. JS, while we use it, is much less common of a request and hasn't yet been prioritized.
Finally, join the official Kotlin slack. There's plenty of support, and the Kotlin team often replies directly to help.
Good luck!
Related
I'm maintaining a plethora of apps for one of my clients all of which have native projects for each of the three main platforms. The apps are relatively simple in functionality. My client wants to always take advantage of the latest features in each platform for marketing opportunities. They also want to appear to be a native app (responsive, not laggy). I haven't followed cross-platform development very much lately, so that's why I'm reaching out to SO.
My initial idea is to write a C++ library that has all the functionality shared by the three platforms. Then, for each platform, I'll write some network, file access, and UI-code that connects the abstract library code to the concrete platform.
Of course, this is exactly what cross-platform systems aim to do. Would it be a waste of my time to write the above myself when this has already been done by platforms like PhoneGap? My concern is that I would be dependent on a third-party. If I write the code myself, I have full control, and I will always have access to the latest features.
Hope to get some pro's and con's.
Thanks!
Yet a third option (after Facebook's React Native and Microsoft's Xamarin) is Google's new Flutter and as the other answers suggests "then writing the Windows app purely natively". BTW, React Native does have Windows support the lack of which in Flutter could be a plus or a minus depending on how you look at it.
Have you considered using React Native for iOS and Android, then writing the Windows app purely natively?
There are tons of articles out there about pros and cons for React Native.
PhoneGap is just a web, written in HTML, CSS and JavaScript. React Native actually renders native components for iOS/Android.
There is also Xamarin. It supports multiple platforms and uses c#. The new features from the native languages all work great.
Read a number of questions on writing in just one language for both iOS and Android and what I learned is that it depends on the special functions you need. What I want to build is a very simple app that will ask the user what he or she is doing. We need this for billing the customers but my co-workers keep forgetting to update their time-sheet, so I want to write this little app that pops-up every x minutes and asks them what their doing. At the end of the day the list will be sent by e-mail or whatever.
Anyway.... is a pop-up from an app from the background a 'special' function? Can a general language be used on both for this?
Edit: I have searched for crossplatform tools, but all replies talk about specific functions that still require native coding. That is why I was wondering if something as simple as a popup with question and entering / saving a text, would be native or could easily be handled with a crossplatform tool.
You may use Xamarin to create a cross platform applications. I am satisfied with Xamarin platform at the moment. I have been working on native iOS, java for Android also.
Please keep in your mind that, it would be great if you are familar with these platforms because Xamarin is just a wrapper of methods which exist in the native platforms. Since I am familar with native Android and iOS, it makes me comfortable when I work on Xamarin platform.
My personal recommendation is to stick with Native platform. But if you have to work on cross platform, I believe Xamarin is a good option.
Pros:
If you are familiar with C#, it will help you a lot to develop an application for android, ios and windows platforms in Xamarin.
It is demanding platforms, and many big companies are looking Xamarin developers especially after the Microsoft acquisition.
Cons:
You need to buy a license.
There are other platforms as well, but I did not use any of them. Here are some of them
Cordova
HTML5
Unity
PhoneGap
Appcelerator
Corona
Qt
You may find useful the following urls
http://appindex.com/blog/ten-best-cross-platform-development-mobile-enterprises/
http://www.developereconomics.com/pros-cons-top-5-cross-platform-tools/
For sure what you describe can be achieved with using Ionic. Its a free solution and it comes with a lot of good documentation to get you up and running quickly. You'll need to use AngularJS for developing apps with Ionic so that might be a good solution if you know your way around that framework, or if you are familiar with Javascript or have done some web development before.
On regards to your question regarding native functionality (by popups I assume you mean notifications) Ionic sits on top of Cordova so there is a huge amount of native plugins that you can use to implement native functionality. You can take a look at plugins here.
Hope this helps!
I need to develop an Application for both iPhone and Android platforms. I am looking for a cross-platform development frameworks. The important factors need to be taken into consideration are :
The App will be running in intranet environment (with NO internet
connection).
Drag and drop features will be available in this App.
Needs to use the barcode reader library.
Needs to use map (it will probably be a custom map)
Receives Push notifications (currently I have mqtt in mind, since
there is not internet connection)
If possible I only want to maintain only one source code for both platforms. I have done some research and I found 2 frameworks which are PhoneGap and Mono(touch and droid).
PhoneGap seems to be slow.
Mono need two code base for 2 platforms, only the libraries can be
shared (correct me if I am wrong). This is my another worries about mono: http://redth.info/2010/04/09/is-monotouch-now-dead-in-the-water-what-does-apples-new-iphone-developer-agreement-mean
I know the native is the best but for the sake of maintenance and reusing our developer talent (which are C#, HTML, JavaScript) we need to find out the second best option.
Note : Please bear in mind the first 5 features listed on top for your answer.
Thanks in advance.
UPDATE:
After exploring a few more tools, I like the performance of Appcelerator as well. But writing the whole app in JavaScript looks very messy to me and can't use OOP. And the extra package size of (5~7 MB) is also something to take note for frequent releases environment. I like to hear from you guys as well. I will be updating our decision in coming few weeks.
This recent article here may be helpful. It contains a rundown of several new cross platform mobile frameworks including Mono, Appcelerator Titanium, Rhodes, PhoneGap, MoSync and Moai.
From reading your requirements I'd say that either MoSync or Titanium might be the best fit for you. Apart from PhoneGap, which is really just a web app running inside a mobile browser (and might be the reason you thought it was slow), they all generate native UI code apps.
You may want to look into this article comparing 5 different cross-platform mobile development tools.
This Wikipedia article may be helpful as well.
go for http://www.appcelerator.com/
They first compile code in native code so performance is like native and they have barcode reader, push notification (via urban airship) too...
How about doing a hybrid application, using a mixture of native code and HTML5. Write native code for all the IO, and heavy lifting, and for the GUI use jQuery or similar in a web control embedded in your app. Android has a web control that allows you to interact with javascript. I assume you can do the same with Apple. I'm trying to do something similar myself using Monodroid, and its looking very promising, although I discovered Monodroid does not have native Javascript interface yet.
Just so you know, we were using Appcelerator at my last company, and the performance for Android was less than desirable. Our lead developer found the Mono products, and hasn't looked back.
I have been making applications in objective-c for a while now and feel i have a good understanding of it. I have made many applications and started to make a few basic games.
However now i want to target android as well. I recently saw applications such as Titanium and the Corona SDK that let you create applications in one language and deploy to both platforms.
My question is, for anyone experienced with these, would it be better to just learn how to code android applications and then make android and IOS apps separate, or would it be a much better idea to start using one of the development tools listed above?
I am mostly talking about the creation of standard applications, not games.
Also more importantly, if i was to apply for a job developing apps, what would the company look for? someone experienced in each platforms sdk respectively or someone familiar with the titanium or Corona sdk to code and output the applications simultaneously.
I have looked around but could only find info regarding people who have not started either android or iphone development. I am already very familiar with objective C and iphone development.
If anyone could help that would be great!
Thanks for your time!
I would suggest learning the native Java SDK. If you do anything more than simple apps, you will feel constricted and limited by the "write-once" SDKs, as you will want to exploit the special features of each platform.
In terms of employability, if you know both native iPhone and Android SDKs, I would expect your employability to be much higher than just knowing the cross-platform language. By having a diverse knowledge of "complex" languages (such as Java, and Objective-C), if employers wanted a cross-platform approach, they are likely to recognise your adaptability to the task at hand. Conversely, by only knowing cross-platform development, you are limiting your chance of work - if the client wants to use a more in-depth feature of the platform, which is not available in your cross-platform language.
Do you have any experience with java? If not that is where I'd suggest you start. And unfortunately there is no end all be all for what potential employers may be looking for. It would depend on specifically what they are aiming to have you create(Something that makes more specialized use of one of the platform features would likely require a native app. Where as something mostly based on content could use one of the phoneGap type solutions because it would result in farthest reach). I can tell you though any of the "write once - deploy everywhere" platforms that are currently available will limit the amount of platform APIs you'll get access to. Because of that I would personally suggest that you dig into the native platform some and once you have a decent understanding of how things fit together at a high level maybe start looking at the other solutions.
If you know Java, then my suggestion is to use native SDK for developing in Android. The OO concept is similar, but the design is somehow different from iPhone development.
Platform like Titanium may be good for standard apps. But I think gradually you will want to use and tweak the native libraraies functionality. Then common frameworks are weak.
I have been developing for iPhone, Android, JME, BlackBerry also tried HTML5, my understanding is to use the native platform if possible. But the app is small, e.g. a simple RSS reader, then common platform is okay.
But in most of the cases, developer want to use special features provided by the native SDKs.
If you want to stick to Objective C, checkout out Apportable, which enables you to build and deploy Objective C apps to Android.
I have been looking at appcelerator it seems pretty fine! Without a doubt, one of the advantages of appcelerator is its support for multi-platform. I am interested in building an android app and maybe a iphone app later on. So it is not crucial to support multiple platforms at the moment.
If you disregard supporting multiple platforms and just focus on android development. Is appcelerator still advantageous? Does it lack any features of "Android sdk"?
(When I say "Andorid sdk" I mean development with Eclipse with native Android sdk, if it makes any sense)
We looked at Appcelerator when starting our Android project. We knew we would have to do an iOS client next, so Appcelerator was enticing.
We decided not to go that route because it doesn't support all the native features of each device.
For example, we decided early on that our user interface in Android would need a widget. No support for that in Appcelerator, as it's specific to Android. [This was a few months back -you may want to check again].
Compromising on the user interface was too much for us. We decided to go with C/C++ for the app logic and use Android SDK for the user interface.
Our apps now have two pieces: C/C++ as much as possible to the "brains" and the native (Android/Cocoa Touch) for the UI to take advantage of the UI experience.
Works of course for platforms that can integrate C/C++.
The parting advice: design your user interface first, then find a tool that can implement it. Users have high expectations of the UI in portable devices. Compromising on it early on may be the KOD for your project.
[EDIT] Every so often I see an upvote for this question. I would like to update with what we learned in the past two years:
Using C/C++ for the common parts of our application has paid off. It does require a slightly more complicated build process, but the savings are gigantic if the piece of code being shared is complex (as in our case).
For the user interface piece we are beginning to look into hybrid apps (some UI elements in HTML). There are still debates out there about HTML interfaces (Facebook and LinkedIn are two that move to native code for the UI), but also some reports that when chosen carefully it works. There is a great talk from Flipoard on that; with slides here.
UPDATE Oct/2014
In March/2014 Smashing Magazine published an excellent article comparing native iOS, native Android, PhongeGap (Cordova) and Appcelerator Titanium. They show the development of a simple app in each environment.
This is the last part of the series. At the top of this part there are links to the previous parts of the series and at the bottom there is the comparison of the approaches. There are also interesting comments from readers at the end.
UPDATE May/2015
Still get an upvote for this question every so often, so I would like to share what we have done since I wrote the first part of the answer.
We are now working on a project that also has a web client. We have now the iOS client, the Android client, plus the web client.
JavaScript is the natural choice for the web client.
Since we want to share as much code (at the business logic layer) across these clients, it means we need to find a way to run the JavaScript code in iOS and Android.
And that's what we ended up doing.
This is a summary of how we handle it:
For all clients: all data structures are defined with Google's protobuf. This allows to automatically generate the serialization/deserialization code for iOS and Android.
iOS: run the JavaScript code with the help of JavaScriptCore (a good overview here).
Android: run the JavaScript code with the help of Google's V8 engine.
The bridge between JavaScript and the iOS/Android layer can be a bottleneck, especially the serialization of the objects. We had to optimize a few things and learned a few lessons to stay out of trouble.
Generally the experience has been positive. We saved significant amount of time by sharing the code across all clients.
If I had to start another project like this one (that requires sharing code with web and mobile clients), I would also take a look at what Google did for inbox. It wasn't available when we started. Looks promising.
UPDATE August/2015
And the world keeps turning...
I would also take a good look at React Native if I had to start a new mobile app now.
It's based on JavaScript, bridging web and mobile development more easily.
There is a great tutorial in Ray Wenderlich's site.
UPDATE February 2016
My shortlist for cross-platform development is down to two:
ionic
React Native
I've been paying more attention to ionic because our web app uses AngularJS and so does ionic (Cordova + AngularJS). React Native will force the team to learn another framework (of course the argument is the opposite if your web app uses React).
Nevertheless, I'd seriously consider React Native, even having to learn another framework, because of the reported performance and look-and-feel of the app. From React Native's site:
With React Native, you can use the standard platform components such
as UITabBar on iOS and Drawer on Android
If you are starting now, I recommend you take the time to at a minimum complete their tutorials so you get a better feeling of each framework. Each tutorial can be complete in one to two hours:
ionic tutorial
React Native tutorial
For a simpler approach: Smashing Magazine just published (at the time I wrote this update) a good article showing how to use the native navigation elements to make the app feel (well...) native, while using web views to render the content. The article goes into the details of how to make the HTML/CSS usable in the mobile devices (it's not just pushing the HTML/CSS you already have).
If you only focus on develop apps for Android platform, I recommend you should use native Android (Eclipse + Android SDK as you said) instead Titanium.
Reason: Titanium is suitable if
You want to develop apps quicly, or
Your apps is simple, or
You see Java is so difficult (maybe :p ), so you choose the easier (Javascript of Titanium).
And here is the reasons why you should use native Android instead Titanium:
You want to develop a complex app, or
You want to customize app appearance. It's very important. Imaging you make an app for client, and they need their app to be customized for more eye-catching. Choosing Titanium means you must use their control, which lacks of ability to customize. It'd be better if using native Android that you can customize everything you want.
that is a very difficult question to answer without any specifics regarding the requirements of the application.
I would suggest you take a quick look at the API documentation of Appcelerator to see what the framework provides and also take a moment to list the basic requirements of your application and then determine what tool will be best for your project.
I think you are onto a good start using Appcelerator, since it uses JavaScript, etc. Easy to learn, but good examples. It will also enable you to use the same code and reach iPhone,iPad apps. Learning to use just the Android SDK is more complicated. Even then you still need to develop later iPhone etc apps. If you come from a web background this makes sense. There are good video's for quick learning. Good Luck
My experiences with Appcelerator seem to suggest they are more of an iOS shop. Their toolset for Android is, IMHO, quite lacking. ADT supports visual UI building and debugging on device, which Titanium Studio does not. There has been a bug filed about this for several months now, and it continues to be delayed. If your focus is Android, use Google ADT or MOTODEV Studio for Android. These IDEs are quite nice and are used by professionals.
The above answer presents a great way to develop mobile apps. DO NOT COMPROMISE ON A HIGH-QUALITY USER EXPERIENCE.
Lacking of bluetooth support is a huge deficiency for Appcelerator and no one gives a clue about roadmap.
edit : appcelerator now have BT support in Tizen 3.1
Well, in the new version of appcelerator (APPCELERATORSTUDIO 4.0) you can have alloy projects, and something like css files for your UI (tss), so in fact they are really customizable.
Greatings
Appcelerator has a lot of support and it really easy to use. It supports 100% of native api calls now. They have really good documentation too.