728x90
반응형

Dependency 서비스를 이용해 Andriod 쪽에서 아래처럼 처리하는데

 

var sharingIntent = new Intent();

sharingIntent.SetAction(Intent.ActionSend);

..

 

var intent = Intent.CreateChooser(sharingIntent, "sharing");

 

Android.App.Application.Context.StartActivity(intent);

아래와 같은 에러가 발생했습니다.

 

Android.Util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

 

이를 위해선 intent 에 아래 처리를 해주면 됩니다.

 

intent.SetFlags(ActivityFlags.NewTask);

 

var sharingIntent = new Intent();

sharingIntent.SetAction(Intent.ActionSend);

..

 

var intent = Intent.CreateChooser(sharingIntent, "sharing");

intent.SetFlags(ActivityFlags.NewTask);

 

Android.App.Application.Context.StartActivity(intent);

 

 

728x90
반응형
728x90
반응형

API26 이후 부터는 파일경로를 직접적으로 노출하게되면 아래와 같은 에러가 발생됩니다.

 

Android.OS.FileUriExposedException: file:///storage/emulated/0/test.png exposed beyond app through ClipData.Item.getUri()

 

이를 위해선

먼저 AndroidManifest.xml 에 아래 처럼 FileProvider 를 추가하고 Resource 폴더 아래에 xml 폴더를 만들어 file_paths.xml 파일을 추가 생성합니다.

 

<application android:label="QrCodeManager">

<provider android:name="android.support.v4.content.FileProvider" android:authorities="kr.kjun.QrCodeManager.fileprovider" android:exported="false" android:grantUriPermissions="true">

<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"></meta-data>

</provider>

</application>

 

생성된 file_paths.xml 파일에 아래처럼 내용울 추가합니다.

 

<?xml version="1.0" encoding="utf-8" ?>

  <paths xmlns:android="http://schemas.android.com/apk/res/android">

    <external-path name="storage/emulated/0" path="."/>

    <root-path name="root" path="."/>

  </paths>

 

 

여기서 중요한건 <root-path name="root" path="."/> 을 추가하지 않으면 아래와 같은 에러가 발생되니 반드시 추가가 필요합니다.

 

Java.Lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0/test.png

 

 

코드 단에서 사용할때 아래 굵게 표시된 부분처럼 처리하면 된다.

 

var tempFilename = "test.png";

var sdCardPath = Android.OS.Environment.ExternalStorageDirectory.AbsolutePath;

var filePath = System.IO.Path.Combine(sdCardPath, tempFilename);

 

Bitmap bitmap = ..;

using (var fileStream = new FileStream(filePath, FileMode.Create))

{

    bitmap.Compress(Bitmap.CompressFormat.Png, 100, fileStream);

}

bitmap.Dispose();

 

Android.Net.Uri imageUri = null;

 

if (Build.VERSION.SdkInt >= BuildVersionCodes.M)

{

    Java.IO.File file = new Java.IO.File(filePath);

    imageUri = FileProvider.GetUriForFile(this, "kr.kjun.QrCodeManager.fileprovider", file);

}

else

{

    imageUri = Android.Net.Uri.Parse($"file://{sdCardPath}/{tempFilename}");

}

..

 

 

 

 

 

728x90
반응형
728x90
반응형
Xamarin.Forms.Forms.Context 은 현재 사용하지 않으며 

Android.App.Application.Context 으로 변경해야 한다.


728x90
반응형
728x90
반응형

폰에서 로컬 DB 파일을 가지고 처리를 할때

미리 데이터를 담아놓고 처리를 할 필요가 생기는데요

이때 미리 데이터를 담아둔 DB(SQLite) 파일을

앱 설치시 폰에 위치시키는 방법을 소개합니다.

 

먼저 TEXT.db SQLite db  파일을 준비합니다.

준비한 DB 파일을 각 기기별로 아래와 같이 파일을 갖다 놓습니다.

 

Android 는 Asset 폴더에 위치시킵니다.

 

 

iOS 는 Resources 폴더에 위치시킵니다.

 

 

Android 의 MainActivity.cs 에 아래 처럼 코딩합니다.

 

using System.IO;

 

using Android.App;

using Android.Content.PM;

using Android.OS;

using Android.Runtime;

 

