FAQ

안드로이드 앱단에서 직접 파일 업로드할 시 서버보안으로 403에러가 뜨는 경우일 수 있습니다.


웹호스팅 업체에 다음과 같이 문의해주셔야 합니다.

 

----------------------

 

HttpURLConnection 으로 multipart/form-data 로 file을 올리면 403(또는 406) 에러가 발생합니다.

 

혹시 modsecurity가 적용되어 있는지요? 

 

이 보안부분 열어주셨으면 합니다. 

 

--------------------

소셜로그인 적용하시려면 별도의 커스텀 작업이 필요합니다.

 

1) gnu푸시앱 환경설정 값 입력하기

 

관리자 페이지에서 gnu푸시앱 환경설정에 들어가셔서 "앱기본설정" 항목에서 아래부분을 찾습니다.

 

 

ad2d20d0fe4e7dd0ac0d1e8538ef5d2a_1490058100_8338.png
 

여기에 각각 해당 소셜로그인 링크를 적어주셔야 합니다(사용하시는 것만).

 

1) 그누보드 5.3 최신버전의 경우

http://www.domain.com/bbs/login.php?provider=naver

--> 그누보드 5.3최신버전의 경우에는 새창방식이 아니라 현재창 소셜로그인 방식으로 진행됩니다.

 

2) 소셜로그인이 새창을 띄우는 방식으로 진행되는 경우

javascript:window.open('소셜로그인 이동 주소', '', '');  

 

예를 들어서 만일 그누보드 5.3의 경우에 네이버 링크 주소 -> http://domain.com/bbs/login.php?provider=naver  

편리님의 소셜로그인 플러그인을 사용하실 경우 네이버 링크 주소 -> javascript:window.open('http://domain.com/plugin/oauth/login.php?service=naver', 'win_social_login', '');

아미나 구버전의 경우 -> javascript:window.open('http://domain.com/plugin/login-oauth/login_with_naver.php', 'win_social_login', ''); 

(그누보드 5.3이 적용된 아미나 최신버전의 경우에는 그누보드 5.3처럼 입력해주셔야 합니다.)

 

​소셜에 맞게끔 naver로 적힌 부분을 kakao,facebook,google,twitter 이렇게 수정해주시면 됩니다.​​

 

 

2) 그누보드 5.3 & 아미나 1.8.2이상의 경우 코어 수정 방법

 

plugin/social/register_member_update.php파일에서 128번째 줄 쯤에 아래의 내용을 찾습니다. 

 

$mb = get_member($mb_id);

 

이 다음 줄에 아래 내용 추가합니다. 

 

if($reg_id = get_session('reg_id')){

sync_device_member_social_login2(strtolower($provider_name),$mb_id);}

 

163번째줄에

 

//바로 로그인 처리

set_session('ss_mb_id', $mb['mb_id']);

 

이 내용 다음에 아래의 내용을 추가해주세요.

 

if($reg_id = get_session('reg_id')){

sync_device_member_social_login2(strtolower($provider_name),$mb_id);}

 

-------------------------------------

 

bbs/login_check.php파일에서 43번째 줄 쯤에 아래의 내용을 찾습니다.

 

set_session('ss_mb_key', md5($mb['mb_datetime'] . $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']));

 

이 내용 아래에 아마 다음 한줄을 추가하셨을 것입니다. 

 

if(preg_match("/GNUPUSH/", $_SERVER['HTTP_USER_AGENT'])) sync_device_memb_id_webview_login($mb['mb_id']); 

 

이 내용을 아래 내용으로 바꿔주시면 됩니다.

 

 

if(preg_match("/GNUPUSH/", $_SERVER['HTTP_USER_AGENT'])){

if($is_social_login){
$provider_name = social_get_request_provider();
sync_device_member_social_login2(strtolower($provider_name),$mb['mb_id']);
}else{
sync_device_memb_id_webview_login($mb['mb_id']);
}

} 

 

 

 

3) 아미나 1.8.1이하의 소셜로그인의 경우

 

login-oauth-plugin 2.0/plugin/login-oauth/oauth_check.php 파일에서 

 

*** 52번째줄 아래의 내용을 찾습니다.

 

// FLASH XSS 공격에 대응하기 위하여 회원의 고유키를 생성해 놓는다. 관리자에서 검사함 - 110106

set_session('ss_mb_key', md5($mb['mb_datetime'] . $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']));

 

*** 이 내용 아래에 다음의 한 줄을 추가합니다.

 

if($reg_id = get_session('reg_id')){

sync_device_member_social_login2(strtolower($client->server),$mb['mb_id']);

}  

 

 

*** 286번째 줄 쯤에 아래의 내용을 찾습니다.

 

// FLASH XSS 공격에 대응하기 위하여 회원의 고유키를 생성해 놓는다. 관리자에서 검사함 - 110106

set_session('ss_mb_key', md5($mb['mb_datetime'] . $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']));

 

 

*** 이 내용 아래에 다음의 한 줄을 추가합니다.

 

if($reg_id = get_session('reg_id')){

sync_device_member_social_login2(strtolower($client->server),$mb['mb_id']);

}

 

 

 

4) 소셜로그인 플러그인 커스텀 작업(편리님의 소셜로그인의 경우)

 

예를 들어서 편리님의 소셜로그인(v2)의 경우 gnuboard5.oauth.v2/plugin/oauth/callback.php 

 

49번째 줄에 아래 내용을 찾습니다.

 

if($is_member && $req_mode == 'connect' && $req_service == $service) {

    $mb = get_member($req_mb_id);

 

    if($mb['mb_id'] && $mb['mb_id'] == get_session('ss_mb_id')) {

        // 기존연동체크

        $sql = " select sm_id from {$g5['social_member_table']} where sm_id = '{$member['mb_id']}' and mb_id = '{$mb['mb_id']}' and sm_service = '$service' ";

        $row = sql_fetch($sql);

 

        if($row['sm_id'])

            alert_opener_url();

 

        // 연동정보 입력

        $sql = " insert into {$g5['social_member_table']}

                    set sm_id       = '{$member['mb_id']}',

                        mb_id       = '{$mb['mb_id']}',

                        sm_service  = '$service',

                        sm_ip       = '{$_SERVER['REMOTE_ADDR']}',

                        sm_datetime = '".G5_TIME_YMDHIS."' ";

 

        if(!sql_query($sql, false))

            alert_opener_url('소셜로그인 서비스를 회원 아이디 '.$mb['mb_id'].' 에 연결할 수 없습니다.', G5_URL);

    }

}

 

여기서 아래의 빨간 부분을 추가합니다.

 

if($is_member && $req_mode == 'connect' && $req_service == $service) {

    $mb = get_member($req_mb_id);

 

    if($mb['mb_id'] && $mb['mb_id'] == get_session('ss_mb_id')) {

        // 기존연동체크

        $sql = " select sm_id from {$g5['social_member_table']} where sm_id = '{$member['mb_id']}' and mb_id = '{$mb['mb_id']}' and sm_service = '$service' ";

        $row = sql_fetch($sql);

 

if($reg_id = get_session('reg_id')){

sync_device_member_social_login2($service,$mb['mb_id']);

}

 

        if($row['sm_id'])

            alert_opener_url();

 

        // 연동정보 입력

        $sql = " insert into {$g5['social_member_table']}

                    set sm_id       = '{$member['mb_id']}',

                        mb_id       = '{$mb['mb_id']}',

                        sm_service  = '$service',

                        sm_ip       = '{$_SERVER['REMOTE_ADDR']}',

                        sm_datetime = '".G5_TIME_YMDHIS."' ";

 

        if(!sql_query($sql, false))

            alert_opener_url('소셜로그인 서비스를 회원 아이디 '.$mb['mb_id'].' 에 연결할 수 없습니다.', G5_URL);

    }

}

 

 

-----------------------

 

그리고 77번째 줄에 아래 내용을 찾습니다.

 

if($is_member && $req_mode == 'confirm' && $req_service == $service) {

    $sql = " select mb_id from {$g5['social_member_table']} where sm_id = '{$member['mb_id']}' and sm_service = '$service' ";

    $row = sql_fetch($sql);

 

    if($row['mb_id'] && $req_mb_id == $row['mb_id']) {

        $mb = get_member($req_mb_id, 'mb_id, mb_password');

 

        if(!$mb['mb_id'])

            alert_close('회원 정보가 존재하지 않습니다.');

 

        set_session('ss_mb_id', $req_mb_id);

        set_session('ss_oauth_member_'.get_session('ss_oauth_member_no').'_info', '');

        set_session('ss_oauth_member_no', '');

 

        echo '<form name="fconfirm" method="post" target="member_confirm" action="'.G5_HTTP_BBS_URL.'/register_form.php">'.PHP_EOL;

        echo '<input type="hidden" name="w" value="u">'.PHP_EOL;

        echo '<input type="hidden" name="mb_id" value="'.$mb['mb_id'].'">'.PHP_EOL;

        echo '<input type="hidden" name="mb_password" value="'.$mb['mb_password'].'">'.PHP_EOL;

        echo '<input type="hidden" name="is_update" value="1">'.PHP_EOL;

        echo '</form>'.PHP_EOL;

        echo '<script>'.PHP_EOL;

        echo 'document.fconfirm.submit();'.PHP_EOL;

        echo 'window.close();'.PHP_EOL;

        echo '</script>';

        exit;

    } else {

        unset($member);

 

        set_session('ss_mb_id', $req_mb_id);

        set_session('ss_oauth_member_'.get_session('ss_oauth_member_no').'_info', '');

        set_session('ss_oauth_member_no', '');

 

        alert_close('올바른 방법으로 이용해 주십시오.');

    }

}

 

 

여기서 아래의 빨간 부분을 추가합니다. 

 

 

 

if($is_member && $req_mode == 'confirm' && $req_service == $service) {

    $sql = " select mb_id from {$g5['social_member_table']} where sm_id = '{$member['mb_id']}' and sm_service = '$service' ";

    $row = sql_fetch($sql);

 

    if($row['mb_id'] && $req_mb_id == $row['mb_id']) {

        $mb = get_member($req_mb_id, 'mb_id, mb_password');

 

        if(!$mb['mb_id'])

            alert_close('회원 정보가 존재하지 않습니다.');

 

if($reg_id = get_session('reg_id')){

sync_device_member_social_login2($service,$mb['mb_id']);

}

 

        set_session('ss_mb_id', $req_mb_id);

        set_session('ss_oauth_member_'.get_session('ss_oauth_member_no').'_info', '');

        set_session('ss_oauth_member_no', '');

 

        echo '<form name="fconfirm" method="post" target="member_confirm" action="'.G5_HTTP_BBS_URL.'/register_form.php">'.PHP_EOL;

        echo '<input type="hidden" name="w" value="u">'.PHP_EOL;

        echo '<input type="hidden" name="mb_id" value="'.$mb['mb_id'].'">'.PHP_EOL;

        echo '<input type="hidden" name="mb_password" value="'.$mb['mb_password'].'">'.PHP_EOL;

        echo '<input type="hidden" name="is_update" value="1">'.PHP_EOL;

        echo '</form>'.PHP_EOL;

        echo '<script>'.PHP_EOL;

        echo 'document.fconfirm.submit();'.PHP_EOL;

        echo 'window.close();'.PHP_EOL;

        echo '</script>';

        exit;

    } else {

        unset($member);

 

        set_session('ss_mb_id', $req_mb_id);

        set_session('ss_oauth_member_'.get_session('ss_oauth_member_no').'_info', '');

        set_session('ss_oauth_member_no', '');

 

        alert_close('올바른 방법으로 이용해 주십시오.');

    }

}

 

---------------------------

 

그리고 117번째 줄에 아래 내용을 찾습니다.

 

// 가입 또는 연동 내역있으면 로그인 처리

if($g5['social_member_table']) {

    $sql = " select mb_id from {$g5['social_member_table']} where sm_id = '{$member['mb_id']}' and sm_service = '$service' ";

    $row = sql_fetch($sql);

    if($row['mb_id']) {

        $mb = get_member($row['mb_id'], 'mb_id');

 

        if($mb['mb_id']) {

            unset($member);

 

            set_session('ss_mb_id', $mb['mb_id']);

            set_session('ss_oauth_member_'.get_session('ss_oauth_member_no').'_info', '');

            set_session('ss_oauth_member_no', '');

 

            if($req_mode != 'connect')

                alert_opener_url();

 

            // 정보수정에서 연동일 때 처리

            echo '<script>'.PHP_EOL;

            echo 'var $opener = window.opener;'.PHP_EOL;

            echo '$opener.$("#sns-'.$service.'").removeClass("sns-icon-not");'.PHP_EOL;

            echo 'window.close();'.PHP_EOL;

            echo '</script>';

            exit;

        }

    }

}

 

여기서 아래의 빨간 부분을 추가합니다. 

 

 

// 가입 또는 연동 내역있으면 로그인 처리

if($g5['social_member_table']) {

    $sql = " select mb_id from {$g5['social_member_table']} where sm_id = '{$member['mb_id']}' and sm_service = '$service' ";

    $row = sql_fetch($sql);

    if($row['mb_id']) {

        $mb = get_member($row['mb_id'], 'mb_id');

 

        if($mb['mb_id']) {

            unset($member);

 

            set_session('ss_mb_id', $mb['mb_id']);

            set_session('ss_oauth_member_'.get_session('ss_oauth_member_no').'_info', '');

            set_session('ss_oauth_member_no', '');

 

if($reg_id = get_session('reg_id')){

sync_device_member_social_login2($service,$mb['mb_id']);

}

 

            if($req_mode != 'connect')

                alert_opener_url();

 

            // 정보수정에서 연동일 때 처리

            echo '<script>'.PHP_EOL;

            echo 'var $opener = window.opener;'.PHP_EOL;

            echo '$opener.$("#sns-'.$service.'").removeClass("sns-icon-not");'.PHP_EOL;

            echo 'window.close();'.PHP_EOL;

            echo '</script>';

            exit;

        }

    }

}

 

 

 

----------------------------

 

그리고 186번째줄에 아래의 내용을 찾습니다.

 

// 회원정보 입력

    $sql = " insert into {$g5['member_table']}

                set mb_id = '{$mb_id}',

                    mb_password = '{$member['mb_password']}',

                    mb_name = '{$mb_name}',

                    mb_nick = '{$mb_nick}',

                    mb_nick_date = '".G5_TIME_YMD."',

                    mb_email = '{$mb_email}',

                    mb_email_certify = '".G5_TIME_YMDHIS."',

                    mb_today_login = '".G5_TIME_YMDHIS."',

                    mb_datetime = '".G5_TIME_YMDHIS."',

                    mb_ip = '{$_SERVER['REMOTE_ADDR']}',

                    mb_level = '{$config['cf_register_level']}',

                    mb_login_ip = '{$_SERVER['REMOTE_ADDR']}',

                    mb_mailling = '0',

                    mb_sms = '0',

                    mb_open = '0',

                    mb_open_date = '".G5_TIME_YMD."' ";

 

    $result = sql_query($sql, false);

 

    if($result) {

        $sql = " insert into {$g5['social_member_table']}

                    set sm_id       = '$mb_id',

                        mb_id       = '$mb_id',

                        sm_service  = '$service',

                        sm_ip       = '{$_SERVER['REMOTE_ADDR']}',

                        sm_datetime = '".G5_TIME_YMDHIS."' ";

        sql_query($sql, false);

    } else {

        alert_opener_url('회원 정보 입력 중 오류가 발생했습니다. 다시 시도해 주십시오.', G5_URL);

    }

 

여기서 아래의 빨간 부분을 첨가해주세요.

 

// 회원정보 입력

    $sql = " insert into {$g5['member_table']}

                set mb_id = '{$mb_id}',

                    mb_password = '{$member['mb_password']}',

                    mb_name = '{$mb_name}',

                    mb_nick = '{$mb_nick}',

                    mb_nick_date = '".G5_TIME_YMD."',

                    mb_email = '{$mb_email}',

                    mb_email_certify = '".G5_TIME_YMDHIS."',

                    mb_today_login = '".G5_TIME_YMDHIS."',

                    mb_datetime = '".G5_TIME_YMDHIS."',

                    mb_ip = '{$_SERVER['REMOTE_ADDR']}',

                    mb_level = '{$config['cf_register_level']}',

                    mb_login_ip = '{$_SERVER['REMOTE_ADDR']}',

                    mb_mailling = '0',

                    mb_sms = '0',

                    mb_open = '0',

                    mb_open_date = '".G5_TIME_YMD."' ";

 

    $result = sql_query($sql, false);

 

    if($result) {

        $sql = " insert into {$g5['social_member_table']}

                    set sm_id       = '$mb_id',

                        mb_id       = '$mb_id',

                        sm_service  = '$service',

                        sm_ip       = '{$_SERVER['REMOTE_ADDR']}',

                        sm_datetime = '".G5_TIME_YMDHIS."' ";

        sql_query($sql, false);

if($reg_id = get_session('reg_id')){

sync_device_member_social_login2($service,$mb_id);

}

    } else {

        alert_opener_url('회원 정보 입력 중 오류가 발생했습니다. 다시 시도해 주십시오.', G5_URL);

    }

 

 

편리님꺼를 사용하실 경우 회원가입이 연동되지 않는 카카오 소셜로그인은 사용을 자제해주시기 바랍니다. 

 

그리고 편리님꺼를 사용하실 경우 gnuboard5.oauth.v2/extend/oauth.extend.php 에서...

 

G5_OAUTH_MEMBER_REGISTER -> true


G5_OAUTH_MEMBER_REGISTER_SELECT -> false

 

이렇게 설정해주셔서 무조건 회원가입 되도록 변경해주셔야 합니다. 안 그러면 푸시앱 안에서 굉장히 복잡한 일이 발생합니다. ㅠㅠ

 

  

 

 

 

[안드로이드앱]

 

window.myJs.callAndroid_l(); -> 로그인창 띄우기 

 

window.myJs.callAndroid_s(); -> 앱 설정창 띄우기 

 

window.myJs.callAndroid_admob(); -> 전면애드몹 띄우기 

 

 window.myJs.callAndroid_chat('mb_id', '{B의 mb_id값}', '{B의 닉네임}', 'onetoone'); -> 채팅 띄우기

(예를 들어서 A사용자가 B사용자에게 1:1채팅을 요청할 경우 아래와 같이 javascript를 실행시키면 됩니다.)

 

 

[아이폰앱]

 

window.webkit.messageHandlers.callbackHandler.postMessage('login'); -> 로그인창 띄우기 

 

window.webkit.messageHandlers.callbackHandler.postMessage('setting'); -> 앱 설정창 띄우기 

 

 

예를 들면 다음과 같이 사용할 수 있습니다.

 

로그인창 띄우기

<a href="#" onclick="window.myJs.callAndroid_l();">로그인창 띄우기</a>

<a href="#" onclick="window.webkit.messageHandlers.callbackHandler.postMessage('login');">로그인창 띄우기</a> 

 

앱설정창 띄우기

<a href="#" onclick="window.myJs.callAndroid_s();">앱설정창 띄우기</a>

<a href="#" onclick="window.webkit.messageHandlers.callbackHandler.postMessage('setting');">앱설정창 띄우기</a> 

 

이것이 반드시 앱에서만 작동하도록 해야 하고, 안드로이드앱으로 접속할 때와 아이폰앱으로 접속할 때를 구분해야 하기 때문에 아래 내용과 같이 수정해주셔야 합니다. 

 

<?php if(preg_match("/GNUPUSH/", $_SERVER['HTTP_USER_AGENT'])){ ?> 

//앱으로 접속했을 때만 실행되도록 할 내용

 

<?php if(preg_match("/GNUPUSHIPHO/", $_SERVER['HTTP_USER_AGENT'])) { ?>

//아이폰앱으로 접속할 경우

<a href="#" onclick="window.webkit.messageHandlers.callbackHandler.postMessage('login');">로그인창 띄우기</a> 

 

<?php }else{ ?>

//안드로이드 앱으로 접속할 경우

<a href="#" onclick="window.myJs.callAndroid_l();">로그인창 띄우기</a> 

<?php } ?>

 

 

<?php }else{ ?>

 

//앱이 아닌 모바일 브라우저나 pc로 접속했을 때만 실행되도록 할 내용

<a href="모바일 로그인화면 url">로그인하기</a> 

 

<?php } ?>

해당 부분은 원하실 경우 앱 제작요청 시 말씀하시면 전달해드립니다.

 

 

function getMobileOperatingSystem() {

  var userAgent = navigator.userAgent || navigator.vendor || window.opera;

 

    if (/windows phone/i.test(userAgent)) {

        return "Windows Phone";

    }

 

    if (/android/i.test(userAgent)) {

        return "Android";

    }

 

    if (/iPad|iPhone|iPod/.test(userAgent) && !window.MSStream) {

        return "iOS";

    }

 

    return "unknown";

}

 

function checkApplicationInstall() { 

 

    var userAgent = navigator.userAgent;

    var visitedAt = (new Date()).getTime();

 

    if (userAgent.match(/Chrome/)) {

            

        setTimeout(function() {

            location.href = "intent://linkactivity?sort=push&address=https%3A%2F%2Fgnupushapp.com#Intent;scheme=xepushappcom;package=com.gnupushapp.gnupushapp;end";

        }, 100);

    } else {

        

        setTimeout(

            function() {

                if ((new Date()).getTime() - visitedAt < 200) {

                    let os = getMobileOperatingSystem();

 

                    if(os == "Android"){

                        location.href = "market://details?id=com.gnupushapp.gnu​pushapp";

                    }else{

                        location.href = "https://itunes.apple.com/app/id123456789";

                    }

                }

            }

        , 50);

 

        var iframe = document.createElement("iframe");

        iframe.style.visibility = "hidden";

        iframe.src = "gnu​pushappcom://linkactivity?sort=push&address=https%3A%2F%2Fgnu​pushapp.com";

        document.body.appendChild(iframe);

        document.body.removeChild(iframe); 

    }

} 

 

 

 

 

노란색 : 원하시는 링크 (사용자에게 보여줄 링크입니다. 한글이 들어갈 경우 해당 값은 %3 등의 문자로 표현이 됩니다.)


분홍색 : 해당 앱의 패키지명 (앱의 패키지명과 동일해야 합니다. 해당 패키지명은 관리자 페이지그누푸시앱 > 앱 기본 설정 혹은 google firebase에서 패키지명을 확인하실 수 있습니다.)

 

초록색 : 아이폰 앱스토어에 등록된 앱의 아이디

 

파란색 :  scheme 값 (주로 해당도메인 첫단어 +도메인 마지막 단어 + 첫 단어로 제작됩니다. 예 : http://gnupushapp.com/​ >  gnu​pushappcomgnu​pushapp​)

아래의 소스를 활용하시면 됩니다.

 

<?php if(preg_match("/GNUPUSH/", $_SERVER['HTTP_USER_AGENT'])){ ?>
//앱으로 접속했을 때만 실행되도록 할 내용


    <?php if(preg_match("/GNUPUSHIPHONE/", $_SERVER['HTTP_USER_AGENT'])){ ?>

    //아이폰앱일 경우

    <?php }else{ ?>

    //안드로이드 앱일 경우

    <?php } ?>


<?php }else{ ?>

//앱이 아닌 모바일 브라우저나 pc로 접속했을 때만 실행되도록 할 내용


<?php } ?>

 

이걸로 안 되면 아래의 내용으로 해주세요(특히 새창에서 페이지가 진행될 경우).

 

<?php if($reg_id = get_session('reg_id')){ ?>
//앱으로 접속했을 때만 실행되도록 할 내용
<?php }else{ ?>

//앱이 아닌 모바일 브라우저나 pc로 접속했을 때만 실행되도록 할 내용

<?php } ?>

앱제작요청하실 때 요청해주시면 됩니다.

 

코딩실력이 있으시다면 직접 하셔도 되요.

 

푸시 알림 보내는 방법은 아래의 소스를 필요한 위치에 추가해주시면 됩니다.

 

----------------- 소스 시작 ---------------------

 

$gnu_config = get_gnupushapp_config();


$use_profile = "false"; //푸시알림 내용에 프로필 사진을 사용할 것인지 여부를 입력합니다. "true" or "false"


$profile_link = "none"; //프로필 사진을 사용할 경우 프로필 사진의 Full Url을 입력합니다. 사용하지 않을 경우는 "none"을 입력합니다.


$pushstyle = "normal"; // 푸시 스타일입니다. normal, big_text, big_picture 스타일중 하나를 입력하시면 됩니다.


$image_src = "none"; //푸시 스타일이 big_picture스타일을 경우 이미지의 Full Url을 입력해주세요. 이미지가 없거나 big_picture스타일이 아닐 경우 "none"을 입력해주세요. 


$title = "제목입니다."; //푸시 알림의 제목을 입력해주세요.


$ticker = '스테이터스바 상단에 잠깐 나타났다 사라질 제목입니다.'; // 스테이터스바 상단에 잠깐 나타났다 사라질 제목입니다.


$content = "내용입니다."; // 푸시 알림 내용을 입력해주세요.


$address = "http://naver.com/"; // 푸시알림을 클릭했을 때 이동할 Full Url을 입력해주세요.


$bottom_text = "푸시알림의 하단에 나올 내용입니다."; //푸시 알림의 하단에 나올 내용을 입력해주세요. 푸시스타일 normal은 해당사항이 없습니다.


$type = "sms"; //이 부분은 수정하지 마세요.


$banner = "popup"; // popup ->팝업알림 / headsup -> heads-up알림 / false -> 기본스타일 알림


$sort = "must"; //must는 무조건 푸시 알림하고, youngcart는 영카트푸시알림 설정된 기기에만 푸시 알림하고, notice는 공지사항에 체크된 회원에게만 푸시 알림을 가게 합니다. newpost는 구독게시판 설정 on상태인 회원에게만 푸시 알림합니다.


$response = true; // 내글반응(또는 srd.pushmsg)에 기록이 남도록 할 것인지 여부를 결정합니다. true : 기록남김 / false : 기록남기지 않음.


$targetsort = "specific"; // 푸시알림 타겟을 특정 회원아이디에게 보낼 것인지, 그룹에 보낼 것인지 결정합니다. specific : 특정회원 아이디에게 발송(이 경우는 아래의 $member_ids 값을 반드시 입력해주셔야 합니다.) / group : 그룹알림 


$group = "all"; // group값 ----> all : 모든 등록기기, oldversion : 구버전앱사용자들, 1 : 비회원........ 그 외는 level 숫자값을 입력해주세요. 예를 들어 level 3에게 알림을 보내려면 "3" 입력해주세면 됩니다.


$member_ids = array('mb_id1','mb_id2','mb_id3'); // 푸시알림을 받을 사람들의 mb_id를 array형태로 입력해주시면 됩니다. $targetsort = "specific" 일 경우에만 값내용을 입력해주시고, $targetsort = "group"일 경우에는 $member_ids = array(); 이렇게 빈 배열로 입력해주세요.


$etc = $use_profile . "ab&#ba" . $profile_link . "ab&#ba" . $pushstyle . "ab&#ba" . $image_src . "ab&#ba" . $ticker . "ab&#ba" . $bottom_text . "ab&#ba" . $type . "ab&#ba" . $banner; // 이 부분은 수정하시면 안 됩니다.

quick_send($member_ids, $title, $content, $address, $etc, $sort, $response, "normal", false, $targetsort, $group); // 이 부분 수정하시면 안 됩니다.

----------------------소스 끝-------------------

 

 

 

 

 

회원가입시 관리자에게 푸시 알림 가도록 하는 기능은 기본으로 제공해드리지 않고, 직접 수정해주셔야 합니다.

수정방법은 간단합니다.

 

bbs/register_form_update.php파일 275번째 줄에 아래 내용을 찾습니다.

 

// 최고관리자님께 메일 발송

    if ($config['cf_email_mb_super_admin']) {

        $subject = '['.$config['cf_title'].'] '.$mb_nick .' 님께서 회원으로 가입하셨습니다.';

 

        ob_start();

        include_once ($misc_skin_path.'/register_form_update_mail2.php');

        $content = ob_get_contents();

        ob_end_clean();

 

        mailer($mb_nick, $mb_email, $config['cf_admin_email'], $subject, $content, 1);

    }

 

 

이 다음 줄에 아래 내용을 추가해주면 됩니다.

 

$gnu_config = get_gnupushapp_config();

$use_profile = "false"; //푸시알림 내용에 프로필 사진을 사용할 것인지 여부를 입력합니다. "true" or "false"

$profile_link = "none"; //프로필 사진을 사용할 경우 프로필 사진의 Full Url을 입력합니다. 사용하지 않을 경우는 "none"을 입력합니다.

$pushstyle = "normal"; // 푸시 스타일입니다. normal, big_text, big_picture 스타일중 하나를 입력하시면 됩니다.

if($gnu_config['push_style'] == "Y")

{

$pushstyle = "big_text";

$image_src = "none";

}

$image_src = "none"; //푸시 스타일이 big_picture스타일을 경우 이미지의 Full Url을 입력해주세요. 이미지가 없거나 big_picture스타일이 아닐 경우 "none"을 입력해주세요. 

$title = '['.$config['cf_title'].'] '.$mb_nick .' 님께서 회원으로 가입하셨습니다.'; //푸시 알림의 제목을 입력해주세요.

$ticker = $title; // 스테이터스바 상단에 잠깐 나타났다 사라질 제목입니다.

$content_dd = $mb_nick .' 님께서 회원으로 가입하셨습니다. 아이디 : '.$mb_id; // 푸시 알림 내용을 입력해주세요.

$address = G5_URL.'/adm/member_list.php'; // 푸시알림을 클릭했을 때 이동할 Full Url을 입력해주세요.

$bottom_text = "회원가입 일시 : ".$date_join; //푸시 알림의 하단에 나올 내용을 입력해주세요. 푸시스타일 normal은 해당사항이 없습니다.

$type = "sms"; //이 부분은 수정하지 마세요.

$banner = "headsup"; // popup ->팝업알림 / headsup -> heads-up알림 / false -> 기본스타일 알림

$sort = "must"; //must는 무조건 푸시 알림하고, youngcart는 영카트푸시알림 설정된 기기에만 푸시 알림하고, notice는 공지사항에 체크된 회원에게만 푸시 알림을 가게 합니다. newpost는 구독게시판 설정 on상태인 회원에게만 푸시 알림합니다.

$response = true; // 내글반응(또는 srd.pushmsg)에 기록이 남도록 할 것인지 여부를 결정합니다. true : 기록남김 / false : 기록남기지 않음.

$targetsort = "specific"; // 푸시알림 타겟을 특정 회원아이디에게 보낼 것인지, 그룹에 보낼 것인지 결정합니다. specific : 특정회원 아이디에게 발송(이 경우는 아래의 $member_ids 값을 반드시 입력해주셔야 합니다.) / group : 그룹알림 

$group = "all"; // group값 ----> all : 모든 등록기기, oldversion : 구버전앱사용자들, 1 : 비회원........ 그 외는 level 숫자값을 입력해주세요. 예를 들어 level 3에게 알림을 보내려면 "3" 입력해주세면 됩니다.

$query = "select gpr_mb_id from g5_gnupushapp_gcmregid where gpr_mb_id in (select mb_id from {$g5['member_table']} where mb_level >= 10) ";

$devices_admin = sql_query($query);

$member_idss = array();

for ($i=1; $rowddd=sql_fetch_array($devices_admin); $i++)

{

array_push($member_idss, $rowddd['gpr_mb_id']);

 

if($gnu_config['build_sort'] == 'A')

{

$mb_list = explode(",", $config['as_admin']);

if(count($mb_list) > 0) {

for ($i=0; $i<count($mb_list); $i++)

{

array_push($member_idss, $mb_list[$i]);

}

}

}

 

$etc = $use_profile . "ab&#ba" . $profile_link . "ab&#ba" . $pushstyle . "ab&#ba" . $image_src . "ab&#ba" . $ticker . "ab&#ba" . $bottom_text . "ab&#ba" . $type . "ab&#ba" . $banner; // 이 부분은 수정하시면 안 됩니다.

quick_send($member_idss, $title, $content_dd, $address, $etc, $sort, $response, "normal", false, $targetsort, $group); // 이 부분 수정하시면 안 됩니다.

1) 그누보드 코어 수정작업이 잘 안되었을 경우


코어수정파일 덮어쓰기 작업이 제대로 되었는지 확인해주세요.


2) 쇼핑몰 설정이 안되었을 경우


-> 관리자 페이지 -> 쇼핑몰관리 -> 쇼핑몰설정 -> sms설정 -> sms사용

sms사용안하시는데, 사용함(아이코드)으로 되어 있는지 확인해주세요.


-> 관리자 페이지 -> 쇼핑몰관리 -> 쇼핑몰설정 -> sms설정 -> 사전에 정의된 SMS프리셋 


아래 그림처럼 '사용' 체크해주시고, '확인'을 눌러주세요. 

0f301ed12e3fc78d9df2652353a9ae7f_1499319979_1955.png
 

1) 앱제작 요청시 기능 사용 여부를 알려주세요.

 

먼저 앱제작요청하실 때 저에게 카카오톡 링크 기능 사용 여부를 알려주셔야 합니다.

그러면 제가 카카오톡 링크 기능을 위한 해시키 값을 드릴 것입니다.

이 값을 복사해 놓습니다.

 

 

 

 

2) 대표이미지 ftp로 올리기

 

카카오톡 공유를 할 때, 해당 게시글에 이미지가 있을 경우에는 카카오톡으로 그 이미지를 전송하지만, 이미지가 없는 게시글 또는 페이지를 공유할 때는 사이트의 대표이미지를 보여주어야 합니다.

때문에 사이트 로고나 대표이미지를 gnupushapp.png 파일명으로 300x300 사이즈 정도로 해서 ftp를 이용해 도메인 서버 루트에 올려주셔야 합니다. (이미지 사이즈가 꼭 300x300일 필요는 없습니다.) 서버루트란 그누보드의 index.php 파일이 위한 곳을 말합니다. 

 

 

 

3) 카카오톡 개발자 사이트 회원가입 및 앱생성

 

https://developers.kakao.com/ 

 

여기로 가셔서 회원가입 해주세요.

 

※ 만일 카카오톡 소셜로그인을 사용중이어서 이미 개발자로 가입되어 있는 경우에는 회원가입 및 앱 생성 부분은 안 하셔도 됩니다.

 

앱생성 방법에 대해서는 카카오톡 개발가이드 참조해주세요.

https://developers.kakao.com/docs/android#시작하기-앱-생성

 



3) 안드로이드 플랫폼 추가

 

