I have a Xamarin.Forms Android project, am I'm trying migrate from the old Android support packages to AndroidX. The migrate seems to work, and I end up having to add a reference to the AndroidX media package during compile.
The issue is that when I try to actually run the app, I get the exception
System.InvalidCastException: 'Unable to convert instance of type 'Android.Widget.RelativeLayout' to type 'AndroidX.AppCompat.Widget.Toolbar'.'
from the Xamarin.Forms.Platform.Android.FormsAppCompatActivity.OnCreate. My MainActivity class subclasses FormsAppCompatActivity and MainActivity's OnCreate immediately calls the base OnCreate. Visual Studio says the exception is from external code, so it doesn't show me anything.
The OnStart and OnResume overrides in my MainActivity are called and finish fine (its only one line of code configuring the CrossCurrentActivity plugin being used.
I'm at a loss as to how to track down the problem. I suspect the issue is somewhere in one of the packages I'm using, my main suspect being the Xam.Plugin.Iconize since it hasn't been updated for a while, but we rely on it and I'm not really sure how to prove where the issue is.
I recently migrated to AndroidX and published the app. Users have been reporting a lot of crashes on start. I'm still figuring it out. Weird part is that, it works fine on some devices but crashes on some others.
I have noticed a few files in Android project still refer to the old 'Android Support' lib. Make sure you change them manually to AndroidX.
Check the Toolbar.xml and Tabbar.xml (Android proj>Resources>Layout). I had this in my app, which was still using android.support.v7......
I suggest to check in all the files and update manually where ever required.
Related
So yesterday this line:
ATTrackingManager.RequestTrackingAuthorization((status) => {
if (status == ATTrackingManagerAuthorizationStatus.Authorized)
{
}
was working code (in my cross-platform Xamarin.Forms PCL).
Today xamarin.ios received an update.
In the PCL project, the tracking manager is not found anymore. Intellisense doesnt know what it is anymore and I cannot debug the app.
It is recognized in the xamarin.ios project, but I need to access it from my PCL.
Anyone having the same issue and / or has already found a solution?
How can I rollback to xamarin.ios before the one I received today?
Don't need to rollback. As a test, I updated
Visual Studio (which also updated Xamarin.iOS).
XCode to 14.5.1.
Then I added a line of code to an existing Xamarin Forms solution, that referenced AppTrackingTransparency.ATTrackingManager. This was recognized as valid code. I Also tried just ATTrackingManager, and Intellisense correctly told me I needed using AppTrackingTransparency.
So its there now.
That namespace+classname is specific to iOS, so must be referenced from the iOS-specific project. (If it previously was referenceable in the PCL, that was probably a bug that has since been corrected; such code would break on any other platform.)
First step:
In your iOS project, write code that references that class.
Second step:
You need to know how to use your custom iOS code from the cross-platform Xamarin Forms PCL.
I won't repeat that here - there are multiple Q&As on that topic.
google "stackoverflow xamarin forms call platform specific code".
Yesterday I have pushed a new app to AppStore, but it gets rejected with the following error.
ITMS-90809: Deprecated API Usage - New apps that use UIWebView are no longer accepted. Instead, use WKWebView for improved security and reliability. Learn more (https://developer.apple.com/documentation/uikit/uiwebview).
In my knowledge, this issue usually occurs due to the use of Webview. I have one Webview in my project, so I decided to remove it (Since that part is currently not using in the project). I have pushed the app again to AppStore after removing the Webview, but again my app gets rejected with the same error. After that I do a clean, rebuild, and deleted the bin, obj folders. 2 times my app gets rejected from Appstore after removing Webview.
See the below screenshot: No Webviews are available for the entire solution.
Are there any other reasons for this error?
This seems an existing issue of Xamarin.forms on iOS .
Make sure that the version Xamarin.Forms is 4.6 or higher and Xamarin.iOS is 13.10.0.17 or higher.
Change the Linker Behavior to SDK Only or Link All and then add the
additional arguments: --optimize=experimental-xforms-product-type
Please check all of these have been set under the release
configuration and iPhone platform.
For more details you could refer
https://devblogs.microsoft.com/xamarin/uiwebview-deprecation-xamarin-forms/
How do you setup google firebase dynamic links, deep linking, in a xamarin forms app?
This is how I setup Firebase Dynamic Links in Android project of my Xamarin Forms App, so most of this will apply directly to android. I will work on finishing and documenting the iOS implementation in the future.
Disclaimer: I'm not an expert, any or all of this could be wrong. It's just what worked for me and my basic understanding. Please let me know if there are any errors and let's improve our collective intelligence of the Xamarin Community
If you don't already know what Dynamic Links are, watch the 2 min video, it's a great overview. https://firebase.google.com/docs/dynamic-links/
The Setup
Setup is broken up into 2 parts.
Part 1 - Configure the Dynamic Links in the Firebase Console (Easy)
Part 2 - Configure your app to be able to receive and process the Deep Links (Not as Easy)
Part 1 - Configure the Dynamic Links in the Firebase Console (Easy)
1- Setup a free firebase account at https://firebase.google.com/
2- Create a project.
3- Create a new dynamic link, the tab is at the bottom of the 'Grow' section.
It will generate a static domain name for you based off of your project name. Ex. 'https://myproject.page.link'
Short Link url is what users will click on to navigate to your appstore or launch your app.
Deep Link url is what actually gets sent into your app for you to work with. Ex 'https://myproject.com/MainPage'
iOS behavior. Currently set mine to open the link in a url browser, as my app is not connected to it yet.
Android behavior Very Important but not as hard as my explanation makes it look.
Here is where you register your app with firebase. The package name should be easy, use the same one as defined in your
apps Android properties. Ex 'com.mycompany.appname'
Adding the signing certs SHA-1 and SHA-256 are required for Dynamic Links, which is what we are doing here.
Microsoft has a great guide on this, better than I can explain. here
Download the google-services.json file - You will need it later. Also, you will need the one that has incorporated the SHA cert details in it.
Ignore the instructions for adding the firebase SDK, we will add these to our project later using Nuget packages.
When this is all done your app should be selectable in a dropdown for the android behavior.
Finally, add any extra tags to your dynamic link url if you want, its optional.
And that's it! Now you should have a working short link. When used on an android device it should already be able to determine if the app is already installed or not, and then either direct the user to the play store or open the app. However, it won't do anything with that deep link url that you set. That brings us to the next part.
Part 2 - Configure your app to be able to receive and process the Deep Links (Not as Easy)
1- Versions, might be important.
2- Nuget Packages - Hopefully this goes smoother for you than it did for me.
3- The Code
3a- Intent Filters
3b- Handling the Deep Link
1- Versions.
I was having a lot of issues trying to get dynamic/deep linking to work. So I went back and updated everything to the newest versions available at the time.
Visual Studio Professional 2017 - 15.7.5
.NET Framework 4.7.03056
Xamarin 4.10.10.2
Xamarin.Android SDK 8.3.3.2
Android SDK Manager - Got the latest. Android 8.1 API 27 and Android 8.0 API 26 (Targeting 8.1 might be required)
Android Properties -
-Application - Compile using Android Version(Target Framework): Android 8.1 Oreo
-Android Manifest: Target Android Version: Use Compile SDK Version(haven't tried targetting 8.1 directly, might work). My min target is still Android 4.4 API 19 Kit Kat
2- Nuget Packages. These are just for the Android project. MyApp.Android
You shouldn't have to add anything into the .NET Standard Project, just make sure the Xamarin.Forms Versions match
Below is what I did
Update:
Xamarin.Forms - updated to 3.0.0.482510
Install:
This is where it immediately got annoying for me. Issues here are what lead me to go back and update my Android API Levels to the most recent, 8.1
Xamarin.Firebase.Dynamic.Links by Xamarin Inc v60.1142.1 is what you want to install.
The other dependencies should automatically install. In my case, they did not.
Dependency MonoAndroid,Version=v8.0 is important here. That should be the SDK API version that your app is set to compile against.
However, the other dependencies like Xamarin.GooglePlayServices.Basement (= 60.1142.1) have nested dependencies of their own that require MonoAndroid,Version=v8.1
So if you run into issues installing the Dynamic Links Package, thats where I would recommend looking first.
For my purposes, the nested dependencies were not automatically getting installed, so I went down through each of them and their lists and did them all manually. Even the ones that said not to do manually. It's only 20 or so, but my guess would be if I had my project SDK's set to 8.1 before all of this that it would have gone smoothly.
The CODE
Intent Filters
These are defined in your AndroidManifest.xml file
What do they do? They listen for instructions while your app starts.
When an app start matches a pre-defined filter(short link), they it stores your intended action or data on the Intent Class. That is where we pull the deep link from.
For us, this is what let's the android app receive and begin to process the deep link url that you set all the way back in Part 1.
The firebase dynamic link docs have a good breakdown and example of what to do. here
The android developer docs have a good example and breakdown of this also. here
NOTE Focus on whats between the activity tags. I've just included the other tags to show general structure, in case you haven't edited these before.
That is about the minimum of what you need.
The highlighted line should match the Short Dynamic Link you setup in the established in the Firebase Console.
I'd recommend using a Wildcard like I did in the path prefix.
That way you can make new Dynamic Links and your app can handle them without having to release new versions.
Handling the Deep Link
At this point if your app is launched by the short link, you should be able to catch the deep link during the android startup process and handle it how you want.
All I will cover here is a basic example of how to get the Deep Link as a string.
I pass mine to the main app project (.NET Standard Library) using a simple dependency service.
You can use it however you want though, there's actions it can take in either the App or the App.Android project.
The important thing is getting the deep link.
The firebase docs have good examples, but written in java or whatever language native android uses. here
I'll be showing mostly the same, just in C# examples
Get The Intent.
What is the intent you want to get? The deep link you are sending into your app Ex. "https://mycoolapp.com/mainpage"
You want to get it in the MainActivity. Below is an extremely simplified example, but it's just about that easy. Now you should be able to do what you want with that link inside of your app.
TIPS
Be careful if you have something that interrupts your startup procedures.
My Application uses a splash screen. Part of that is a line of code that creates a new Intent, overwriting the one sent in from the dynamic link
So I have my DeepLinkHandler fire off before that operation, and store the deep link in a static string.
Once it's in a static string I can use a dependency service from the Main App(.NET Standard Library) to call the GetDynamicLinkString method and return the deep link as a string.
How to Test Using an Emulator and Debugger
I have a simple settings page on my app. I added a field that would print the deep link, if it has one.
Fire off the emulator like normal using the debugger. The deep link field should be empty.
With the emulator still running, minimize the app.
Open a browser and enter in the short link url.
This should re-launch your app, but this time the deep link field has the url that you set on the firebase console.
Hope this is able to save someone some headaches.
-Tim
I need to implement Map functionality into an application that I'm building.
And I was folliwing this guide.
I downloaded the package and did all of the configuration.
I haven't implemented the Map class into my project yet, I only did the configuration required for both platforms (Android and iOS).
The Portable project and the iOS project are fine, the problem here is the Android project.
It has some broken references, these ones:
And when I try to compile the Android project, I get this error and these warnings:
Can anybody give me a hand? Thanks in advance.
EDIT:
As a sidenote, I'm using the Sdk installed by Android Studio, and that one has the latest Google Play Services installed.
UPDATE:
I just upgraded the version of my Xamarin.GooglePlayServices one by one (the one listed up there in the first image) for some reason it downloaded a really old version of those. So I just upgraded them, and it seems those references are fine now.
But I still get the error:
The "ResolveLibraryProjectImports" tasks failed unexpectedly.
SOLUTION:
I unloaded the Android project, added this:
<UseShortFileNames>True</UseShortFileNames>
To every property group in the .csproj file.
Load my android project back, and it all worked fine now.
I'm using steroids by appgyver (update to latest version which includes supersonic as well) to develop my app.
I'm confused about the SQLite plugin. First they supported and included it, then they remove it, then they say that it will not work unless you configure the custom build (and there is no much documentation about that)...
I have a very simple application: textarea and button. When you click the button you insert intto the database the value.
According to the docs https://github.com/brodysoft/Cordova-SQLitePlugin
I'm using var db = window.sqlitePlugin.openDatabase({name : "mydb"});
to open the database. I have the scanner app updated on both android and ios. The result is that in IOS works fine while in Android I get this error: "Cannot read property 'openDatabase' of undefined".
My question is: for IOS the app will stop working once deployed on the appstore?
Why it's working with IOS Scanner? Is it supposed to work? I understood they removed SQLIte support. I don't understand. Then, cause in IOS works, why in Android is not working?
Moreover, how to include SQLite plugin in a steroid project? Anyone was suffesfuul with that? I love appgyver, they did a wonderful job with steroids and supersonic, but... for this SQLite plugin and related support (even an example would do) I'm a bit concerned regarding my decision to go with steroids and not with xamarin for example.
Thank you guys.
AppGyver dev here! You need to include the SQLite plugin as a custom plugin to your app using our Build Service, and then build a stand-alone app: http://docs.appgyver.com/tooling/build-service/
The SQLite plugin is included in the iOS App Store Scanner for preview purposes, so that's the reason it's working on iOS and not on Android. This is actually something we're removing soon, so sorry for the confusion.