namespace ImportDbFile.Droid

{

    [Activity(Label = "ImportDbFile", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]

    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity

    {

        protected override void OnCreate(Bundle savedInstanceState)

        {

            TabLayoutResource = Resource.Layout.Tabbar;

            ToolbarResource = Resource.Layout.Toolbar;

 

            base.OnCreate(savedInstanceState);

 

            Xamarin.Essentials.Platform.Init(this, savedInstanceState);

 

            string path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);

            string dbPath = Path.Combine(path, "TEST.db");

 

            CopyDatabaseIfNotExists(dbPath);

 

            global::Xamarin.Forms.Forms.Init(this, savedInstanceState);

            LoadApplication(new App());

        }

 

        public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)

        {

            Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

 

            base.OnRequestPermissionsResult(requestCode, permissions, grantResults);

        }

 

        /// <summary>

        /// DB 파일을 복사합니다.

        /// </summary>

        /// <param name="dbPath"></param>

        private static void CopyDatabaseIfNotExists(string dbPath)

        {

            if (!File.Exists(dbPath))

            {

                using (var br = new BinaryReader(Application.Context.Assets.Open("TEST.db")))

                {

                    using (var bw = new BinaryWriter(new FileStream(dbPath, FileMode.Create)))

                    {

                        byte[] buffer = new byte[2048];

                        int length = 0;

                        while ((length = br.Read(buffer, 0, buffer.Length)) > 0)

                        {

                            bw.Write(buffer, 0, length);

                        }

                    }

                }

            }

        }

    }

}

 

 

iOS 의 AppDelegate.cs 에 아래 처럼 코딩합니다.

 

using System;

using System.IO;

 

using Foundation;

 

using UIKit;

 

namespace ImportDbFile.iOS

{

    // The UIApplicationDelegate for the application. This class is responsible for launching the

    // User Interface of the application, as well as listening (and optionally responding) to

    // application events from iOS.

    [Register("AppDelegate")]

    public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate

    {

        //

        // This method is invoked when the application has loaded and is ready to run. In this

        // method you should instantiate the window, load the UI into it and then make the window

        // visible.

        //

        // You have 17 seconds to return from this method, or iOS will terminate your application.

        //

        public override bool FinishedLaunching(UIApplication app, NSDictionary options)

        {

            global::Xamarin.Forms.Forms.Init();

 

            string docFolder = Environment.GetFolderPath(Environment.SpecialFolder.Personal);

 

            if (!Directory.Exists(docFolder))

            {

                Directory.CreateDirectory(docFolder);

            }

 

            string dbPath = Path.Combine(docFolder, "TEST.db");

 

            CopyDatabaseIfNotExists(dbPath);

 

            LoadApplication(new App());

 

            return base.FinishedLaunching(app, options);

        }

 

        /// <summary>

        /// 해당 경로에 DB 파일을 복사합니다.

        /// </summary>

        /// <param name="dbPath"></param>

        private void CopyDatabaseIfNotExists(string dbPath)

        {

            if (!File.Exists(dbPath))

            {

                var existingDb = NSBundle.MainBundle.PathForResource("TEST", "db");

                File.Copy(existingDb, dbPath);

            }

        }

    }

}

 

 

DB 파일 복사하기 전

iOS / Android

 

 

 

DB 파일 복사 후

iOS / Android

 

    

 

 

 

소스

https://github.com/kei-soft/ImportDbFile

 

728x90
반응형
728x90
반응형

공공마스크 데이터를 지도에 표시하는 앱입니다.(출시하지 않음)

 

6월 1일 부터 5부제가 없어지니 5부제는 의미가 없어지겠네요

 

현재 Android 만 처리되었고 iOS 도 작업중입니다.^^

 

 

  




소스

https://github.com/kei-soft/GongMask

728x90
반응형
728x90
반응형

하단에 메뉴가 있고 배경이 여러이미지로 슬라이딩되면서 변경되는 화면을 구성하는 방법을 소개한다.


우선 Grid 를 배치하고 Grid 안으로 CarouselView 를 위치하고 좌측 상단에 로고 이미지를

하단에는 메뉴 아이콘을 배치했으며 이미지가 가로로 스크롤이 되도록 CarouselView 의  ItemsLayout 속성을 "HorizontalList" 으로 설정한다.

