728x90
반응형

https://docs.microsoft.com/ko-kr/xamarin/android/platform/android-manifest

 

 

 

Android 매니페스트 작업

  • 2018. 02. 05.
  • 읽는 9 걸림
  •  

AndroidManifest.xml Android 플랫폼에서 Android 대한 애플리케이션의 기능 요구 사항을 기술할 있게 해주는 강력한 파일입니다하지만 이를 사용한 작업은 쉽지 않습니다. Xamarin.Android 매니페스트 자동 생성을 위해 사용되는 사용자 지정 특성을 클래스에 추가하여 이러한 어려움을 최소화하는 도움을 줍니다목표는 사용자의 99% AndroidManifest.xml 수동으로 수정할 필요가 없도록 하는 것입니다.

AndroidManifest.xml 빌드 프로세스 중에 생성되며Properties/AndroidManifest.xml 내에서 발견된 XML 사용자 지정 특성으로부터 생성된 XML 병합됩니다 결과로 병합된 AndroidManifest.xml obj 하위 디렉터리에 저장됩니다. 예를 들어 디버그 빌드의 경우에는 obj/Debug/android/AndroidManifest.xml 저장됩니다병합 프로세스는 간단합니다. 코드 내에서 사용자 지정 특성을 사용하여 XML 요소를 생성하고 요소를 AndroidManifest.xml 삽입합니다.

기본 사항

컴파일 시간에 어셈블리에서 작업으로부터 파생되고 여기에 [Activity] 특성이 선언된 abstract 클래스를 스캔합니다그런 이러한 클래스 특성을 사용해서 매니페스트를 빌드합니다예를 들어, 다음 코드를 고려하세요.

C#복사

namespace Demo

{

    public class MyActivity : Activity

    {

    }

}

 

그러면 AndroidManifest.xml 아무 생성되지 않습니다<activity/> 요소를 생성하려면 [Activity] 사용자 지정 특성을 사용해야 합니다.

C#복사

namespace Demo

{

    [Activity]

    public class MyActivity : Activity

    {

    }

}

 

예에서는 다음 xml 조각이 AndroidManifest.xml 추가됩니다.

XML복사

<activity android:name="md5a7a3c803e481ad8926683588c7e9031b.MainActivity" />

 

[Activity] 특성은 abstract 형식에 영향을 주지 않으며abstract 형식은 무시됩니다.

작업 이름

Xamarin.Android 5.1부터 작업의 형식 이름은 내보내려는 형식의 정규화된 어셈블리 이름인 MD5SUM 기준으로 합니다이렇게 하면 서로 다른 개의 어셈블리에서 동일한 정규화된 이름을 제공할 있으며, 패키징 오류가 발생하지 않습니다. (Xamarin.Android 5.1 이전에는 작업의 기본 형식 이름이 소문자 네임스페이스 클래스 이름으로부터 생성되었습니다.)

기본값을 재정의하고 작업 이름을 명시적으로 지정하려면 Name 속성을 사용하십시오.

C#복사

[Activity (Name="awesome.demo.activity")]

public class MyActivity : Activity

{

}

 

예제는 다음 xml 조각을 생성합니다.

XML복사

<activity android:name="awesome.demo.activity" />

 

 참고

이렇게 이름을 바꾸면 런타임에 형식 조회 속도가 느려질 있기 때문에 버전과의 호환성을 위해서만 Name 속성을 사용해야 합니다작업의 기본 형식 이름이 소문자 네임스페이스 클래스 이름 기반인 것으로 예상되는 레거시 코드가 있을 , 호환성 유지 관리에 대한 팁은 Android 호출 가능 래퍼 이름 지정 참조하십시오.

작업 제목 표시줄

기본적으로 Android 애플리케이션이 실행될 애플리케이션에 제목 표시줄을 제공합니다여기에 사용되는 값은 /manifest/application/activity/@android:label입니다대부분의 경우 값은 클래스 이름과 다릅니다제목 표시줄에 레이블을 지정하려면 Label 속성을 사용하십시오예를 들어:

C#복사

[Activity (Label="Awesome Demo App")]

public class MyActivity : Activity

{

}

 

예제는 다음 xml 조각을 생성합니다.

XML복사

<activity android:label="Awesome Demo App"

          android:name="md5a7a3c803e481ad8926683588c7e9031b.MainActivity" />

 

애플리케이션 선택기에서 시작 가능

기본적으로 작업은 Android 애플리케이션 시작 프로그램 화면에 표시되지 않습니다왜냐하면 애플리케이션에서 수행되는 작업이 많을 가능성이 높은데 이것들에 대해 모두 하나씩 아이콘을 만들지는 않기 때문입니다애플리케이션 시작 프로그램에서 시작할 있는 항목을 지정하려면 MainLauncher 속성을 사용하십시오예를 들어:

C#복사

[Activity (Label="Awesome Demo App", MainLauncher=true)]

public class MyActivity : Activity

{

}

 

예제는 다음 xml 조각을 생성합니다.

XML복사

<activity android:label="Awesome Demo App"

          android:name="md5a7a3c803e481ad8926683588c7e9031b.MainActivity">

  <intent-filter>

    <action android:name="android.intent.action.MAIN" />

    <category android:name="android.intent.category.LAUNCHER" />

  </intent-filter>

</activity>

 

작업 아이콘

기본적으로 작업에는 시스템에서 제공된 기본 프로그램 아이콘이 부여됩니다사용자 지정 아이콘을 사용하려면 먼저 .png 리소스/드로어블 추가하고 빌드 작업을 AndroidResource 설정한  Icon 속성을 사용하여 사용할 아이콘을 지정합니다예를 들어:

C#복사

[Activity (Label="Awesome Demo App", MainLauncher=true, Icon="@drawable/myicon")]

public class MyActivity : Activity

{

}

 

예제는 다음 xml 조각을 생성합니다.

XML복사

<activity android:icon="@drawable/myicon" android:label="Awesome Demo App"

          android:name="md5a7a3c803e481ad8926683588c7e9031b.MainActivity">

  <intent-filter>

    <action android:name="android.intent.action.MAIN" />

    <category android:name="android.intent.category.LAUNCHER" />

  </intent-filter>

</activity>

 

사용 권한

Android 매니페스트에 권한을 추가할 (Android 매니페스트에 권한 추가 참조), 이러한 권한은 Properties/AndroidManifest.xml 기록됩니다 들어 INTERNET 권한을 설정하면 다음 요소가 Properties/AndroidManifest.xml 추가됩니다.

XML복사

<uses-permission android:name="android.permission.INTERNET" />

 

디버그 빌드는 디버그를 쉽게 수행하기 위해 일부 권한을 자동으로 설정합니다(INTERNET  READ_EXTERNAL_STORAGE). – 이러한 설정은 생성된 obj/Debug/android/AndroidManifest.xml에만 설정되고필요한 권한 설정에 사용하도록 표시되지 않습니다.

예를 들어 obj/Debug/android/AndroidManifest.xml에서 생성된 매니페스트 파일을 검사할 경우 다음과 같이 추가된 권한 요소가 표시될 있습니다.

XML복사

<uses-permission android:name="android.permission.INTERNET" />

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

 

매니페스트의 릴리스 빌드 버전(obj/Debug/android/AndroidManifest.xml)에서 이러한 권한은 자동으로 구성되지 않습니다릴리스 빌드로 전환하여 디버그 빌드에서 사용 가능했던 권한이 앱에서 손실되는 것으로 확인되면, 앱의 필요한 권한 설정에서 권한을 명시적으로 설정했는지 확인합니다(Mac Visual Studio 빌드 > Android 애플리케이션 또는 Visual Studio 속성 > Android 매니페스트 참조).

고급 기능

의도된 작업 기능

