[Released] Ultimate Mobile Pro

I am very happy to tell that Ultimate Mobile Pro is finally released (barrels of coffee were not wasted :slight_smile: )
Let me give you a quick introduction of Ultimate Mobile Pro. And explain why you should have this tool in your project if you are targeting mobile development with Unity.
Asset Store Link | Documentation

What the Ultimate Mobile is?
This is a bundle that contains Stan’s Assets best mobile native plugins inside wrapped with powerful unified API. The goal for the product is super simple, I want to cover all your native feature need for the Mobile development with Unity. So if you would miss something, never hesitate to get in touch with me. I am always happy to accept reasonable feature requests. Supported platforms and number of features will constantly grow. But we value stability over the number of features. That’s why for example we have an automatic testing system, that is dedicated to checking every tiny detail before new plugin version is published on a store.

Cross-Platform API Benefits

  • Time Saver. Only make implementation once, that will work the same way for each supported platform.
  • Editor Testing. When you testing your project inside the Unity Editor, you can only test your native services implementation. The Ultimate Mobile plugin will emulate native services workflow when running inside Unity Editor.

What you else should know about cross-platform API

We’ve been working with native services for a quite a while, and believe it or now, but each platform has own “know issues” and “not really obvious flows/workaround” you need to know when you want to make a solid native service implementation. Let me give you an example. Let’s say you want your user to sign in with Google Play, Did you know:

  • The difference between interactive & silent sign in?
  • The difference between a user account and a user player objects?
  • All the flows how a user can switch account or sign out without using UI provided by your game. But you still need to track this.
  • What is going to happen if the user will press the home button during Sign In process and activity will be killed by a system.
  • How to react to Google Sing in Errors (documented & not documented) and how to implement error resolution flows if possible.

After working with iOS / Android for the last couple of years, and constantly getting customer reports, who use our products in huge projects, I can keep going all day describing small but important things that you should know about native implementation and flow you should handle. But sometimes it’s easier to make then talk. And this is exactly what is the Ultimate Mobile for, it will just get all this work off your shoulders. Everything will be handled internally.

You should also be aware of, then no matter how hard we try to make cross-platform API, each platform will have unique things, that you might want to use but they aren’t covered with cross-platform AI. In most cases, cross-platform API covers around 80% of possibilities provided by a platform. Since some flows can be totally different. Here are a few examples for you.

Let’s say you want to check if a certain app is installed on the device. You can do this for both platforms using our plugins.

  • On Android, you can use PackageManager, and check app by its bundle id “com.facebook.katana”.
  • On iOS, you can’t use bundle id, but you can use UIKit framework check if certain URL Scheme is registered in a system, and make a conclusion. For example, if “fb://” scheme is registered - it means that the Facebook app is Installed.

But as you see, there are not possibilities to provide a cross-platform API that will allow you to make the same flow for both platforms.

Here is another example for you. The In App Purchases. We managed to design flow that will work for both platforms. But there is no way to wrap validation flow in a cross-platform API. This is the exact case when you need to use a combination of cross-platform and system native API. Check out the example.

Pro-line principles
Apart from all the statements above, the Ultimate Mobile will inherit all the pro-line plugins development principles:

  • Full Open source. That’s pretty simple, I do not think not an open source product can work for the developer community. If you are a junior developer, we will be happy if you learn something with our code. If you are a senior developer, we do not want you to have a “back box” in your project and we always open to critics and suggestions.

  • Strict code convention. You can read more about convention rules here. As our code will be a part of your project, the goal of the convention was:

  • You will never mix your and our classes

  • Filename / Class name itself will tell you where it belongs

  • By only looking on the class signature you will be able to understand how to use it properly.

  • Every public method and class should be documented. Of course, we have an online documentation and guides. But sometimes reading the method description is all you want to know.

  • Nice looking and user-friendly settings editor. This one is pretty simple with any third-party plugin you are adding to your cool project, you want to have a centralized, good-looking, and intuitive settings editor for it.

  • Ability to enable/disable modules. This one also as simple as it is. You only want plugin parts that you are using. So if some feature requires additional frameworks or files, you want to have it disabled if you do not have the intent to use it in your project.

  • Automatic project configuration. You do not have to make any additional configuration your build. If something is missing plugin will fix this on build pre-processing stage. The main goal is to be able to support cloud build services out of the box.