<?xml version="1.0" encoding="utf-8" ?>

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"

             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"

             xmlns:d="http://xamarin.com/schemas/2014/forms/design"

             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

             mc:Ignorable="d"

             x:Class="SlideImage.MainPage">


    <StackLayout Margin="0" Padding="0" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" BackgroundColor="Black">

        <Grid HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" Margin="0" Padding="0" ColumnSpacing="0" RowSpacing="0" BackgroundColor="White">

            <CarouselView  x:Name="mainView" ItemsLayout="HorizontalList" Margin="0" BackgroundColor="LightYellow" HorizontalScrollBarVisibility="Always">

                <CarouselView.ItemTemplate>

                    <DataTemplate>

                        <Image Source="{Binding ImageSrc}" Aspect="Fill"/>

                    </DataTemplate>

                </CarouselView.ItemTemplate> 

            </CarouselView>


            <Image Source="keisoft_textlogo.png" WidthRequest="100" HeightRequest="30" VerticalOptions="Start" HorizontalOptions="Start" Margin="10,0,0,0"/>


            <StackLayout VerticalOptions="End" Padding="0,0,0,20" HorizontalOptions="Center" Orientation="Horizontal" Spacing="20">

                <Image Source="main_store.png" WidthRequest="60" HeightRequest="60" >

                    <Image.GestureRecognizers>

                        <TapGestureRecognizer Tapped="StoreButton_Clicked"></TapGestureRecognizer>

                    </Image.GestureRecognizers>

                </Image>

                <Image Source="main_menu.png" WidthRequest="60" HeightRequest="60" >

                    <Image.GestureRecognizers>

                        <TapGestureRecognizer Tapped="MenuButton_Clicked"></TapGestureRecognizer>

                    </Image.GestureRecognizers>

                </Image>

                <Image Source="main_order.png" WidthRequest="60" HeightRequest="60" >

                    <Image.GestureRecognizers>

                        <TapGestureRecognizer Tapped="CartButton_Clicked"></TapGestureRecognizer>

                    </Image.GestureRecognizers>

                </Image>

                <Image Source="main_member.png" WidthRequest="60" HeightRequest="60" >

                    <Image.GestureRecognizers>

                        <TapGestureRecognizer Tapped="PersonButton_Clicked"></TapGestureRecognizer>

                    </Image.GestureRecognizers>

                </Image>

            </StackLayout>

        </Grid>

    </StackLayout>

</ContentPage>


여기에 일정 시간 간격으로 이미지가 자동으로 스크롤이 되도록 Timer 를 이용해 처리하면 아래 와 같은 화면이 완성된다.

Device.StartTimer(TimeSpan.FromSeconds(3), (Func<bool>)(() =>
{
    this.mainView.Position = (this.mainView.Position + 1) % 3;
    return true;
}));


자동으로 가로로 스크롤 되며 터치로도 슬라이드 동작을 하면 스크롤 된다.


* 이미지는 저작권이 있으므로 마음대로 쓰면 안됨.


소스

https://github.com/kei-soft/Slide-Image

728x90
반응형
728x90
반응형
 
KCP 가입완료 후에는 아임포트관리자페이지 에서 KCP에서 발급받으신 실 상점정보로 PG설정후 KCP측으로 카드사 심사 진행 부탁 드립니다. 
  
[NHN KCP 테스트모드 - 일반결제 PG설정방법]
 