Android 매니페스트는 작업 기능을 설명할 있는 방법을 제공합니다 작업은 의도  [IntentFilter] 사용자 지정 특성을 통해 수행됩니다IntentFilter 생성자로 작업에 적합한 조치와 Categories 속성최소한 하나 이상의 작업을 제공해야 합니다(작업이 생성자에 제공되는 이유). [IntentFilter] 여러 제공될 있으며, 사용 때마다 <activity/> 내에 <intent-filter/> 요소가 개별적으로 생성됩니다예를 들어:

C#복사

[Activity (Label="Awesome Demo App", MainLauncher=true, Icon="@drawable/myicon")]

[IntentFilter (new[]{Intent.ActionView},

        Categories=new[]{Intent.CategorySampleCode, "my.custom.category"})]

public class MyActivity : Activity

{

}

 

예제는 다음 xml 조각을 생성합니다.

XML복사

<activity android:icon="@drawable/myicon" android:label="Awesome Demo App"

          android:name="md5a7a3c803e481ad8926683588c7e9031b.MainActivity">

  <intent-filter>

    <action android:name="android.intent.action.MAIN" />

    <category android:name="android.intent.category.LAUNCHER" />

  </intent-filter>

  <intent-filter>

    <action android:name="android.intent.action.VIEW" />

    <category android:name="android.intent.category.SAMPLE_CODE" />

    <category android:name="my.custom.category" />

  </intent-filter>

</activity>

 

Application 요소

Android 매니페스트는 또한 전체 애플리케이션에 대해 속성을 선언할 있는 방법을 제공합니다 작업은 <application>  상대 요소인 Application 사용자 지정 특성을 통해 수행됩니다이러한 설정은 작업별 설정이 아닌 애플리케이션 전체(어셈블리 전체) 적용되는 설정입니다일반적으로 전체 애플리케이션에 대해 <application> 속성을 선언하고 작업별 기준으로 이러한 설정을 (필요에 따라) 재정의합니다.

예를 들어  Application 특성이 AssemblyInfo.cs 추가되어 애플리케이션을 디버그할 있고, 사용자가 읽을 있는 이름이 My App이며, 모든 작업의 기본 테마로 Theme.Light 스타일이 사용됨을 나타냅니다.

C#복사

[assembly: Application (Debuggable=true,   

                        Label="My App",   

                        Theme="@android:style/Theme.Light")]

 

선언은 다음 XML 조각을 obj/Debug/android/AndroidManifest.xml 생성합니다.

XML복사

<application android:label="My App"

             android:debuggable="true"

             android:theme="@android:style/Theme.Light"

                ... />

 

예에서 앱의 모든 작업은 기본적으로 Theme.Light 스타일로 지정됩니다작업 테마를 Theme.Dialog 설정하면 해당 작업에만 Theme.Dialog 스타일이 사용되고, 앱에 있는 다른 모든 작업에는 기본적으로 <application> 요소에 설정된 대로 Theme.Light 스타일이 적용됩니다.

Application 요소는 <application> 특성을 구성하기 위한 유일한 방법이 아닙니다또한 특성을 Properties/AndroidManifest.xml <application> 요소에 직접 삽입할 있습니다이러한 설정은 obj/Debug/android/AndroidManifest.xml 있는 최종 <application> 요소에 병합됩니다Properties/AndroidManifest.xml 내용은 항상 사용자 지정 특성으로 제공되는 데이터를 재정의합니다.

<application> 요소에는 여러 가지 애플리케이션 전체 특성을 구성할 있습니다. 이러한 설정들에 대한 자세한 내용은 ApplicationAttribute 공용 속성 참조하십시오.

728x90
반응형
728x90
반응형

 

아래와 같은 에러가 발생되었다

 

 

1>C:\Users\kjun\.nuget\packages\xamarin.forms\5.0.0.1931\buildTransitive\Xamarin.Forms.targets(188,5): error XF005: The $(TargetFrameworkVersion) for COVID.Android (v9.0) is less than the minimum required $(TargetFrameworkVersion) for Xamarin.Forms (10.0). You need to increase the $(TargetFrameworkVersion) for COVID.Android.

 

 