Looking forward to your feedback. I am really want to make this the best asset store mobile plugin, no kidding :slight_smile:

Hi there,
I’m using latest version of ultimate mobile pro and when i try to pick an image from gallery on android i get java runtime errors. project is built using Unity 2018.3 with exported into an android studio project with SDK 27.
please advise

Hey @jGate99 I’ll definitely try it in 2018.3 right now. But in order to better understand your issues, would be nice of you can get me your crash log.
Thx.

Thanks for prompt reply,

When i run the game, i get this error in log

[Exception] AndroidJavaException: java.lang.ClassNotFoundException: com.stansassets.core.utility.AN_UnityBridge
   java.lang.ClassNotFoundException: com.stansassets.core.utility.AN_UnityBridge
   java.lang.Class.classForName(Native Method)
   java.lang.Class.forName(Class.java:324)
   java.lang.Class.forName(Class.java:285)
   com.unity3d.player.UnityPlayer.nativeRender(Native Method)
   com.unity3d.player.UnityPlayer.c(Unknown Source)
   com.unity3d.player.UnityPlayer$e$2.queueIdle(Unknown Source)
   android.os.MessageQueue.next(MessageQueue.java:397)
   android.os.Looper.loop(Looper.java:164)
   com.unity3d.player.UnityPlayer$e.run(Unknown Source)
   Caused by: java.lang.ClassNotFoundException: Didn't find class "com.stansassets.core.utility.AN_UnityBridge" on path: DexPathList[[zip file "/data/app/com.pixelfavor.pixelart-1/base.apk"],nativeLibraryDirectories=[/data/app/com.pixelfavor.pixelart-1/lib/arm, /data/app/com.pixelfavor.pixelart-1/base.apk!/lib/armeabi-v7a, /vendor/lib, /system/lib]]
   dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
   java.lang.ClassLoader.loadClass(ClassLoader.java:511)
   java.lang.ClassLoader.loadClass(ClassLoader.java:469)
   ... 9 more
   Suppressed: java.lang.ClassNotFoundException: com.stansassets.core.utility.AN_UnityBridge
   java.lang.Class.classForName(Native Method)
   java.lang.BootClassLoader.findClass(ClassLoader.java:781)
   java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
   java.lang.ClassLoader.loadClass(ClassLoader.java:504)
   ... 10 more
   Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available
   UnityEngine.AndroidJNISafe.CheckException () (at <00000000000000000000000000000000>:0)
   UnityEngine.AndroidJNISafe.CallStaticObjectMethod (System.IntPtr clazz, System.IntPtr methodID, UnityEngine.jvalue[] args) (at <00000000000000000000000000000000>:0)
   UnityEngine.AndroidJavaClass._AndroidJavaClass (System.String className) (at <00000000000000000000000000000000>:0)
   SA.Android.Utilities.AN_MessageHandler.Initialize () (at <00000000000000000000000000000000>:0)
  