1. 아임포트관리페이지( https://admin.iamport.kr) 회원가입(로그인) 후 > 시스템 설정 > PG설정(일반결제 및 정기결제) > PG사 "NHN KCP(엔에이치엔한국사이버결제)" 선택하시고,
    테스트모드 [ON] 상태에서 [전체저장] 버튼을 클릭 해 주세요. 

  <설정 화면 예시>   

2. 아임포트 웹훅(Notification URL) 설정방법(자체 개발시) 

    - 아임포트 Webhook을 사용함으로써 아임포트 서버에 저장된 데이터를 서버에 동기화하고 네트워크 불안정성을 보완할 수 있습니다.
    - 설정 방법 : 웹훅 설정 매뉴얼 https://docs.iamport.kr/tech/webhook 링크 내용 참고하시어
                         아임포트관리자페이지 > 시스템설정 > 웹훅(Notification) 설정 메뉴에서 "웹훅(Notification) 발송 공통 URL" 항목에 설정 해 줍니다. 
  <설정 화면 예시>  
  

 

3. 결제 연동(API개발시) 
 - 결제연동 매뉴얼(통합) : https://docs.iamport.kr/ 
 - 일반 인증결제 연동 매뉴얼 : https://docs.iamport.kr/implementation/payment
 - API 문서 : https://api.iamport.kr/   
 - 참고 : 워드프레스 플러그인으로 이용중이신 경우 https://docs.iamport.kr/wordpress/introduction 참고하시기 바랍니다.




 
[NHN KCP 테스트모드 - 정기결제 PG설정방법]  

 1. 아임포트관리페이지( https://admin.iamport.kr)  > 시스템 설정 > PG설정(일반결제 및 정기결제) >  PG사 "NHN KCP 빌링결제 (엔에이치엔한국사이버결제)" 선택하고 테스트모드 [ON] 상태에서 [전체저장] 버튼을 클릭 해 주세요.  
 
 - 참고 : 일반인증결제와 정기결제 모두 이용하시는 경우 기본PG 아래 탭 "+PG사추가"를 클릭하시어 추가PG로 설정 하시기 바랍니다.
             (동일PG사를 이용하셔도 아임포트에 PG설정을 2개 이상하게 되므로 아임포트 복수PG서비스로 적용되어 비용(부가세포함 11만원/최초 1회) 발생되니 이용에 참고 부탁 드립니다.
 - 복수PG이용시 속성 사용 방법 : https://docs.iamport.kr/tech/pg-parameter
 - KCP 테스트용 빌링(정기)결제 사이트코드 : BA001
 
<설정 화면 예시>

 
2. 아임포트 웹훅(Notification URL) 설정방법(자체 개발시)
 - 일반인증결제 방법 과 동일하게 설정 해 주시면 됩니다.

3. 결제 연동
 - 빌링키 발급을 위한 결제창 호출은 일반결제시와 동일하나 customer_uid파라메터만 하나 추가된다고 이해하시면 됩니다.  
 
 - API 문서 : https://api.iamport.kr/
 - 참고 : 워드프레스 플러그인으로 이용중이신 경우 https://docs.iamport.kr/wordpress/woocommerce-subscription 참고하시기 바랍니다.  


728x90
반응형
728x90
반응형

WebView 를 쓰게되면 iOS 배포시 에서 아래와 같은 메일이 온다.

(Renderer 를 사용할때 WkWebViewRenderer 을 사용해도 마찬가지)

Dear Developer,

We identified one or more issues with a recent delivery for your app, "***" 1.0.0 (12). Your delivery was successful, but you may wish to correct the following issues in your next delivery:

ITMS-90809: Deprecated API Usage - Apple will no longer accept submissions of new apps that use UIWebView as of April 30, 2020 and app updates that use UIWebView as of December 2020. Instead, use WKWebView for improved security and reliability. Learn more (https://developer.apple.com/documentation/uikit/uiwebview).

After you’ve corrected the issues, you can upload a new binary to App Store Connect.

Best regards,

The App Store Team


우선 이내용이 있다고해서 배포가 안되는건 아니다.

App Store 에 배포는 가능하지만 거슬린다면 아래처럼 진행하면 된다


iOS 프로젝트 속성 > iOS 빌드에서 링커동작을 'Link All' 로 선택하고

추가  mtouch 인수에 '--optimize=experimental-xforms-product-type

값을 넣고 배포하면 문제가 해결된다.




참고

https://devblogs.microsoft.com/xamarin/uiwebview-deprecation-xamarin-forms/

https://docs.microsoft.com/ko-kr/xamarin/xamarin-forms/user-interface/webview?tabs=windows#uiwebview-deprecation-and-app-store-rejection-itms-90809

728x90
반응형
  1. 앱초보 2020.10.21 14:36

    관리자의 승인을 기다리고 있는 댓글입니다

728x90
반응형

1. POPUP – RG.PLUGINS.POPUP
A lot of times when developing your applications, you are required to create a kind of popup as a message box or confirmation dialog. The best plugin I have seen and used over time is the Rg.Plugins.Popup.

This plugin is a cross platform plugin that allows you to open pages as popup in your Android, iOS and UWP projects.

Before you can use this plugin, you have to do some initialization in each platform you are targeting. This initialization must come before the initialization of Xamarin.Forms.

To see how to implement this plugin, click here.

2. ESSENTIALS – XAMARIN.ESSENTIALS
There are basic and essential implementations that are required for your application to work seamlessly such as checking for connectivity, getting device information, geolocation and lots more.

The folks at Microsoft have made all these possible in a single plugin called Xamarin Essentials. You get this plugin by default every time you create a new project.

For example, see how easy it is to get geolocation from the device with few lines of code. The only extra step is to set the permission required for the features you are implementing.

try
{
var location = await Geolocation.GetLastKnownLocationAsync();
if (location != null)
{
Console.WriteLine($"Latitude: {location.Latitude}, Longitude: {location.Longitude}, Altitude: {location.Altitude}");
}
}
catch (Exception ex)
{
// Unable to get location
}
view rawgeolocation.cs hosted with ❤ by GitHub

To see how implement geolocation and use it with a map, click here.

3. MODEL-VIEW-VIEWMODEL – MVVM HELPER
The Model-View-ViewModel (MVVM) pattern helps to cleanly separate the business and presentation logic of an application from its user interface (UI).

Maintaining a clean separation between application logic and the UI helps to address numerous development issues and sometimes implementing this pattern can prove difficult and mundane for both new and experience developers.

MVVM Helpers make the implementation of MVVM pattern easy and less time consuming so that you can focus more on the business logic.

An example of the helper I commonly use is the is the SetPropery & GetProperty helpers which takes away the stress of implementing INotifyPropertyChanged.

Check out this video here detailing how to implement MVVM Helpers.

4. IMAGE LOADING – FFIMAGELOADING
FFImageLoading is a cross platform image library for loading images quickly and easily. It supports image file formats such as GIF, SVG and WebP.

One interesting feature of this plugin is caching. If you have multiple image controls that are using the same image source, the plugin will load the source image once and use the cached version for the rest thereby reducing data consumption of the app.

You can perform some fade-in animations with your images and also apply transformations such as crop, blur, grayscale, round corner, flip and rotation.

5. MONETIZATION – IN-APP BILLING PLUGIN
Often times you need to integrate monetization into your mobile apps in order to generate revenue. This is usually by introducing in-app purchases in form of remove ads feature, buying in-game currency or upgrading to the Pro version of the app.

The In-App Billing Plugin supports three types of in-app purchase. Consumables, Non-Consumables and Subscriptions.
 Consumables can be described as any one-time service within the app. For example, in-game currency or extra health.
• Non-Consumables are items that can only be purchased once such as removing ads, books, game levels, and additional app functionality
• Subscriptions are auto-renewable payments which can be monthly or yearly and non-renewable subscription that expires after a set amount of time.

6. CRASH REPORT – APP CENTER
App Center contains a lot of features to help you with your mobile app development. The two major features I have used over the years are App Center Crashes and App Center Analytics.

App Center Crashes will automatically generate a crash log every time your app crashes. Collecting crashes work for apps in beta and live apps.

To implement crash reporting and analytics, you need app secrets which you can get by registering on App Center Website. Note that if you are targeting more than one platform, you will need to create the application for each platform to get app secrets for each platform.

In order to use App Center Plugin, you have to install the plugin into your projects and then proceed to your App.xaml.cs to initialize the plugin by supplying the app secret for each platform.
You can start tracking errors like this within your code.

7. CACHING – MONKEY CACHE
Monkey Cache provides easy ways to cache any data structure for a specific amount of time. For example, you are making a web request and you get some response back from the server, you want the ability to cache this data in case you go offline, but also you need it to expire after a certain number of minutes or hours. Monkey Cache provides you with these capabilities.

To set up Monkey Cache, first, select an implementation of Monkey Cache that you would like (LiteDB, SQLite, or FileStore). Install the specific NuGet for that implementation, which will also install the base MonkeyCache library.

You will require to set a custom Application ID for your application so that the Cache engine can uniquely identify your application.

8. AUDIO & VIDEO – MEDIA MANAGER PLUGIN
Media content is the future of content and there is a need to put this into consideration when developing mobile applications.

MediaManager Plugin is a cross platform Xamarin plugin that simplifies access to the device’s native media functions and make it easy for your user to interact with audio and video in your mobile apps.

The features include native playback of media files from both local and remote sources, notifications, media controls and playback status. It also allows you to add multiple media items for sequential playback.

This plugin requires initialization in each of the platform you are targeting.

9. ANIMATION – XAMARIN.FORMS.LOTTIE
Lottie is a cross platform library, which allows you to run animations within your applications.

These animations are defined in a JSON file containing all the details of colors, shapes and transforms. You need Adobe After Effects in order to create these JSON files, however, there are lots of free lottie animation out there that are shared by designers.

To get started, first install the Nuget package to your projects and then initialize it in your respective projects. In order to show an animation, you need to put the After Effects JSON file in your Assets (Android) or Resources (iOS) folder and then load it into the animation view.

10. GRADIENT & CURVED LAYOUT – PANCAKE VIEW
App designs usually contain views with gradients, borders, rounded corners and shadows. Developers implementing these designs in Xamarin Forms require layouts that support these specifications.

Pancake View is a plugin that supports gradients, borders, rounded corners and shadows. Implementing Pancake View is very simple and straightforward. First, install the plugin in your projects and then tell your XAML page where it can find the Pancake View by adding the namespace to your XAML code.

You can now call the Pancake View Control and add properties the suits the design you are working with.

11. CONTENT ANIMATION – SHARED TRANSITION ANIMATION
Animation has a way of spicing up the user experience of your mobile application. Micro-interactions, transitions, and in-app animations are usually used to explain the logic of an app to a user and improve the overall app usability.

Shared Transition Plugin allows you to implement shared element transitions by connecting common elements from one page to another. A shared element transition determines how elements that are present in two pages transition between them.

12. FILE PICKER
Your application may require the use of file from the user’s device for viewing, editing and other file operations.

File Picker Plugin is a simple cross platform plugin that allows you to pick files and work with them. You can select any file type or set the allowed type in order to limit the files that can be selected.

13. FINGERPRINT AUTHENTICATION – FINGERPRINT PLUGIN
Fingerprint authentication provide applications with an alternative to the conventional username and password method used for user authentication and makes it possible for your application to implement security that is less intrusive.

A fingerprint must already be enrolled with the device for the user to be authenticated successfully.

Xamarin Fingerprint Plugin is a cross platform plugin that allows you to authenticate users with the enrolled fingerprint on their devices. To start using the plugin, you must initialize and request the necessary permissions in all the platforms you are targeting.

14. CHARTS – MICROCHARTS PLUGIN
Chart in mobile applications is a great way to present a clear overview of numerical data and show the relationship of such data. Microcharts is a selection of common charts that are easy to use, visually pleasing, and provides ready-to-use charts in your Xamarin Forms Applications.

There is a wide range of charts included in Microcharts Plugin for you to choose from such as the Bar Chart, Pie Chart, Line Chart, Point Chart and others. You can select the chart that best fit your data within your application.

BONUS: MATHEMATICS – CSHARP MATH
Has there ever been a need to display mathematical formulae in your application but cannot find any tool to help you? CSharp Math is what you are looking for. This is a library that allows you to display mathematical expressions within your mobile applications.

It makes use of LaTeX engine to convert plain text into high-quality mathematical expression for display on your mobile app screen.

It works perfectly in both XAML and C# code.

15. GRAPHICS – SKIASHARP PLUGIN
Many apps require special controls that are not part of the native kit and to achieve this, there is a need to render 2D graphics directly and natively on the app.

SkiaSharp is a cross platform library that allows to directly draw on the UI canvas and makes it possible to create complete custom controls. It is a 2D graphics library that provides a rich API to basically draw fancy things on the UI canvas.

Questions of the Day.
1. What other nuget packages do you use that are not mentioned? Let me know in the comments below.
2. Which of these nuget package would you like me to implement in a future video? Let me know in the comments below.

출처 : https://devcrux.com/blog/15-nuget-packages-for-xamarin-forms-and-net/

728x90
반응형
728x90
반응형

iOS 프로젝트를 정리하고 재 빌드하면 된다. 끝.

도대체 왜 이런건지 알수가 없네..;;

728x90
반응형

+ Recent posts