해당 앱으로 들어가셔서 앱정보의 설정을 클릭하시고...

 

c4715fd26d10fdf3886493dad344fdf3_1494382419_7489.png

 


 

c4715fd26d10fdf3886493dad344fdf3_1494382436_7771.png
 

 

(중요~~~~)

여기서 [네이티브 앱 키] 값을 카피해서 저에게 댓글이나 메일이나 쪽지로 알려주셔야 합니다.

 

 

그리고 플랫폼 추가해서 안드로이드 추가해줍니다.

 

 

c4715fd26d10fdf3886493dad344fdf3_1494382505_9847.png
 

 

안드로이드 플랫폼을 추가해주신 후, 패키지명, 마켓 url, 그리고 앞서 제가 드렸던 해시키 값을 입력합니다. '저장'을 눌러줍니다.

 

마켓 url은 market://details?id=패키지명 이렇게 작성해주시면 됩니다. 

 


4) 웹 플랫폼 추가

 

※ 카카오톡 로그인 사용하시는 분들은 이 과정을 뛰어넘어주세요.


소셜로그인 사용하지 않더라도 소셜로그인 플러그인을 설치해주시고,

카카오톡 개발자 페이지에서 웹플랫폼을 추가해주셔서 도메인 주소를 정확하게 적어주세요. redirect url은 소셜로그인에  안내되어 있는 callback 주소를 적어주세요.


5) 플러그인 설정


마지막으로 gnu푸시앱 플러그인 설정화면에 들어가셔서 퀵메뉴설정-카카오톡 링크 기능 사용 설정해주시면 됩니다.

우선 등록기기 목록에서 하나의 기기 선택하셔서 푸시알림 직접 날려보셔야 합니다.

 

1) 등록기기 목록에서의 푸시알림은 정상작동할 경우


이 경우는 FCM에는 문제가 없지만, 푸시알림동작 비동기처리를 위한 소켓방식에 문제가 있는 경우입니다.

이럴 경우는 아래 환경설정화면의 '푸시동작설정' 카테고리로 가셔서 [소켓방식 딜레이값]을 1로 바꾸어서 '수정'버튼 눌러주시고 다시 테스트 확인해주세요. 

 

만일 그렇게 해도 안된다면 2 를 입력해주시고 다시 테스트해주세요. 그래도 안된다면 다시 0으로 입력해주시고, 아래의 다른 방법을 사용해주셔야 합니다.

 

[푸시동작설정]-[푸시처리방식]

 

[기본curl방식]으로 안된다면 [기본curl방식2]​로 변경해주시고, 그래도 안된다면 [curl_multi사용]로 설정해주시고 테스트해주세요.

 

그래도 안된다면, 푸시동작방식을 ajax방식으로 변경해주시고 테스트해주셔야 합니다.

 

 

그리고 사용하시는 모든 테마 혹은 메인페이지의 head파일을 수정해주셔야 합니다.

head.php파일의 상단 아무곳에 아래의 내용을 추가해주시면 됩니다. 

 

<?php include_once(G5_PLUGIN_PATH.'/gnupushapp/gnupushapp_ajax.php'); ?>

 

 

2) 등록기기 목록에서의 푸시알림도 안 될 경우

 

이것은 FCM(푸시알림서버와의 연동) 이 제대로 동작하지 않고 있다는 증거입니다. api key에 문제가 있거나 그외 여러가지 문제가 있을 수 있습니다. 

플러그인 환경설정의 [기본설정]에서 api key를 정확하게 입력하셨는지 확인해주세요. api key값에 혹시 공백도 같이 들어가 있는지 확인해주세요.

또는 서버의 php가 curl을 지원하는지 여부도 확인해주세요. (거의 대부분의 경우가 api key를 잘못 입력해주시는데, 이 부분 꼭 확인 부탁드립니다. fcm작업하다면 api key라는 값이 많이 나오는데, 다 잘못된 값이고, 오직 클라우드메시징 페이지의 서버키여야 합니다. 앱제작과정 게시판의 내용을 꼭 참조해주세요. 

 

 

----------------------------------------------------------------------

 

새글 및 댓글 알림이 안되는 경우

 

아래 사항을 확인해주세요. 

 

1) 코어수정파일 작업이 제대로 되었는지 여부 -> http://gnupushapp.com/bbs/board.php?bo_table=notice

 

2) 다른 아이디로 글작성했는지 여부(자기가 쓴 글은 자기에게 알림이 되지 않습니다.)

 

3) 테스트하는 게시판을 앱설정창 => 구독게시판 목록설정에서 구독체크했는지 여부

 

4) 플러그인 최신버전으로 정확한 위치에 모든 파일이 정상적으로 설치가 되어있는지 여부(의외로 많은 분들이 ftp로 올렸는데 부분적으로 업로드하였거나 혹은 파일 누락되어 올려지지 않은 파일이 있는 경우가 있습니다. ftp는 알ftp말고 filezilla를 사용해주세요.)

 

 

3) 서버 세팅이 잘못되어 있을 경우

 

아래 내용은 FCM에서 요구하는 서버설정 사항입니다. 아래 사항이 서버에 적용되었는지 서버쪽을 체크해주세요.

(https://firebase.google.com/docs/cloud-messaging/concept-options)

 

 

----------------------------------

 

FCM 포트 및 방화벽

조직에 인터넷 트래픽 송수신을 제한하는 방화벽이 있으면 모바일 기기의 FCM 연결을 허용하도록 구성해야 네트워크의 기기에서 메시지를 수신할 수 있습니다. FCM은 대개 포트 5228을 사용하지만 5229 및 5230을 사용하는 경우도 있습니다.

발신 연결의 경우 Google IP 범위가 매우 자주 변경되며 개발자의 방화벽 규칙이 오래되면 사용자 경험에 영향을 줄 수 있으므로 FCM에서 특정 IP를 제공하지 않습니다. IP 제한 없이 포트 5228~5230을 허용하는 것이 가장 좋습니다. 하지만 IP 제한이 있어야 한다면 Google ASN 15169에 나와 있는 IPv4 및 IPv6 블록의 모든 IP 주소를 허용해야 합니다. 목록의 크기가 크며 규칙을 매월 업데이트하도록 계획을 세워야 합니다. 방화벽 IP 제한으로 인해 발생하는 문제는 보통 간헐적이며 진단하기 어렵습니다.

수신 메시지용으로 열어야 하는 포트:

  • 5228
  • 5229
  • 5230

발신 연결을 허용하는 포트:

다음 중 하나(1번 옵션 권장):

  1. IP 제한 없음
  2. Google ASN 15169에 나와 있는 IP 블록에 포함된 모든 IP 주소: 한 달에 한 번 이상 업데이트해야 합니다.

네트워크 주소 변환 및 상태 추적 패킷 검사 방화벽:

네트워크에서 네트워크 주소 변환(NAT)이나 상태 추적 패킷 검사(SPI)를 구현하는 경우 포트 5228~5230을 통한 연결에 대해 30분 이상의 제한 시간을 구현하세요. 이렇게 하면 Google에서 사용자 휴대기기의 배터리 소비를 줄이면서 안정적인 연결을 제공할 수 있습니다.

참고: APN을 통해 알림을 수신하는 경우에는 Apple에서 지정한 포트도 열어야 합니다.