[RELEASED] UTNotifications - Professional Cross Platform Push Notifications and More

Hi chirhotec. Hi personOneMillion.

UTNotifications use GCM on Android only, iOS is implemented using APNS. But it is not really complicated to support APNS in addition to GCM on a server side. UTNotifications’ DemoServer includes an example how it can be done.

On Android, it works well with the latest version of GCM.

Best regards,
Yuriy, Universal Tools team.

Hi Yuriy, I have GCM notification working, a few questions:

I tried adding my own custom properties to the GCM “data” block (I used “message_type” and “message_json”) but then the Android client ignored the notification (nothing displayed, no call to OnNotificationsReceived). I thought we could add custom fields and they would be passed through ReceivedNotification.userData? Am I doing that wrong?

Related question – I assumed the tag “server_message” in the demo server was just an example tag and we could use whatever we want, or is that tag special?

A more general question, I’m interested why you do notification display via UTNotification code instead of using the platform-specific Android “notification” { title, body etc }? Reason is I need localization of title/text, seems you assume localization on the server, correct? I had considered localization on client (send string tag + parameters) but that has complexity too, so wanted to hear your recommendation for best localization approach to work across all three push notification systems.

Hi mwk888,

1. I tried adding my own custom properties to the GCM “data” block (I used “message_type” and “message_json”) but then the Android client ignored the notification (nothing displayed, no call to OnNotificationsReceived). I thought we could add custom fields and they would be passed through ReceivedNotification.userData? Am I doing that wrong?
You did everything right, all extra fields of “data” are handled as user data and should be accessable with ReceivedNotification.userData. But it currently supports only string values, so you have to encode the values to strings.

2. Related question – I assumed the tag “server_message” in the demo server was just an example tag and we could use whatever we want, or is that tag special?
You assumed everything correctly - it is just an example tag, you can use anything you like.

3. A more general question, I’m interested why you do notification display via UTNotification code instead of using the platform-specific Android “notification” { title, body etc }? Reason is I need localization of title/text, seems you assume localization on the server, correct? I had considered localization on client (send string tag + parameters) but that has complexity too, so wanted to hear your recommendation for best localization approach to work across all three push notification systems.
Maybe I’m a bit out of date (newest versions of GCM can have more options here), but in general Google Cloud Messaging doesn’t specify any format for passing title & body. You always have to handle incoming messages on your own. There is also no automated localization. We localize text values on a server side. If you wish, you can implement it on a client side by modifying the UTNotifications Android native plugin (see Assets/Plugins/Android/UTNotifications/src/universal/tools/notifications/Manager.java, static void postPushNotification(Context context, Bundle extras)). F.e. you can pass localization keys instead of title and text and localize them before passing to
static void postNotification(Context context, String title, String text, int id, Bundle userData, String notificationProfile, boolean repeatedOrNotScheduled).

I prefer server side localization because it doesn’t restrict one to show only the values supported by the client (so you don’t have to update the client to show new kinds of notifications).

Best regards,
Yuriy, Universal Tools team.

Turns out the client delivery problem was specific to the tag “message_type”. Even though GCM response status is “success” I think it breaks GCM delivery. I notice the XMPP protocol mentions “message_type” so I bet it’s a reserved token for HTTP also, although apparently undocumented.

1 Like

Hi,

I’m working on a simple RSS feed app that has various categories users can subscribe to. The news will be provided on a simple website and once the staff add the news I’d like them to send notifications to the app so users know when there’s new news.

I’m new to notifications, so I’m not sure if your package can be used but basically can I somehow specify what notifications are received on the device? Also, are there any instructions on the web server? Or perhaps a wordpress plugin? Thanks

Hi derkoi,

Yes, push notifications are exactly what you need. You can specify the target clients for each notification when sending it on a server side. Each client is being identified with a unique “registration id” which you get from UTNotifications and send to your server with any additional info to identify a specific user. Or you can use registration id itself as a user unique id and subscribe/unsubscribe to any categories using that id.

UTNotifications provide complete ready to use push notifications client side and a reference server side (DemoServer) written in Java. But there are numbers of solutions for any server technology and language, which are fully compatible to UTNotifications because it relies on native system APIs, such as APNS for iOS & GCM/ADM for Android.
F.e. there are indeed some Wordpress plugins providing that functionality such as EasyAPNS and WP Google Cloud Messaging.

Feel free to ask about any details or advices, I’m always happy to help!

Best regards,
Yuriy, Universal Tools team.

1 Like

Thanks for your reply!

Glad to inform you, that we’re working on adding Windows Phone 8.1 / Windows Store / Windows Universal build support in the asset.
Current estimation is that the feature will be available in the first half of November.

We want to track the application launch from the local notification (when you tap on your local notification and the application launches).

Can I do it with your plugin? (I need to track not only the fact of a launch, but the id or text of a specific notification).

Hi soulburner,

Currently you can handle a list of the received and not yet handled notifications (both local/scheduled and push) but you can’t tell which one (or none) was clicked. You receive all the info on each notification, including id, title, text, notification profile and any custom user data attached. See UTNotifications.Manager.OnNotificationsReceived.

I’ve added a feature request to make it possible directly in the upcoming update. If you really need this functional now you can modify provided Android native plugin code to handle the Intent which started the app, on iOS you’ll now have to manually edit the objective-c code generated by Unity (see http://stackoverflow.com/questions/13308555/how-to-open-an-ios-application-on-tap-of-push-notification). Or you can just wait for the upcoming release of UTNotifications (in November).

Best regards,
Yuriy, Universal Tools team.

Hi Yuriy,

I’m not reaaaly into mobile development, but i’m trying to do a small and unconvetional test app with push messages, can you clarify if i can use your asset?

  • I have an app that will be distributed directly through .apk (outside PlayStore), and it only needs to send push messages at specific dates (hard coded, using the phone date.time). Is this type of interaction possible, without the use of any server-side communication?
    Thanks

Hi Uli_Okm,

If notifications content can be also known on a client side or at least can be received from some server in advance, then you don’t even need to use push notifications, just local scheduled ones are enough. F.e. see UTNotifications.Manager.ScheduleNotification and UTNotifications.Manager.ScheduleNotificationRepeating. And UTNotifications do a good job for you in that regards. F.e., Android doesn’t store scheduled notification when device is rebooted, but UTNotifications do it automatically (which wasn’t trivial to implement).

In case if notifications should show some text which is not known in advance (i.e. should be received from Internet directly in the moment of posting a notification) you’ll have to use push notifications. Google Cloud Messaging (GCM) supports distribution outside of the Google Play (works on most Android devices, except of Amazon ones - it’s impossible to use Amazon’s ADM without deployment with their own App Store). Both GCM and ADM are supported by UTNotifications.
But you’ll need a server for storing specific clients’ push notifications registration ids and then posting notifications to them (which in fact can be done directly from a client but in most cases doesn’t make sense).

P.S. Well, to tell the truth it’s possible to retrieve any data even directly before showing a local notification on Android, so you’ll not have to use push notifications even in that case, but you’ll have to modify the Android native plugin code, which we also provide.

Best regards,
Yuriy, Universal Tools team.

1 Like

Hi,

As many of you requested, new version 1.4 of UTNotifications supporting Windows Phone 8.1 / Windows 8.1 / Universal 8.1 / Universal 10 has just been uploaded to the asset store!
It will be available when Unity complete its review.
If you want to have it earlier, please write me at universal.tools.contact@gmail.com, attaching your Invoice No., and I’ll send you the update.

Best regards,
Yuriy, Universal Tools team.

Good news everyone!

The brand-new UTNotifications 1.4 with Windows Store (Windows Phone 8.1 / Windows 8.1 / Universal 8.1 / Universal 10) support is available at the Asset Store!
Please note, that UTNotifications support for Windows Store requires you to use Unity 5.0+, while Android & iOS versions work fine with Unity 4.3+.
Any feedback is very welcome!

And we’ve already started working on a next update - 1.5. It will include handling clicks on notifications (not only just a list of all received notifications), better Android 6 support, including the badges and some other improvements.
If you want some other features or changes to be included in the next update, please create a feature request.

Best regards,
Yuriy, Universal Tools team.

From my experience Unity’s built in NotificationServices.remoteNotifications ONLY returns a push notification that has been clicked on and that NotificationServices fails to provide a way to view the other push notifications. At any rate will be buying this package when the next update goes live!

Yes, you are right: that’s true for iOS.

Hi,

I purchased your plugin and I’ve set everything up to post notifications on my Android device. I’m using this Wordpress plugin to send notifications, they’re working as expected apart from the message I receive is:

I can’t figure out how to read the remainder of the message, so all I know is it’s the WRONG MESSAGE FORMAT!

I realise this might not be an issue with your plugin but figured I’d ask here anyway.

Thanks

Hi derkoi,

It’s simple: the “WRONG MESSAGE FORMAT!” means that the push notification json sent by that GEO-fence Worpress plugin doesn’t contain “title” and “text” values.
Expected message format is:

            "data":
            {
                "title":"<Title>",
                "text":"<Text>",
                "<User data key 1>":"<User data value 1>",
                ...
            }

Note that both & values should be URL-Encoded in order to support non-English characters.

Best regards,
Yuriy, Universal Tools team.

Hi,

Thank you for the asset.
I just have a problem : after I’ve imported the asset, I can’t generate any more the android apk file.
The build stops at “Converting classes to dex format” and there is the following error in the unity console :

Error unity console

CommandInvokationFailure: Unable to convert classes into dex format. See the Console for details.
C:\Program Files\Java\jdk1.8.0_45\bin\java.exe -Xmx2048M -Dcom.android.sdkmanager.toolsdir=“C:/Users/MMTPC2/AppData/Local/Android/android-sdk\tools” -Dfile.encoding=UTF8 -jar “J:\Unity\Editor\Data\PlaybackEngines\androidplayer/Tools\sdktools.jar” -

stderr[
warning: Ignoring InnerClasses attribute for an anonymous inner class
(org.apache.commons.httpclient.HttpMethodBase$1) that doesn’t come with an
associated EnclosingMethod attribute. This class was probably produced by a
compiler that did not target the modern .class file format. The recommended
solution is to recompile the class from source, using an up-to-date compiler
and without specifying any “-target” type options. The consequence of ignoring
this warning is that reflective operations on this class will incorrectly
indicate that it is not an inner class.
warning: Ignoring InnerClasses attribute for an anonymous inner class
(org.apache.commons.httpclient.protocol.ControllerThreadSocketFactory$1) that doesn’t come with an
associated EnclosingMethod attribute. This class was probably produced by a
compiler that did not target the modern .class file format. The recommended
solution is to recompile the class from source, using an up-to-date compiler
and without specifying any “-target” type options. The consequence of ignoring
this warning is that reflective operations on this class will incorrectly
indicate that it is not an inner class.
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/annotation/InterpolatorRes;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/annotation/RawRes;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/annotation/FractionRes;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/annotation/NonNull;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/annotation/PluralsRes;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/annotation/AttrRes;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/annotation/DrawableRes;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/annotation/AnyRes;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/annotation/IntegerRes;

UNEXPECTED TOP-LEVEL EXCEPTION:
java.lang.RuntimeException: Translation has been interrupted
at com.android.dx.command.dexer.Main.processAllFiles(Main.java:608)
at com.android.dx.command.dexer.Main.runMonoDex(Main.java:311)
at com.android.dx.command.dexer.Main.run(Main.java:277)
at com.android.dx.command.dexer.Main.main(Main.java:245)
at com.android.dx.command.Main.main(Main.java:106)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at SDKMain.main(SDKMain.java:129)
Caused by: java.lang.InterruptedException: Too many errors
at com.android.dx.command.dexer.Main.processAllFiles(Main.java:600)
… 9 more
]
stdout[
processing archive bin\classes.jar…
processing com/unity3d/player/a$1.class…
processing com/unity3d/player/a$2.class…
processing com/unity3d/player/a$a.class…
processing com/unity3d/player/a.class…
processing com/unity3d/player/b$1.class…
processing com/unity3d/player/b$2.class…
processing com/unity3d/player/b.class…
processing com/unity3d/player/c.class…
processing com/unity3d/player/d$1.class…
processing com/unity3d/player/d$2.class…
processing com/unity3d/player/d.class…
processing com/unity3d/player/e.class…
processing com/unity3d/player/f.class…
processing com/unity3d/player/g.class…
processing com/unity3d/player/h.class…
processing com/unity3d/player/i.class…
processing com/unity3d/player/j$1.class…
processing com/unity3d/player/j$2$1$1.class…
processing com/unity3d/player/j$2$1.class…
processing com/unity3d/player/j$2.class…
processing com/unity3d/player/j.class…
processing com/unity3d/player/k$1.class…
processing com/unity3d/player/k.class…
processing com/unity3d/player/l.class…
processing com/unity3d/player/m.class…
processing com/unity3d/player/n$1.class…
processing com/unity3d/player/n.class…
processing com/unity3d/player/NativeLoader.class…
processing com/unity3d/player/o.class…
processing com/unity3d/player/ReflectionHelper$1.class…
processing com/unity3d/player/ReflectionHelper$a.class…
processing com/unity3d/player/ReflectionHelper.class…
processing com/unity3d/player/p.class…
processing com/unity3d/player/q$1.class…
processing com/unity3d/player/q$2.class…
processing com/unity3d/player/q$3.class…
processing com/unity3d/player/q.class…
processing com/unity3d/player/r.class…
processing com/unity3d/player/s.class…
processing com/unity3d/player/UnityPlayer$1.class…
processing com/unity3d/player/UnityPlayer$2.class…
processing com/unity3d/player/UnityPlayer$4.class…
processing com/unity3d/player/UnityPlayer$5.class…
processing com/unity3d/player/UnityPlayer$6.class…
processing com/unity3d/player/UnityPlayer$7.class…
processing com/unity3d/player/UnityPlayer$8.class…
processing com/unity3d/player/UnityPlayer$9.class…
processing com/unity3d/player/UnityPlayer$10.class…
processing com/unity3d/player/UnityPlayer$11.class…
processing com/unity3d/player/UnityPlayer$12.class…
processing com/unity3d/player/UnityPlayer$13$1.class…
processing com/unity3d/player/UnityPlayer$13.class…
processing com/unity3d/player/UnityPlayer$3.class…
processing com/unity3d/player/UnityPlayer$14.class…
processing com/unity3d/player/UnityPlayer$15.class…
processing com/unity3d/player/UnityPlayer$16.class…
processing com/unity3d/player/UnityPlayer$17.class…
processing com/unity3d/player/UnityPlayer$18.class…
processing com/unity3d/player/UnityPlayer$19.class…
processing com/unity3d/player/UnityPlayer$a.class…
processing com/unity3d/player/UnityPlayer$b.class…
processing com/unity3d/player/UnityPlayer$c.class…
processing com/unity3d/player/UnityPlayer.class…
processing com/unity3d/player/UnityPlayerActivity.class…
processing com/unity3d/player/UnityPlayerNativeActivity.class…
processing com/unity3d/player/UnityPlayerProxyActivity.class…
processing com/unity3d/player/t.class…
processing com/unity3d/player/u$1.class…
processing com/unity3d/player/u.class…
processing com/unity3d/player/WWW.class
processing org/fmod/FMODAudioDevice.class…
processing org/fmod/a.class…
processing bitter/jnibridge/JNIBridge$a.class…
processing bitter/jnibridge/JNIBridge.class…
processing bin\classes.\com\facebook\android\Manifest$permission.class…
processing bin\classes.\com\facebook\android\Manifest.class…
processing bin\classes.\com\facebook\android\R$attr.class…
processing bin\classes.\com\facebook\android\R$color.class…
processing bin\classes.\com\facebook\android\R$dimen.class…
processing bin\classes.\com\facebook\android\R$drawable.class…
processing bin\classes.\com\facebook\android\R$id.class…
processing bin\classes.\com\facebook\android\R$integer.class…
processing bin\classes.\com\facebook\android\R$layout.class…
processing bin\classes.\com\facebook\android\R$raw.class…
processing bin\classes.\com\facebook\android\R$string.class…
processing bin\classes.\com\facebook\android\R$style.class…
processing bin\classes.\com\facebook\android\R$styleable.class…
processing bin\classes.\com\facebook\android\R.class…
processing bin\classes.\com\facebook\Manifest$permission.class…
processing bin\classes.\com\facebook\Manifest.class…
processing bin\classes.\com\facebook\R$attr.class…
processing bin\classes.\com\facebook\R$color.class…
processing bin\classes.\com\facebook\R$dimen.class…
processing bin\classes.\com\facebook\R$drawable.class…
processing bin\classes.\com\facebook\R$id.class…
processing bin\classes.\com\facebook\R$integer.class…
processing bin\classes.\com\facebook\R$layout.class…
processing bin\classes.\com\facebook\R$raw.class…
processing bin\classes.\com\facebook\R$string.class…
processing bin\classes.\com\facebook\R$style.class…
processing bin\classes.\com\facebook\R$styleable.class…
processing bin\classes.\com\facebook\R.class…
processing bin\classes.\com\google\android\gms\Manifest$permission.class…
processing bin\classes.\com\google\android\gms\Manifest.class…
processing bin\classes.\com\google\android\gms\R$attr.class…
processing bin\classes.\com\google\android\gms\R$color.class…
processing bin\classes.\com\google\android\gms\R$dimen.class…
processing bin\classes.\com\google\android\gms\R$drawable.class…
processing bin\classes.\com\google\android\gms\R$id.class…
processing bin\classes.\com\google\android\gms\R$integer.class…
processing bin\classes.\com\google\android\gms\R$layout.class…
processing bin\classes.\com\google\android\gms\R$raw.class…
processing bin\classes.\com\google\android\gms\R$string.class…
processing bin\classes.\com\google\android\gms\R$style.class…
processing bin\classes.\com\google\android\gms\R$styleable.class…
processing bin\classes.\com\google\android\gms\R.class…
processing bin\classes.\com\MyMusicTeacher\MyMusicTeacher\Manifest$permission.class…
processing bin\classes.\com\MyMusicTeacher\MyMusicTeacher\Manifest.class…
processing bin\classes.\com\MyMusicTeacher\MyMusicTeacher\R$attr.class…
processing bin\classes.\com\MyMusicTeacher\MyMusicTeacher\R$color.class…
processing bin\classes.\com\MyMusicTeacher\MyMusicTeacher\R$dimen.class…
processing bin\classes.\com\MyMusicTeacher\MyMusicTeacher\R$drawable.class…
processing bin\classes.\com\MyMusicTeacher\MyMusicTeacher\R$id.class…
processing bin\classes.\com\MyMusicTeacher\MyMusicTeacher\R$integer.class…
processing bin\classes.\com\MyMusicTeacher\MyMusicTeacher\R$layout.class…
processing bin\classes.\com\MyMusicTeacher\MyMusicTeacher\R$raw.class…
processing bin\classes.\com\MyMusicTeacher\MyMusicTeacher\R$string.class…
processing bin\classes.\com\MyMusicTeacher\MyMusicTeacher\R$style.class…
processing bin\classes.\com\MyMusicTeacher\MyMusicTeacher\R$styleable.class…
processing bin\classes.\com\MyMusicTeacher\MyMusicTeacher\R.class…
processing bin\classes.\universal\tools\notifications\Manifest$permission.class…
processing bin\classes.\universal\tools\notifications\Manifest.class…
processing bin\classes.\universal\tools\notifications\R$attr.class…
processing bin\classes.\universal\tools\notifications\R$color.class…
processing bin\classes.\universal\tools\notifications\R$dimen.class…
processing bin\classes.\universal\tools\notifications\R$drawable.class…
processing bin\classes.\universal\tools\notifications\R$id.class…
processing bin\classes.\universal\tools\notifications\R$integer.class…
processing bin\classes.\universal\tools\notifications\R$layout.class…
processing bin\classes.\universal\tools\notifications\R$raw.class…
processing bin\classes.\universal\tools\notifications\R$string.class…
processing bin\classes.\universal\tools\notifications\R$style.class…
processing bin\classes.\universal\tools\notifications\R$styleable.class…
processing bin\classes.\universal\tools\notifications\R.class…
processing archive plugins.\android-support-v4.jar…
ignored resource META-INF/
ignored resource META-INF/MANIFEST.MF
ignored resource android/
ignored resource android/support/
ignored resource android/support/v4/
ignored resource android/support/v4/util/
processing android/support/v4/util/MapCollections$ArrayIterator.class…
processing android/support/v4/util/MapCollections$KeySet.class…
processing android/support/v4/util/MapCollections$ValuesCollection.class…
processing android/support/v4/util/Pair.class…
processing android/support/v4/util/Pools.class…
processing android/support/v4/util/MapCollections$EntrySet.class…
processing android/support/v4/util/DebugUtils.class…
processing android/support/v4/util/SimpleArrayMap.class…
processing android/support/v4/util/ArrayMap.class…
processing android/support/v4/util/MapCollections.class…
processing android/support/v4/util/LongSparseArray.class…
processing android/support/v4/util/Pools$Pool.class…
processing android/support/v4/util/Pools$SimplePool.class…
processing android/support/v4/util/LogWriter.class…
processing android/support/v4/util/MapCollections$MapIterator.class…
processing android/support/v4/util/CircularArray.class…
processing android/support/v4/util/SparseArrayCompat.class…
processing android/support/v4/util/ContainerHelpers.class…
processing android/support/v4/util/Pools$SynchronizedPool.class…
processing android/support/v4/util/ArrayMap$1.class…
processing android/support/v4/util/CircularIntArray.class…
processing android/support/v4/util/LruCache.class…
processing android/support/v4/util/TimeUtils.class…
processing android/support/v4/util/AtomicFile.class…
ignored resource android/support/v4/graphics/
processing android/support/v4/graphics/BitmapCompat$BaseBitmapImpl.class…
processing android/support/v4/graphics/BitmapCompatKitKat.class…
ignored resource android/support/v4/graphics/drawable/
processing android/support/v4/graphics/drawable/DrawableCompatHoneycomb.class…
processing android/support/v4/graphics/drawable/DrawableCompatBase.class…
processing android/support/v4/graphics/drawable/DrawableCompatLollipop.class…
processing android/support/v4/graphics/drawable/DrawableCompat$LollipopDrawableImpl.class…
processing android/support/v4/graphics/drawable/DrawableCompatJellybeanMr1.class…
processing android/support/v4/graphics/drawable/DrawableCompatKitKat.class…
processing android/support/v4/graphics/drawable/DrawableCompat$HoneycombDrawableImpl.class…
processing android/support/v4/graphics/drawable/DrawableWrapper.class…
processing android/support/v4/graphics/drawable/DrawableCompatApi22.class…
processing android/support/v4/graphics/drawable/DrawableWrapperHoneycomb.class…
processing android/support/v4/graphics/drawable/RoundedBitmapDrawable.class…
processing android/support/v4/graphics/drawable/DrawableCompat$BaseDrawableImpl.class…
processing android/support/v4/graphics/drawable/DrawableCompat$KitKatDrawableImpl.class…
processing android/support/v4/graphics/drawable/DrawableCompat$MDrawableImpl.class…
processing android/support/v4/graphics/drawable/DrawableCompat$JellybeanMr1DrawableImpl.class…
processing android/support/v4/graphics/drawable/DrawableCompat$DrawableImpl.class…
processing android/support/v4/graphics/drawable/RoundedBitmapDrawableFactory$DefaultRoundedBitmapDrawable.class…
processing android/support/v4/graphics/drawable/DrawableCompatApi23.class…
processing android/support/v4/graphics/drawable/DrawableCompat$LollipopMr1DrawableImpl.class…
processing android/support/v4/graphics/drawable/DrawableWrapperLollipop.class…
processing android/support/v4/graphics/drawable/DrawableCompat.class…
processing android/support/v4/graphics/drawable/DrawableWrapperDonut.class…
processing android/support/v4/graphics/drawable/DrawableWrapperKitKat.class…
processing android/support/v4/graphics/drawable/RoundedBitmapDrawableFactory.class…
processing android/support/v4/graphics/drawable/RoundedBitmapDrawable21.class…
processing android/support/v4/graphics/BitmapCompat$KitKatBitmapCompatImpl.class…
processing android/support/v4/graphics/BitmapCompat$BitmapImpl.class…
processing android/support/v4/graphics/BitmapCompat$HcMr1BitmapCompatImpl.class…
processing android/support/v4/graphics/BitmapCompat$JbMr2BitmapCompatImpl.class…
processing android/support/v4/graphics/ColorUtils.class…
processing android/support/v4/graphics/BitmapCompat.class…
processing android/support/v4/graphics/BitmapCompatJellybeanMR2.class…
processing android/support/v4/graphics/BitmapCo

Could you help me ?
Thank you.

Hi MyMusicTeacher1,

The provided Unity console log says that you have two copies of the android support library (one copy came with UTNotifications, and one with another plugin). You can easily fix it by deleting UTNotifications’ copy: just delete the file Assets/Plugins/Android/UTNotifications/libs/android-support-v4.jar. It should help.

Best regards,
Yuriy, Universal Tools team.