Xamarin: FirebaseMessaging update = breaking production

Az alapvető probléma az az, hogy az Apple megszünteti Áprilistól a UIWebView használatát, és minden olyan binárist, ami ezt az implementációt tartalmazza, elfogják utasítani a Store-ba való publikálásnál. Erre léptek egyet a Xamarin fejlesztők, és kijelentették, hogy a Xamarin Forms 4.4-től felfelé megváltoztatták WebView implementációt iOS-en , hogy az új iOS VKWebView implementációját használja. Felfrissítettem minden csomagot úgy, hogy 4.4 legyen a Forms verzió, de ez nem hozta a várt eredményt, mert a csomagba ugyanúgy belecsomagolja a fordító a UIWebView-t. Erről egy Microsoftos srác blogján olvastam, hogy a visszafelé kompatibilitás miatt a linkerbe is belekellet nyúlniuk (https://devblogs.microsoft.com/xamarin/uiwebview-deprecation-xamarin-forms/), de hoyg hatása legyen az alkalmazásra csak a Xamarin Forms 4.5 verziójától érvényes. Viszont a Xamarin Forms 4.5-ös verziójába behozták Androidhoz az AndroidX libraryt, aminek a hatására egy csomó androidos szívás jött cserébe, mert a visszafelé kompatibilitás miatt az android 10 alatti libekhez is kellenek NuGet csomagok, és az android 10 és feletti AndroidX könyvtárakhoz is kellenek NuGet csomagok, úgyhogy végtelen NuGet installba kezdtem. Nem maradt már végül olyan csomag a Solutionben, amit ne kellett volna a függőségek miatt updatelni. Ezzel csak az volt a baj, hogy mivel minden csomag frissült, a Xamarin Firebase iOS bindingban pedig el van szúrva jelenleg is valami, méghozzá az, hogy az appokat az apple kapásból visszautasítja, mert olyan metódusnevet használ az egyik Xamarin.Firebase.IOS framework, ami blacklistes az apple szerint, éppen ezért a te appodat élből dobják vissza. Erre persze nekünk a PushNotificationök miatt van szükségünk, ezért nem hagyhatjuk figyelmen kívül a funkcionalitást egy kis időre. Szerencsére mások is észrevették, hogy ez a hiba nem jó így, és a hiba már ki is van javítva, de a pull request ott áll még a Xamarin előtt, mert a srác 16 órája még módosítást eszközölt a kódban. (https://github.com/xamarin/GoogleApisForiOSComponents/pull/388https://github.com/xamarin/GoogleApisForiOSComponents/pull/388)

Erre még rájött az, hogyha minden csomagot a Pre-Releasere updatelsz, vagy csak szimplán hagyod a 4.5-ös Formsot, a hozzáfrissített Xamarin.IOSFirebase implementációval hogy iOS-re releasebe forduljon, lazán kifordítja az appot, és miután elindul az app kivágja a usert a főképernyőre. Szerencsére debug windowban ott a hiba, hogy : “dyld: symbol ‘OBJC_CLASS$_GULUserDefaults’ not found, expected in ‘/private/var/containers/Bundle/Application/ID/APPLICATIONNAME/Frameworks/GoogleUtilities.framework/GoogleUtilities’, dyld: symbol ‘OBJC_CLASS$_GULUserDefaults’ not found, expected in ‘/private/var/containers/Bundle/Application/ID/APPLICATIONNAME/Frameworks/GoogleUtilities.framework/GoogleUtilities’, ” ami remélhetőleg szintén javítva lesz ebben a pull requestben, mert ez már a Google frameworkje miatt lehet (abból sejtem, mert ezt már maga az XCode mondja, és nem a VisualStudio/Xamarin)

Úgyhogy egyetlen megoldásunk az maradt, hogy az ügyfélnek úgy tesszük ki testflightra az appokat, hoyg elviseljük az Apple warningjait, hogy deprecated a UIWebView. Aztán mivel ez egy időzített bomba, hamarosan berobban, és majd nem fogják ezeket elfogadni, akkor viszont a Xamarin.IOS.Firebase csomag frissítésétől fogunk függeni.

This content has 4 years. Some of the information in this post may be out of date or no longer work. Please, read this page keeping its age in your mind.

Xamarin Forms 4.5 Update

Sziasztok. Ebben a posztban a Xamarin Forms 4.5 update tapasztalatokat szeretném veletek megosztani. Mivel ez egy nagy update, az AndroidX libekkel, és iOS fronton a UIWebView deprecation javításával, ezért megérdemel egy posztot.

Első lépés: Unloadold az Androidos projektjeidet Windowson.
Lehet hogy ez csak nálam gázos, de amikor a TargetFrameworkot szeretném állítani, belefagy a VisualStudio az állításba. Így én Unloadolom az androidos projektjeimet és átállítom a csoproj fájlban kézzel a target frameworkot. Ez a csproj edit pont kapóra is jön, mert nugeteket is kell hozzáadnunk (nem csak frissítenünk) android esetén.
10-es TargetFramework beállítása XML-ben:

    <TargetFrameworkVersion>v10.0</TargetFrameworkVersion>

Aztán kelleni fognak akövetkező NuGet-ek, adjuk őket hozzá a csproj fájlba a references headnél:

<PackageReference Include="Xamarin.AndroidX.Lifecycle.LiveData" Version="2.1.0-rc1" />
 <PackageReference Include="Xamarin.AndroidX.Browser" Version="1.0.0-rc1" />
 <PackageReference Include="Xamarin.Google.Android.Material" Version="1.0.0-rc1" />
 <PackageReference Include="Xamarin.AndroidX.Legacy.Support.V4" Version="1.0.0-rc1" />

Mentés után reloadolhatjuk a Solution Explorerben a projekteket, érdemes ezután egy Restore NuGet packagest nyomni a Solutionre.

Második lépés: Xamarin Android package update
Mivel nem fogjuk tudni addig feltelepíteni a Xamarin Forms package-t, ameddig nincs fent a latest Xamarin.Android.* csomagból minden, ezért frissítenünk kell azokat is, ha kell egyesével.. Ha van frissítés a Xamarin.AndroidX csomagokhoz, akkor azokat is érdemes frissíteni.

2.5: Nincs frissítés conflict nélkül: Teljesen kikészülök ettől a NuGet helltől, ez függ ettől, az attól.. Lényeg a lényeg: Személyes tapsztalatom szerint, ajánlatos, ha nincs consolidate package a solutionben, és azok csak egy verzióra vannak a 4.5-től. Itt beleértve a Xamarin.Essentials, Xamarin.Forms.Maps csomagot is, amiktől igazán rémálom az update.

3. Lépés: Telepíts ha tudsz! Ideális esetben, Xamarin.Forms csomagon egy frissítés. Ha nem ideális, mert hát miért is lenne az, akkor végigvered egyesével, hogy melyik projekt miért függ ettől a verziótól, és mit kell még frissítened pluszba

This content has 4 years. Some of the information in this post may be out of date or no longer work. Please, read this page keeping its age in your mind.

Xamarin iOS: FirebaseMessaging NuGet frissítés

Hibajelenség: Az alkalmazás lefordul, és deployolódik az iOS-t futtató telefonra, de az indítás után azonnal bezárul, és a debugger nem veszi ezt észre.

Hibaüzenet az OutputWindow-ban

dyld: symbol '_OBJC_CLASS_$_GULUserDefaults' not found, expected in '/private/var/containers/Bundle/Application/ID/APPLICATIONNAME/Frameworks/GoogleUtilities.framework/GoogleUtilities', needed by '/private/var/containers/Bundle/Application/ID/APPLICATIONNAME/Frameworks/FirebaseMessaging.framework/FirebaseMessaging'

Clean solution nem oldja meg a problémát.

Nálam a bin és az obj mappák manuális törlése megoldotta a problémát a DEBUG buildhez, de akinek továbbra is problémája adódik ezzel az próbálja ki a következő módszereket:
https://stackoverflow.com/questions/57131541/issue-with-nuget-package-xamarin-firebase-ios-cloudmessaging-3-1-2

Azonban Release módban ugyanúgy nem működik az alkalmazás.

This content has 4 years. Some of the information in this post may be out of date or no longer work. Please, read this page keeping its age in your mind.

Xamarin Android: SplashScreenActivity létrehozása

Ahhoz, hogy legyen egy betöltő Activitynk, ami nem fehér képernyőt jelnít meg akkor amikor az applikáció először töltődik be, ahhozlétre kell hozni egy SplasActivity.cs-t az alábbiak alapján:

	[Activity(Label = "APPLICATIONNAME", Icon = "@drawable/android_app_icon", Theme = "@style/MainTheme.Splash", MainLauncher = true, NoHistory = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation, ScreenOrientation = ScreenOrientation.Portrait)]

	public class SplashActivity : AppCompatActivity
	{

		public override void OnCreate(Bundle savedInstanceState, PersistableBundle persistentState)
		{
			base.OnCreate(savedInstanceState, persistentState);

		}

		protected override void OnResume()
		{
			base.OnResume();

			var mainIntent = new Intent(Application.Context, typeof(MainActivity));

			if (Intent.Extras != null)
			{
				mainIntent.PutExtras(Intent.Extras);
			}
			mainIntent.SetFlags(ActivityFlags.SingleTop);
			StartActivity(mainIntent);
		}
	}

Az OnResume metódusban át kell adni az intenteket a MainActivitynk számára, hogy pl a Push üzenetek feldolgozásra kerüljenek. Ezekről itt ovlashatsz: https://www.banditoth.hu/2020/01/16/xamarin-android-splashscreenactivity-es-pushnotification-megnyitas-kilott-alkalmazasnal/

A MainActivity Activity attribútumát a következőképpen kell módosítani:

[Activity(Theme = "@style/MainTheme", MainLauncher = false, Exported = true,  ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation, ScreenOrientation = ScreenOrientation.Portrait,
        LaunchMode = LaunchMode.SingleTop)]

Ahogy láthatjuk, a SplashActivitynk az alábbi témát fogja használni: “Theme = “@style/MainTheme.Splash””, ezért létre kell hozni a styles.xml-ben egy új style-t az alábbi alapján:

<style name="MainTheme.Splash" parent ="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowBackground">@drawable/splash_screen</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowActionBar">true</item>
  </style>

Ez a téma háttérként a “@drawable/splash_screen” resource-t fogja használni, ezért ezt is létre kell hozni a drawable mappa alá az alábbi mintára:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
  <item>
    <color android:color="@color/splash_background"/>
  </item>
  <item>
    <bitmap
        android:src="@drawable/icon"
        android:tileMode="disabled"
        android:gravity="center"/>
  </item>
</layer-list>

Az itt használt @color és @drawable iconok változhatnak, csak a bemutatás célját szolgálják.

https://docs.microsoft.com/en-us/xamarin/android/user-interface/splash-screen

This content has 4 years. Some of the information in this post may be out of date or no longer work. Please, read this page keeping its age in your mind.

Xamarin Android: Hibakeresés kikapcsolása Debug build config kivételével

Ahhoz, hogy az ADB-n keresztüli hibakaeresést kikapcsoljuk az Android alkalmazásnál, az Android projekt assemblyinfo.cs kódjába a követekzőt kell beletenni:

#if DEBUG
[assembly: Application(Debuggable=true)]
#else
[assembly: Application(Debuggable=false)]
#endif

Forrás:
https://docs.microsoft.com/en-us/xamarin/android/deploy-test/release-prep/?tabs=windows#protect-the-application

This content has 4 years. Some of the information in this post may be out of date or no longer work. Please, read this page keeping its age in your mind.