[Exception] AndroidJavaException: java.lang.ClassNotFoundException: com.stansassets.core.utility.AN_Logger
   java.lang.ClassNotFoundException: com.stansassets.core.utility.AN_Logger
   java.lang.Class.classForName(Native Method)
   java.lang.Class.forName(Class.java:324)
   java.lang.Class.forName(Class.java:285)
   com.unity3d.player.UnityPlayer.nativeRender(Native Method)
   com.unity3d.player.UnityPlayer.c(Unknown Source)
   com.unity3d.player.UnityPlayer$e$2.queueIdle(Unknown Source)
   android.os.MessageQueue.next(MessageQueue.java:397)
   android.os.Looper.loop(Looper.java:164)
   com.unity3d.player.UnityPlayer$e.run(Unknown Source)
   Caused by: java.lang.ClassNotFoundException: Didn't find class "com.stansassets.core.utility.AN_Logger" on path: DexPathList[[zip file "/data/app/com.pixelfavor.pixelart-1/base.apk"],nativeLibraryDirectories=[/data/app/com.pixelfavor.pixelart-1/lib/arm, /data/app/com.pixelfavor.pixelart-1/base.apk!/lib/armeabi-v7a, /vendor/lib, /system/lib]]
   dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
   java.lang.ClassLoader.loadClass(ClassLoader.java:511)
   java.lang.ClassLoader.loadClass(ClassLoader.java:469)
   ... 9 more
   Suppressed: java.lang.ClassNotFoundException: com.stansassets.core.utility.AN_Logger
   java.lang.Class.classForName(Native Method)
   java.lang.BootClassLoader.findClass(ClassLoader.java:781)
   java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
   java.lang.ClassLoader.loadClass(ClassLoader.java:504)
   ... 10 more
   Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available
   UnityEngine.AndroidJNISafe.CheckException () (at <00000000000000000000000000000000>:0)
   UnityEngine.AndroidJNISafe.CallStaticObjectMethod (System.IntPtr clazz, System.IntPtr methodID, UnityEngine.jvalue[] args) (at <00000000000000000000000000000000>:0)
   UnityEngine.AndroidJavaClass._AndroidJavaClass (System.String className) (at <00000000000000000000000000000000>:0)
   SA.Android.Utilities.AN_Logger.Init () (at <00000000000000000000000000000000>:0)
  
    [Log] GS: Connecting to:wss://preview-P353805LgLSt.ws.gamesparks.net/ws/device/P353805LgLSt?deviceOS=ANDROID&deviceID=da7a1861f3b71b114bb5b040fa1e10e7&SDK=Unity
   UnityEngine.Logger:Log(LogType, Object)
   GameSparks.Platforms.PlatformBase:Update()
  
[Exception] NullReferenceException: Object reference not set to an instance of an object.
   UnityEngine.AndroidJavaObject.Dispose (System.Boolean disposing) (at <00000000000000000000000000000000>:0)
   UnityEngine.AndroidJavaObject.Finalize () (at <00000000000000000000000000000000>:0)

Please do note that im building this project by exporting to Android Studio with custom Gradle file. Let me know if this has to do something with it

Well according to log, one of the core android native lib’s wasn’t picked up.
Those libraries normally added to the build with your build with internal or grudge build for Unity. I am not sure the way you do it, but that’s obviously the issues.
If you will get in touch with me, I am sure we will solve this case. Thanks.

1 Like

Thanks, i created a seperate project, added UMpro, exported android studio project copied following lines in my custom gradle

implementation(name: 'an_gallery', ext:'aar')
implementation project(':an_library.bundle')```

and now everything seems fine except following errror
```Program type already present: com.google.gson.annotations.Expose```

Please advise

Please be aware that the number of required libraries are based on your current AN settings.

That’s what I found:
https://stackoverflow.com/questions/49540827/error-program-type-already-present-com-google-common-annotations-beta

Also, it’s maybe my bad, since I included gson lib straight to the an_core.aar
3863533--327508--Screenshot_110618_113110_PM.jpg

So if any other libraries you use did the same… that’s your conflict.
In case you have gson lib referenced separately, I think as a quick fix you can not include gson lib directly (if you do ofcrouce)

Meanwhile, on my end, I will exclude gson lib from the an_core.aar and will have it as separate file or maven dependency if possible.
Let me know if you able to fix it. If not, then please get it touch with me directly I will send you an updated plugin. Thx.

1 Like

Ideally, UMPRo should have gson lib library as a seperate file/maven etc so there are less chances of it conflicting with other libraries out there.

Im gonna message you directly.
Thanks and great work on newly improved Pro version, its a delight.

I am glad you guys enjoying it. Will make an update for you ASAP.

1 Like

The 2018.7.3 is now live on the Asset Store.

New:

  • In case you used the previous version, manually remove the ISN_Media.cs file
  • Game Services: Saved games API added.
  • Game Services: Leaderboards API added.
  • Facebook: service added.

Next update plan:

  • Improve In-App purchases & Game Service API editor emulation
  • Google Mobile Ad & Unity Ads services support
  • Google Analytics & Unity Analytics services support
  • Summary tab
1 Like

Two questions:
1- I just realized this new 2018 version was out and I couldn’t directly update from the now depreciated version. Are there any special for upgrading or can I just install on top of the old version?

2- I can’t for the life of me figure out how to pull the player’s rank for a leaderboard out from Google Play and show it in-game. Can you help?

Hey, @Webbstre

There is no compatibility between old Ultimate and new Ultimate Mobile Pro. Ultimate Mobile Pro is a completely new product, so you need to remove old plugins completely and then install the Ultimate Mobile Pro. In case you will have any difficulties, I am always here to help!

I figure if you asking this inside Ultimate Mobile brunch, you probably want a cross-platform solution for Google Play and IOS.

I assume plugin, google play console & iTunes set up is complete. In case you still in progress here is Getting Started Game Service guide, that meant to help with this.

For Google Play:

  • Getting Started - Plugin and Android console configuration guide

  • Games Sing-in - Sing into Google Play Games service before you can use leaderboards API

  • Leaderboards - The leaderboards API. And in order to display current player rank for the specific leaderboard, you need to load leaderboard metadata and retrieve player score and rant from that data.

For Ultimate Mobile:
The approach is 100% the same:

When I was making this post I realized that I haven’t yet implemented cross-platform ability to load scores & leaderboard metadata for the ultimate mobile. So I will start working on it now. Please ping me if you want me to send you a beta version.
Also please let me know if my explanations weren’t clear enough. Thx.

Hi, I have uninstalled Ultimate Mobile and installed Ultimate Mobile Pro, I must say that the installation looks more neat than the previous version :slight_smile:
In the documentation I can not find how to call the native loading or the rate me. Can you please help me how to integrate these 2 items?
Thanks
Matias Ini

Hey, @matiasini I am investing a lot in UI, to be honest, want to really feel simple and intuitive. Actually, it’s pretty easy to find how to use Native Dialogs. Atch service has caret button you can click to expand guide/feature view, please take a look:
3880342--329704--Screenshot_111218_033255_AM.jpg

If you click on “Native Dialogs” it will redirect you to this guide:
https://unionassets.com/ultimate-mobile-pro/native-dialogs-722

About rate us popup, well… I know I need to make it cross-platform as well, but still thinking how to explain that iOS requires Store Kit Enabled for that :slight_smile:

I a meantime here is articles for iOS and Android native plugins you can use so far. Or I can make cross-platform implementation tomorrow and send a beta version for you.

iOS
https://unionassets.com/ios-native-pro/store-review-controller-631
Android
https://unionassets.com/android-native-pro/rate-us-dialog-710

So the code I used based on the older Ultimate will all be different? I have been hesitating on the upgrade before I know all of the effects.

Just in case, could you show me a direct example, along the lines of:
int currentRank = somecode…(leaderboardID);

There is no more push notification from onesignal?

Yep, new plugin, absolutely new code base.

I actually just finished the UM cross-platform API for this. Does it look like an exact think you are looking for?
https://unionassets.com/ultimate-mobile-pro/leaderboards-731#creating-in-game leaderboards-ui

Nope. I might add onesignal plugin support in future since I am currently working on a 3rd-party services module.
OneSingla looks like good feet for that, but current we already have Firebase support and iOS APNs. The next plans for 3rd party services are:

  • Google Ads + Unity Ads
  • Google Analytics + Unity Analytics
  • Playmaker

Once those is done I would be happy to consider other 3rd party services as well.

Hi @lacost , thanks for your support.
I have managed to integrate the rate pop up, thanks.
As for Native Dialogs, I was not asking for that, I have managed to integrated them on my own.
I was asking about Native Loading.
In the previews version of Ultimate Mobile you can show/hide a preloader like this:
MNP.ShowPreloader(“”, “”);
MNP.HidePreloader();

How can I manage to do the same on Ultimate PRO?
Thanks

Ok great, was using Onesignal from your old U5 version. Means I can’t upgrade.

@imtrobin you can still upgrade, but just use Onesignal plugin directly, and in a few months we would able to support it as separate service.

@matiasini you are right I forgot to implement this. Please PM me, I will send you an updated version that will contain cross-platform API for Rate Us popup and preloaders.