하.. ㅅㅂ 그냥 좀 놔주면 난리를 피지 않겠지만.. 어찌저찌하여 그리 됬다.. (썩을 구글놈들..)
뭐.. 어쩔수 없이 작업은 해야하는데 다행히도 어플을 업데이트 할일은 없고 서버에서 푸쉬알림 전문전송부분만 바꿔주면 된다고 함. 나는 ASP.Net으로 웹서버를 만들었으니까 그걸 기준으로한다. 그래서 어찌저찌 알아본결과 잘못하면 개고생할수 있는 길이 열릴것 같아서 미리 정리를 해둔다.
[처리사항]
1. 먼저 인증서를 발부 받을수 있도록 구글 firebase콘솔로 부터 Credential 파일을 받아야한다.
FirebasePlayConsole에서 자신의 프로젝트로 들어간후 설정으로 진입한뒤 서비스 계정탭 에서 "새 비공개 키 생성"을 눌러서 키파일을 다운로드 한다. **.json 파일이 다운로드 되는데 이 파일을 잘 저장해 놓자.
2. 이제 이 키로 처리를 해야하는데 C#사용자는 마이그레이션 문서를 읽어보면 혼란만 가중되니까 딱 정의를 해줌!! 먼저 이파일로 엑세스 토큰 문자열을 만들어야한다. 결과 string은 "ya29.c어쩌구저쩌구" 라는 문자열이 만들어져야한다. 그리고 이문자열의 유효시간이 대략 1시간이다. 따라서 푸쉬알림 할때마다 매번 발급받지 말고 한번 받은후 만료시간을 45분정도 정해놓고 그동안에는 이 토큰을 사용하다가 시간이 만료되면 다시 발급 받는 방식으로 처리해야한다. 그래서 프로그램 시작할때 인증서 내용을 먼저 다음처럼 로드한다. (인증서파일이 "firebase_credential.json"이라면)
private string credential_json;
//
string credential_path = @".\firebase_credential.json";
if (File.Exists(credential_path)) { credential_json = File.ReadAllText(credential_path); }
//이렇게 json 인증서파일의 내용을 로드해서 메모리에 박아놓고
3. Nuget패키지 관리자에서 Google.Apis.Auth 라이브러리를 다운받아 설치후
토큰핸들러 클래스를 정의한다. (45분정도면 안전빵이라고 생각한다.)
public class FcmTokenHandler
{
private static string _token = string.Empty;
private static DateTime expiredTime = DateTime.Parse("2020-01-01 00:00:00");
//
public static async Task getAccessToken(string credential_json)
{
try
{
DateTime nowtime = DateTime.Now;
bool need_refresh = false;
double left_time = (expiredTime - nowtime).TotalMinutes;
if (string.IsNullOrEmpty(_token) || (left_time < 0)) { need_refresh = true; }
//조건에따라 분기
if (!need_refresh)
{
return _token;
} else {
if (string.IsNullOrEmpty(credential_json))
{
Debug.Write("credential_json의내용없음");
return;
}
//Credential을 생성하면서 Scope도 정의를 해야한다.
GoogleCredential mycd = GoogleCredential.FromJson(credential_json).CreateScoped("https://www.googleapis.com/auth/firebase.messaging");
string accessToken = await mycd.UnderlyingCredential.GetAccessTokenForRequestAsync();
//멤버바인딩
_token = accessToken;
expiredTime = nowtime.AddMinutes(45);
//
return _token;
}
} catch (Exception ex) {
Debug.WriteLine(ex.Message);
return "";
}
}
4. 이렇게 정의된 클래스로부터 엑세스 토큰을 발급받아 HttpRequest를 해서 알림전송
string access_token = await FcmTokenHandler.getAccessToken(credential_json);
if (string.IsNullOrEmpty(access_token)) { return; }
//HttpRequest
string send_url = "https://fcm.googleapis.com/v1/projects/내프로젝트명/messages:send";
var HttpWebRequest = (HttpWebRequest)WebRequest.Create(send_url);
HttpWebRequest.ContentType = "application/json";
HttpWebRequest.Headers.Add("Authorization", "Bearer " + access_token);
HttpWebRequest.Method = "POST";
using (var streamWriter = new StreamWriter(HttpWebRequest.GetRequestStream())
{
string json_body = "전달 json 내용 어쩌구저쩌구";
streamWriter.Write(json_body);
streamWriter.Flush();
streamWriter.Close();
}
//Response
var httpResponse = (HttpWebResponse)HttpWebRequest.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream())
{
var res_message = streamReader.ReadToEnd();
//res_message로 후처리
}
5. 이런식으로 메서드를 만들어서 사용하면된다. 전달내용중 json_body도 http v1에 들어오면서 변경된 내용이 있다. 예를 들어 아이폰 푸쉬알림시 기본소리 재생 옵션의 경우 notification키 말고 apns->payload->aps->sound의 값을 "default"로 한다던가 이런 내용들의 변경되었다 자세한 변경점은 인터넷을 찾아보면 되니까 패스하고 여기서는 토큰으로 푸쉬알림 전송부분만 언급한다.
ㅇㅇ 굿투 유즈

댓글 없음:
댓글 쓰기