확인해보니 Android 의 프로젝트에서 속성에서

Android 매니패스트 의  대상 Android 버전을 Android 10.0 으로 올렸는데

애플리케이션Android 버전을 사용하여 컴파일:(대상프레임워크) 부분을 올리지 않고 9.0 으로 둔게 문제 였다

이를 Android 10.0 으로 바꾸니 오류가 사라졌다.

 

728x90
반응형
728x90
반응형

iOS 에서 위치 정보를 허용하고 특정 API 를 호출하는데 아래처럼 에러가 발생되었다.

 

System.Net.Http.HttpRequestException: 'The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.'

 

위에러는 info.list 파일에 아래 내용을 추가하면 해결된다.

 

 

<key>NSAppTransportSecurity</key>

 <dict>

   <key>NSAllowsArbitraryLoads</key>

   <true/>

 </dict>

 

 

728x90
반응형
728x90
반응형

Html 문자열 나타내기

 

 

<Label Text="{Binding cntt}" FontSize="Body" TextColor="Black" Margin="10" TextType="Html"/>

 

 

728x90
반응형
728x90
반응형

iOS 에서 api를 호출하는데 앱이 그냥 강제 종료가 되는 이슈가 있어서 확인해 보니

아래와 같은 에러가 발생되었다.

 

System.AggregateException: One or more errors occurred. (The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.) ---> System.Net.Http.HttpRequestException: The resource could not be loaded because the App Transport Security policy requires the use of a secure connection. ---> Foundation.NSErrorException: Error Domain=NSURLErrorDomain Code=-1022 "The resource could not be loaded because the App Transport Security policy requires the use of a secure connection." UserInfo={NSLocalizedDescription=The resource could not be loaded because the App Transport Security policy requires the use of a secure connection., NSErrorFailingURLStringKey=http://store261.softp.kr/api/storemaster_list.asp, NSErrorFailingURLKey=http://store261.softp.kr/api/storemaster_list.asp, _NSURLErrorRelatedURLSessionTaskErrorKey=(

    "LocalDataTask <36626D02-EB1C-40C4-A40A-F66913B92860>.<1>"

),

 _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <36626D02-EB1C-40C4-A40A-F66913B92860>.<1>, NSUnderlyingError=0x280e16490 {Error Domain=kCFErrorDomainCFNetwork Code=-1022 "(null)"}}

   --- End of inner exception stack trace ---

  at System.Net.Http.NSUrlSessionHandler.SendAsync (System.Net.Http.HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) [0x001d4] in /Library/Frameworks/Xamarin.iOS.framework/Versions/14.4.1.3/src/Xamarin.iOS/Foundation/NSUrlSessionHandler.cs:527

  at System.Net.Http.HttpClient.FinishSendAsyncBuffered (System.Threading.Tasks.Task`1[TResult] sendTask, System.Net.Http.HttpRequestMessage request, System.Threading.CancellationTokenSource cts, System.Boolean disposeCts) [0x0017e] in /Library/Frameworks/Xamarin.iOS.framework/Versions/Current/src/Xamarin.iOS/external/corefx/src/System.Net.Http/src/System/Net/Http/HttpClient.cs:506

   --- End of inner exception stack trace ---

  at System.Threading.Tasks.Task.ThrowIfExceptional (System.Boolean includeTas

kCanceledExceptions) [0x00013] in /Library/Frameworks/Xamarin.iOS.framework/Versions/Current/src/Xamarin.iOS/external/corert/src/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs:2029

  at System.Threading.Tasks.Task`1[TResult].GetResultCore (System.Boolean waitCompletionNotification) [0x0002b] in <3fe48c4c600840c0ba57ff7c65150717>:0

  at System.Threading.Tasks.Task`1[TResult].get_Result () [0x0000f] in <3fe48c4c600840c0ba57ff7c65150717>:0

  at MemberShip.Helper.GetPostData[T] (System.String url) [0x00011] in <8a457d6bb9d24b0c95cd15e165d4d34f>:0

---> (Inner Exception #0) System.Net.Http.HttpRequestException: The resource could not be loaded because the App Transport Security policy requires the use of a secure connection. ---> Foundation.NSErrorException: Error Domain=NSURLErrorDomain Code=-1022 "The resource could not be loaded because the App Transport Security policy requires the use of a secure connection." UserInfo={NSLocalizedDescription=The resource could not be loaded because the App Trans

port Security policy requires the use of a secure connection., NSErrorFailingURLStringKey=http://store261.softp.kr/api/storemaster_list.asp, NSErrorFailingURLKey=http://store261.softp.kr/api/storemaster_list.asp, _NSURLErrorRelatedURLSessionTaskErrorKey=(

    "LocalDataTask <36626D02-EB1C-40C4-A40A-F66913B92860>.<1>"

), _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <36626D02-EB1C-40C4-A40A-F66913B92860>.<1>, NSUnderlyingError=0x280e16490 {Error Domain=kCFErrorDomainCFNetwork Code=-1022 "(null)"}}

   --- End of inner exception stack trace ---

  at System.Net.Http.NSUrlSessionHandler.SendAsync (System.Net.Http.HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) [0x001d4] in /Library/Frameworks/Xamarin.iOS.framework/Versions/14.4.1.3/src/Xamarin.iOS/Foundation/NSUrlSessionHandler.cs:527

2020-12-16 00:02:48.508 MemberShip.iOS[1478:1643755]

  at System.Net.Http.HttpClient.FinishSendAsyncBuffered (System.Threading.Tasks.Task`1[TResult] sendTask, System.Net.Http.HttpRequestMe

ssage request, System.Threading.CancellationTokenSource cts, System.Boolean disposeCts) [0x0017e] in /Library/Frameworks/Xamarin.iOS.framework/Versions/Current/src/Xamarin.iOS/external/corefx/src/System.Net.Http/src/System/Net/Http/HttpClient.cs:506 <---

 

 

