안녕하세요 DB 저장 문의드립니다.

안녕하세요 DB 저장 문의드립니다.

QA

안녕하세요 DB 저장 문의드립니다.

본문

안녕하세요 현재 그누보드 + 안드로이드 + 파이어베이스를 연결해서

알림 푸시 기능을 구현해보려 하는데요

 

어떤 분이 그누보드를 이용한 예로 글 작성해 주신게 있어서 보고 하는데 막히는 곳이 있어서

조언 부탁드립니다ㅠㅠ (참고 원문 : http://webagency.ogoga.com/act-article/article=53 )

해당 글이 작년 작성글이라서 그누보드 5.3 구버젼인것 같구요

저는 최신 버전 사용중입니다.

 

우선 해당 글을 보면서 제 닷홈 서버 mysql에 새테이블 작성하고 앱 구동시 디바이스 토큰 등

디비로 입력되는것 까지는 잘 작동하는데, 회원ID 저장이 안되서 애먹고 있습니다.

그래서 혹시나 코드부분에서 변경된 부분이 있는지 문의드립니다.

 

아래부터 원문을 따라한 순서대로 코드를 진행해 보려합니다. 의심부분이 있다면 조언 부탁드립니다ㅠ

코드가 많이 첨부되서 긴글입니다. 죄송합니다ㅠㅠ

 

우선 sql에 users 테이블을 생성했습니다.

 

CREATE TABLE users (
id INT(20) unsigned NOT NULL auto_increment,
Token VARCHAR(255) NOT NULL,
mb_id VARCHAR(255) NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY (Token)
);

 

1794286461_1534926189.1408.jpg

 

그리고 설치 루트에 /fcm 폴더를 생성 후 register_token.php 파일을 만들었습니다.


<?php
include_once('../common.php');
$token = $_POST["Token"] or $_GET["Token"];
$_SESSION["dtkn"] = $token;
$query = "INSERT INTO users(Token) Values ('$token') ON DUPLICATE KEY UPDATE Token = '$token' ";
sql_query($query);
?>

 

여기까지는 잘 됐습니다. 여기까지 했을때 앱 설치,구동시 users 테이블에 토큰값이 생성됐습니다.

그후 /fcm 폴더에 send_fcm.php 를 만들고 아래 코드를 입력합니다.


<?php
 
define("GOOGLE_SERVER_KEY", "yourserverkey");  //"yourserverkey" 여기에는 제 파이어베이스 서버키를 입력했습니다.
function send_fcm($message, $id) {
$url = 'https://fcm.googleapis.com/fcm/send';
$headers = array (
'Authorization: key=' . GOOGLE_SERVER_KEY,
'Content-Type: application/json'
);
$fields = array ( 
'data' => array ("message" => $message),
'notification' => array ("body" => $message)
);
if(is_array($id)) {
$fields['registration_ids'] = $id;
} else {
$fields['to'] = $id;
}
$fields['priority'] = "high";
$fields = json_encode ($fields);
$ch = curl_init ();
curl_setopt ( $ch, CURLOPT_URL, $url );
curl_setopt ( $ch, CURLOPT_POST, true );
curl_setopt ( $ch, CURLOPT_HTTPHEADER, $headers );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt ( $ch, CURLOPT_POSTFIELDS, $fields );
$result = curl_exec ( $ch );
if ($result === FALSE) {
//die('FCM Send Error: ' . curl_error($ch));
} 
curl_close ( $ch );
return $result;
}
?>
 

 

이 파일로 필요한 시점에 send_fcm()함수를 호출해 사용하는 용도라고 합니다.

그 다음은 그누보드의 공지사항 등록시 앱사용자들에게 푸시를 보내는 부분입니다.

여기서부터 작동이 안됩니다ㅠㅠ

/bbs/write_updte.php 최하단에 아래 코드를 추가했습니다.

 

 

 
if($bo_table == 'yournoticeboard') {   //제 공지사항 보드명 'notice' 로 적었습니다.
include_once('../fcm/send_fcm.php');
$result = sql_query("Select Token From users");
while ($row = sql_fetch_array($result)) {
if($row["Token"]) {
$tokens[] = $row["Token"];
}
}
$rt = send_fcm($wr_subject, $tokens);
}
 
?>

 

그 다음은 원래 목적인 회원별 쪽지 알림 푸시 부분입니다.

처음에 만들었던 register_token.php 파일의 $_SESSION["dtkn"] = $token; 코드 덕분에

사용자 로그인시 멤버ID와 토큰을 연결시키는 것이 가능하다고 합니다.

 

/bbs/login_check.php 최하단에 코드를 추가했습니다.

 


 
if($_SESSION['dtkn']) {
sql_query("INSERT INTO users(Token, mb_id) Values ('{$_SESSION['dtkn']}', '{$mb['mb_id']}') ON DUPLICATE KEY UPDATE Token = '{$_SESSION['dtkn']}', mb_id = '{$mb['mb_id']}'");
}
 
 

 

위 코드로 users테이블에서 토큰을 유니크 컬럼으로 지정했기에, 로그인 시점마다 멤버 아이디가 갱신

된다고 합니다.

 

그리고 그누보드 로그아웃은 세션을 모두 초기화 시켜버리기에

/bbs/logout.php을 손을 봐야 한다고 해서 제시된 아래 코드를 삽입했습니다.

 


 
$dtkn = $_SESSION['dtkn']; 
~~~~~~
session_unset();
session_destroy();
~~~~~~
session_start();
$_SESSION["dtkn"] = $dtkn;
 
 

 

근데 이거 적을때 위치들이 헷갈려서 우선 아래처럼 삽입했습니다.


<?php
include_once('./_common.php');
 
$dtkn = $_SESSION['dtkn']; 
 
if(function_exists('social_provider_logout')){
    social_provider_logout();
}
// 이호경님 제안 코드
session_unset(); // 모든 세션변수를 언레지스터 시켜줌
session_destroy(); // 세션해제함

// 자동로그인 해제 --------------------------------
set_cookie('ck_mb_id', '', 0);
set_cookie('ck_auto', '', 0);
// 자동로그인 해제 end --------------------------------

session_start();
$_SESSION["dtkn"] = $dtkn;
 
... 아래 기존 내용 계속 ...

 

여기까지 하면 앱 로그인, 로그아웃시

A로 로그인 -> 로그아웃 -> B로 로그인을 하면 토큰에 연결된 멤버 아이디가 변경되는 것을 확인 가능하다고 하는데 sql의 users 테이블 내용 중 mb_id 부분에는 여전히 아무것도 입력되지 않았습니다.

 

그리고 쪽지가 왔을때 아래 코드를 /bbs/memo_form_update.php에 넣어 놓으면

푸시알림이 간다고 합니다. 그래서 최상단에 아래처럼 넣었습니다.

 


 
include_once('./fcm/send_fcm.php');

$result = sql_query("Select Token From users where mb_id = '{$recv_mb_id}'");
while ($row = sql_fetch_array($result)) {
if($row["Token"]) {
$tokens[] = $row["Token"];
}    
}
if(count($tokens)) { $rt = send_fcm('알림이 도착했습니다', $tokens); }
 
 

 

여기까지가 마지막입니다. ㅠㅠ 긴 글 읽어주셔서 감사합니다.

이 질문에 댓글 쓰기 :

답변 3

https://sir.kr/main/request/

하이브리드기반의 푸시앱을 개발중이신가요?

 

글등록시 동기화방식으로 fcm을 쓰시면 문제가 생깁니다.

 

디비에 등록된 토큰수나 혹은 fcm 발송응답시간이 많이 늦을경우

 

그만큼 글등록이 curl 을 마무리할때까지 계속 로딩중이기때문이죠.

 

중요한건 send_fcm.php를 글등록시점에 인클루드에서 동기화처리하는 방식이 아니라

 

ajax로 비동기화 처리해야합니다. 

 

더중요한건 ajax 응답 성공시 gotourl 로 리다이렉트 시키면 동기화 처리랑 별차이가없기때문에 하면안되고 ,  응답시점을 기다리지않고 바로 리다이렉트시켜야합니다.

 

글등록 마무리시점 -> ajax 로 send_fcm.php에 파라미터포함해서 요청 -> 응답기다리지않고 gotourl로 리다이렉트

 

이렇게하면 ajax로 보내자마자 바로 리다이렉트되기때문에 기존 글등록 시간과 별차이가없게됍니다.

 

그리고 세션을 별도의 커스텀을 하실필요가없습니다.

 

웹뷰내 렌더링된 웹페이지의 화면에서 로그인방식으로 유도하시고요. 

 

웹뷰에서 웹을 로드하기전에 user_agent를 커스텀하세요. 식별용도로..

 

사용자가 직접 로그인을 시도하게되면 login_check.php가 호출될텐데..

 

마무리될시점에  user_agent값을 검사해서 하이브리드앱 여부로 

 

하이브리드면 안드로이드 웹뷰 브릿지 함수를 호출해서 멤버정보를 호출하면(아이디,레벨등등 json되고

 

기본브라우져면 기존 방식대로 냅두면됩니다.

 

이렇게하면 그누 세션 로직 그대로 사용할수가있죠.

 

이방식은 ios에서도 통합니다.

 

안드로이드 브릿지 메서드를 호출해서 파라미터를 받게돼면

 

이걸 기반으로 share프레퍼런스로 저장하게하면될테고..

 

로그인시점이니 .. 이때 파이버에스 인스턴스 아이디를 호출하여 다시 서버통신해서 값을 전달해주면됩니다.

 

즉 , 로그인시점에 푸시토큰을 전달해주는거죠.  그외에 앱정보 부터 디바이스 정보까지 전달할수도있고요.

 

fcm토큰은 어떤 연유로인해서 기존값이 실효될수도있기때문에  항상 신경써줘야합니다.

 

 

 

 

도움이 필요하시면 ldshyun3 톡주세요. 

답변을 작성하시기 전에 로그인 해주세요.
전체 45
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT