C # 백엔드를 사용하여 Firebase 및 Apple 푸시 알림을 사용하여 Xamarin에서 푸시 알림을 구현하는 방법

TPG

네이티브 Android 및 iOS에서 Xamarin.Forms로 마이그레이션하는 동안 AppCenter 푸시는 무료이고 사용하기 쉽기 때문에 알림에 AppCenter 푸시를 사용하기로 결정했습니다 (물론 비교적 새롭기 때문에 제대로 작동하도록 만드는 데 많은 시간을 보냈습니다. 온라인에서 덜 안내하는 것). 내 원본 공유는 AppCenter Push API를 구현하는 방법 에서 찾을 수 있습니다 . .

Microsoft가 AppCenter Push ( https://devblogs.microsoft.com/appcenter/app-center-mbaas-retirement/ )를 중단 한다고 발표 하고 사용자에게 Azure (유료 서비스)로 이동하도록 권장 할 때까지 만족했습니다. ). 푸시 알림에 기본 FCM 및 APN을 사용하기로 결정했습니다.

문제는 전체 작업을 수행하는 방법에 대한 직접적인 자습서가 없다는 것입니다. 여기 저기 iOS .P8과 같은 문제 및 솔루션이 있습니다 .P8은 내 프로젝트가 지원되지 않는 .Net Framework에서 실행되는 동안 HTTP / 2에서만 작동합니다. .Net Core 만 HTTP / 2 프로토콜을 사용할 수 있습니다.

TPG

내 현재 프로젝트는 Xamarin.Forms를 사용하여 Xamarin.Android 및 Xamarin.iOS에 알림을 보내는 백엔드로 ASP.NET C #에서 실행됩니다. 저와 같은 경우 아래에서 제 대답을 찾으십시오. 아래에서 완전히 작동하는 C # 백엔드 및 Xamarin.Forms 솔루션을 공유하고 있습니다. 따라서 더 많은 사용자가 Azure 유료 서비스로 푸시되는 대신 무료 서비스의 혜택을 누릴 수 있습니다.

PART 1 C # 백엔드 -C # ASP.NET 백엔드. FCM 및 APN의 경우 두 부분으로 나뉩니다.

1.1) Firebase (FCM)

  1. FCM을 설정하려면 계정을 등록해야합니다. 온라인에는 수많은 가이드 라인이 있으며, 이것은 https://xmonkeys360.com/2019/12/08/xamarin-forms-fcm-setup-configuration-part-i/ 좋은 가이드 중 하나입니다 . 얻가하는 것을 잊지 마십시오 서버 키 와 다운로드 구글 - services.json의 당신의 Xamarin.Android 프로젝트에 파일을. 마우스 오른쪽 버튼을 클릭하고 빌드 작업을 " GoogleServiceJson "으로 설정합니다 ( xamarin 앱에서 google-services.json을 추가 할 수있는 위치 ).

  2. 아래는 내 Firebase입니다.

    using Newtonsoft.Json.Linq;
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Net;
    using System.Web.Script.Serialization;
    
    namespace PushNotificationLibrary
    {
        public class FirebaseCloudMessagingPush
        {
            private const string WEB_ADDRESS = "https://fcm.googleapis.com/fcm/send";
    
            private const string SENDER_ID = "YOUR SENDER ID";
            private const string SERVER_KEY = "YOUR SERVER KEY";
    
            public string SendNotification(string deviceToken, string title, string message, string priority = "high", int badge = 0, List<Tuple<string, string>> parameters = null)
            {
                var result = "-1";
                var httpWebRequest = (HttpWebRequest)WebRequest.Create(WEB_ADDRESS);
    
                parameters = parameters ?? new List<Tuple<string, string>>();
    
                httpWebRequest.ContentType = "application/json";
                httpWebRequest.Headers.Add(string.Format("Authorization: key={0}", SERVER_KEY));
                httpWebRequest.Headers.Add(string.Format("Sender: id={0}", SENDER_ID));
                httpWebRequest.Method = "POST";
    
                if (title.Length > 100)
                    title = title.Substring(0, 95) + "...";
    
                //Message cannot exceed 100
                if (message.Length > 100)
                    message = message.Substring(0, 95) + "...";
    
                JObject jObject = new JObject();
                jObject.Add("to", deviceToken);
                jObject.Add("priority", priority);
                jObject.Add("content_available", true);
    
                JObject jObjNotification = new JObject();
                jObjNotification.Add("body", message);
                jObjNotification.Add("title", title);            
    
                jObject.Add("notification", jObjNotification);
    
                JObject jObjData = new JObject();
    
                jObjData.Add("badge", badge);
                jObjData.Add("body", message);
                jObjData.Add("title", title);
    
                foreach (Tuple<string, string> parameter in parameters)
                {
                    jObjData.Add(parameter.Item1, parameter.Item2);
                }
    
                jObject.Add("data", jObjData);
    
                var serializer = new JavaScriptSerializer();
                using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
                {
                    string json = jObject.ToString();
                    streamWriter.Write(json);
                    streamWriter.Flush();
                }
    
                var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
                using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
                {
                    result = streamReader.ReadToEnd();
                }
    
                return result;
            }
        }
    }
    

1.2) iOS (APN)

  1. APN의 경우 작업을 수행하는 두 가지 방법이 있습니다. 하나는 .P12 기존 방식을 사용하는 것입니다. 또 다른 방법은 .P8을 사용하여 Apple 인증 키를 사용하는 것입니다. .P12 인증서는 매년 만료되고 매년 업데이트해야 하므로 .P8을 사용하는 것을 선호합니다 . .P8 사용의 문제점은 .Net Framework에서 지원되지 않는 HTTP / 2를 사용하고 있다는 것입니다.하지만 고맙게도이를 극복했습니다. C #에서 애플 토큰 기반 푸시 알림 (p8 파일 사용)을 구현하는 방법을 참조하십시오 . , .Net Framework에 대한 모든 것을 구현하는 방법에 대한 해당 게시물에서 답변찾으십시오 . * 이미 .Net Core를 사용하고 있다면 대답은 저와 비슷하지만 사용자 지정 WinHTTPHandler를 사용할 필요는 없습니다. 정상적인 HTTPClient 만 수행합니다.

2 부 Xamarin.Forms- 다음으로 Xamarin.Forms 프로젝트에서 알림을 지원해야합니다.

  1. 이 부분에서는 전혀 어렵지 않습니다. https://github.com/CrossGeeks/PushNotificationPlugin참조 하고 Nuget을 다운로드 한 다음 링크의 지침에 따라 Xamarin 프로젝트 (Forms, Android, iOS)를 설정하기 만하면됩니다.

  2. 내가 강조하고 싶은 유일한 것은 장치 토큰을 얻는 방법과 위치입니다. 처음에는 아래 코드 (OnTokenRefresh)에서 장치 토큰을 얻으려고했습니다. 그러나 곧이 코드가 항상 호출되는 것은 아니라는 것을 알게 될 것입니다. 디버그 할 때마다가 아니라 토큰이 새로 고쳐진 후에 만 ​​호출 될 것이라고 생각합니다. 매번 장치 토큰을 얻으 CrossPushNotification.Current.Token려면 프로젝트의 아무 곳이나 전화 하십시오. 해당 장치 토큰을 서버 백엔드에 등록하십시오. 그리고 장치 토큰을 사용하여 위의 PART 1에서 내 코드를 사용하여 알림을 보냅니다.

    CrossPushNotification.Current.OnTokenRefresh += (s,p) =>
    {
        System.Diagnostics.Debug.WriteLine($"TOKEN : {p.Token}");
    };
    

그게 다야! 꽤 쉽지만 몇 주 동안 시도하고 오류를 일으켰습니다. 다른 사람들의 소중한 시간을 절약 할 수 있기를 바랍니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관