위 에러의 해결 방법은

Info.plist 파일에 아래 내용을 추가하면된다.

 

 

<key>NSAppTransportSecurity</key>

<dict>

  <key>NSAllowsArbitraryLoads</key>

  <true />

</dict>

 

 

728x90
반응형
728x90
반응형

API 를 호출하는 도중에 아래와 같은 에러가 발생되었다.

 

System.AggregateException: 'One or more errors occurred. (Cleartext HTTP traffic to test.kjun.kr not permitted)'

 

 

위 에러는 해결 방법은 아래와 같다

 

 

Android 프로젝트의 Resources 폴더에 xml 폴더를 만들고 그 안에 network_security_config.xml 파일을 만든다

내용은 이렇게..

 

 

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

<network-security-config>

  <base-config cleartextTrafficPermitted="true">

    <trust-anchors>

      <certificates src="system" />

    </trust-anchors>

  </base-config>

</network-security-config>

 

 

이제 Android 프로젝트의 Properties 의 AndroidManifest.xml 파일에서 아래 굵은 부분을 추가한다.

 

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

<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="kr.kjun.membership" android:installLocation="auto">

<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="28" />

<application android:label="MemberShip" android:theme="@style/MainTheme"

                 android:networkSecurityConfig="@xml/network_security_config"></application>

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<uses-permission android:name="android.permission.INTERNET" />

<uses-permission android:name="android.permission.CAMERA" />

</manifest>

 

이렇게 처리하면 발생했던 에러는 말끔히 사라진다.

 

안드로이드 버전에 따라 해결방법이 다른거 같은데 아래 링크 참고~

https://stackoverflow.com/questions/54818098/cleartext-http-traffic-not-permitted

728x90
반응형
728x90
반응형

ListView 를 쓸때 iOS 는 마지막에 약 2줄 정도가 비어서 보이게 된다.

이때 ListView 속성의 Footer 를 공백으로 주면 해결된다.

<ListView SeparatorColor="Gray" SeparatorVisibility="Default" BackgroundColor="Transparent" Footer="">

728x90
반응형
728x90
반응형

iOS

 

github.com/xamarin/GoogleApisForiOSComponents/blob/master/docs/Firebase/CloudMessaging/GettingStarted.md

 

xamarin/GoogleApisForiOSComponents

Contribute to xamarin/GoogleApisForiOSComponents development by creating an account on GitHub.

github.com

xamarinlatino.com/xamarin-forms-firebase-cloud-messaging-ios-setup-1961a91d4055

 

Xamarin Forms & Firebase Cloud Messaging: iOS Setup

En mis últimas publicaciones, he hablado de cómo integrar OneSignal (una plataforma que facilita el envío de Push Notifications a…

xamarinlatino.com

docs.microsoft.com/ko-kr/xamarin/ios/platform/user-notifications/deprecated/remote-notifications-in-ios

 

IOS의 푸시 알림 - Xamarin

이 문서에서는 iOS 9 및 이전 버전에서 푸시 알림을 사용 하는 방법을 설명 합니다. 인증서에 대해 설명 하 고 APNS (Apple Push Notification Gateway Service) 등에 등록 합니다.

docs.microsoft.com

Android

github.com/iBobb/xamarin_firebaseapi

 

iBobb/xamarin_firebaseapi

An example project for using the newest APIs to send push notifications using the Firebase - iBobb/xamarin_firebaseapi

github.com

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Android.App;
using Android.Content;
using Android.Graphics;
using Android.Media;
using Android.OS;
using Android.Runtime;
using Android.Support.V4.App;
using Android.Util;
using Android.Views;
using Android.Widget;
using Firebase.Messaging;

namespace XamarinFirebaseExample.Droid
{
    [Service]
    [IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT" })]
    public class MyFirebaseMessagingService : FirebaseMessagingService
    {
        private const string defaultNotificationTitle = "App name";
        private const string newsChannelId = "1"; // not sure I just use 1 you should be able to use anything as long as its unique per channel
        private const string newsChannelDescription = "Channel name shown to user e.g. News";
        private long[] vibrationPattern = { 500, 500, 500, 500, 500, 500, 500, 500, 500 };
        private NotificationManager notificationManager;

        public override void OnNewToken(string newToken)
        {
            base.OnNewToken(newToken);
            Log.Info("MyFirebaseMessagingService", "Firebase Token: " + newToken);
            saveRegistrationToApp(newToken);
        }

        public override void OnMessageReceived(RemoteMessage remoteMessage)
        {
            base.OnMessageReceived(remoteMessage);
            // depending on how you send the notifications you might get the message as per documentation
            // using remoteMessage.getNotification().getBody()
            var message = remoteMessage.Data["message"];
            Log.Debug("MyFirebaseMessagingService", "From:    " + remoteMessage.From);
            Log.Debug("MyFirebaseMessagingService", "Message: " + message);

            sendNotification(defaultNotificationTitle, message);
        }

        private void sendNotification(string title, string message)
        {
            var intent = new Intent(this, typeof(MainActivity));
            intent.AddFlags(ActivityFlags.SingleTop);
            var pendingIntent = PendingIntent.GetActivity(this, 0, intent, PendingIntentFlags.OneShot);
            notificationManager = (NotificationManager)GetSystemService(Context.NotificationService);

            if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.O)
            {
                NotificationImportance importance = NotificationImportance.High;
                NotificationChannel notificationChannel = new NotificationChannel(newsChannelId, newsChannelDescription, importance);
                notificationChannel.EnableLights(true);
                notificationChannel.LightColor = Color.Red;
                notificationChannel.EnableVibration(true);
                notificationChannel.SetSound(RingtoneManager.GetDefaultUri(RingtoneType.Notification), new AudioAttributes.Builder()
            .SetContentType(AudioContentType.Sonification)
            .SetUsage(AudioUsageKind.Notification)
            .Build());
                notificationManager.CreateNotificationChannel(notificationChannel);
            }

            Notification notification = new NotificationCompat.Builder(this, newsChannelId)
                .SetLargeIcon(BitmapFactory.DecodeResource(Resources, Resource.Mipmap.icon)) //newest projects use mipmaps and drawables, you can go to drawables too
                .SetSmallIcon(Resource.Mipmap.icon)
                .SetContentTitle(title)
                .SetContentText(message)
                .SetAutoCancel(true)
                .SetVisibility((int)NotificationVisibility.Private)
                .SetContentIntent(pendingIntent)
                .SetVibrate(vibrationPattern)
                .SetSound(RingtoneManager.GetDefaultUri(RingtoneType.Notification))
                .Build();

            notificationManager.Notify(0, notification); // overrides old notification if it's still visible because it uses same Id
        }

        private void saveRegistrationToApp(string token)
        {
           // send to server or store locally
        }
    }
}
728x90
반응형
728x90
반응형

docs.microsoft.com/ko-kr/xamarin/ios/get-started/installation/device-provisioning/automatic-provisioning?tabs=windows

 

Xamarin.iOS에 대한 자동 프로비저닝 - Xamarin

Xamarin.iOS가 성공적으로 설치된 후 iOS 개발의 다음 단계는 iOS 디바이스를 프로비전하는 것입니다. 이 가이드에서는 자동 서명을 사용하여 개발 인증서와 프로필을 요청하는 방법을 설명합니다.

docs.microsoft.com

Xamarin.iOS에 대한 자동 프로비저닝

  • 2020. 03. 05.
  • 읽는 데 5분 걸림

Xamarin.iOS가 성공적으로 설치된 후 iOS 개발의 다음 단계는 iOS 디바이스를 프로비전하는 것입니다. 이 가이드에서는 자동 프로비저닝을 사용하여 개발 인증서와 프로필을 요청하는 방법을 설명합니다.

요구 사항

자동 프로비저닝은 Mac용 Visual Studio, Visual Studio 2019 및 Visual Studio 2017(버전 15.7 이상)에서 사용할 수 있습니다.

 참고

이 기능을 사용하려면 유료 Apple 개발자 계정도 필요합니다. Apple 개발자 계정에 대한 자세한 내용은 디바이스 프로비저닝 가이드를 참조하세요. 유료 Apple 개발자 계정이 없는 경우 Xamarin.iOS에 대한 체험 프로비저닝 가이드를 참조하세요.

 참고

시작하기에 앞서, Apple 개발자 포털 또는 App Store Connect에서 모든 라이선스 계약에 동의하시기 바랍니다.

자동 프로비저닝 사용

자동 서명 프로세스를 시작하기 전에 Apple 계정 관리 가이드에 설명된 대로 Visual Studio에 Apple ID를 추가했는지 확인해야 합니다.

Apple ID를 추가했다면 모든 관련 _팀_을 사용할 수 있습니다. 따라서 팀에 대해 인증서, 프로필 및 다른 ID를 만들 수 있습니다. 팀 ID는 프로비저닝 프로필에 포함될 앱 ID의 접두사를 만들 때도 사용됩니다. 이 요소가 있으면 Apple이 신원을 확인할 수 있습니다.

IOS 디바이스에 배포할 앱에 자동으로 서명하려면 다음을 수행합니다.

 참고

Visual Studio 2017 또는 Visual Studio 2019(버전 16.4 이상)를 사용하는 경우 계속하기 전에 Mac 빌드 호스트에 페어링되어 있어야 합니다.

  1. 솔루션 탐색기에서 iOS 프로젝트 이름을 마우스 오른쪽 단추로 클릭하고 속성을 선택합니다. 그런 다음 iOS 번들 서명 탭으로 이동합니다.

  2. 자동 프로비저닝 구성표를 선택합니다.

  3.  드롭다운 메뉴에서 팀을 선택하여 자동 서명 프로세스를 시작합니다. Visual Studio에 프로세스가 성공적으로 완료되었는지 표시됩니다.

자동 프로비저닝 실행

자동 프로비저닝이 사용하도록 설정되면 다음과 같은 상황이 발생할 경우 필요에 따라 Visual Studio가 이 프로세스를 다시 실행합니다.

  • iOS 디바이스가 mac에 플러그 인됩니다.
    • 디바이스가 Apple Developer Portal에 등록되었는지 자동으로 검사합니다. 등록되지 않은 경우 디바이스를 추가하고 이를 포함하는 새 프로비저닝 프로필을 생성합니다.
  • 앱의 번들 ID가 변경된 경우
    • 앱 ID를 업데이트합니다. 이 앱 ID를 포함하는 새 프로비저닝 프로필이 생성됩니다.
  • 지원되는 기능은 Entitlements.plist 파일에 활성화됩니다.
    • 이 기능은 앱 ID에 추가되고, 업데이트된 앱 ID가 포함된 새 프로비저닝 프로필이 생성됩니다.
    • 일부 기능은 현재 지원되지 않습니다. 지원되는 기능에 대한 자세한 내용은 기능 사용 가이드를 참조하세요.

와일드카드 앱 ID

Mac용 Visual Studio 및 Visual Studio 2019(버전 16.5 이상)에서, 자동 프로비저닝은 기본적으로 명시적 앱 ID 대신 Info.plist에 지정된 번들 식별자를 기반으로 와일드카드 앱 ID 및 프로비저닝 프로필을 만들고 사용하려고 시도합니다. 와일드카드 앱 ID는 프로필 및 Apple Developer Portal에서 유지 관리하는 ID 수를 줄입니다.

경우에 따라 앱의 자격에는 명시적인 앱 ID가 필요합니다. 다음 자격은 와일드카드 앱 ID를 지원하지 않습니다.

  • 앱 그룹
  • 연결된 도메인
  • Apple Pay
  • Game Center
  • HealthKit
  • HomeKit
  • 핫스폿
  • 앱에서 바로 구매
  • 다중 경로
  • NFC
  • Personal VPN(개인 VPN)
  • 푸시 알림
  • 무선 액세서리 구성

앱에서 해당 자격 중 하나를 사용하는 경우 Visual Studio는 와일드카드 앱 ID 대신 명시적인 앱 ID를 만들려고 시도합니다.

문제 해결

  • 새 Apple 개발자 계정이 승인되기까지 몇 시간 정도 걸릴 수 있습니다. 계정이 승인되기 전까지는 자동 프로비저닝을 사용할 수 없습니다.
  • 자동 프로비저닝 프로세스가 Authentication Service Is Unavailable 오류 메시지와 함께 실패할 경우, App Store Connect 또는 appleid.apple.com에 로그인하여 최신 서비스 계약에 동의했는지 확인하세요.
  • Authentication Error: Xcode 7.3 or later is required to continue developing with your Apple ID. 오류 메시지가 표시된다면 선택한 팀에 Apple Developer Program에 대한 유효한 유료 멤버 자격이 있는지 확인하세요. 유료 Apple 개발자 계정을 사용하려면 Xamarin.iOS 앱에 대한 체험 프로비저닝 가이드를 참조하세요.
728x90
반응형
728x90
반응형

Firebase 를 사용하기 위해 FirebasePushNotificationPlugin Nuget을 설치했는데 아래 와 같은 에러가 발생되었습니다.

 

Java.Lang.IllegalStateException: 'Default FirebaseApp is not initialized  

in this process com.companyname.firebasetest.  

Make sure to call FirebaseApp.initializeApp(Context) first.'

 

해결은.. 솔루션 정리하고 다시 빌드 하면 된다.;;

 

(내가 겪은 자마린의 에러는 거의 반정도가 정리하고 다시 빌드하면 해결이되는데 왜그런걸까;;;)

 

참고

docs.microsoft.com/en-us/xamarin/android/data-cloud/google-messaging/remote-notifications-with-fcm?tabs=macos#firebaseapp-is-not-initialized

github.com/CrossGeeks/FirebasePushNotificationPlugin/issues/338

728x90
반응형

+ Recent posts