새글

    최근 30일 이내 등록된 새글 이에요.
  • 언제 답변 주시나요?ㅠㅠ
    쩌리맨 2025-10-24 질문답변
  • 안녕하세요, 푸시매니저 입니다.최근 푸시매니저 서비스에 대한 작업 및 지원 기간이 지연되어 죄송합니다.현재 다른 서비스의 작업중인 사항이 있어 해당 작업에 몰두하고 있는 중입니다.최대한 빠르게 작업을 마무리하고 푸시매니저 유지보수에 신경쓰도록 하겠습니다.푸시매니저 서비스를 사용해주시는 분들께 감사의 말씀 드립니다.감사합니다.
    최고관리자 2025-10-22 공지사항
  • <?phpif (!defined('_GNUBOARD_')) exit;include_once("./_common.php");?><style type="text/css">/* 페이지 하단 여백 - 탭바 높이만큼 */body.pwa-mobile { padding-bottom: 60px;}/* 하단 고정 탭바 스타일 */.floating-tabbar { display: none; position: fixed; bottom: 0; left: 0; right: 0; height: 60px; background: rgba(0, 0, 0, 0.4); backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px); border-top: 1px solid rgba(255, 255, 255, 0.2); z-index: 1000; padding: 0 10px; box-shadow: 0 -4px 16px rgba(0, 0, 0, 0.2); transition: background 0.3s ease;}/* 밝은 배경용 스타일 */.floating-tabbar.light-mode { background: rgba(255, 255, 255, 0.95); border-top: 1px solid rgba(0, 0, 0, 0.1); box-shadow: 0 -4px 16px rgba(0, 0, 0, 0.1);}.floating-tabbar-container { display: flex; align-items: center; justify-content: space-between; height: 100%; width: 100%;}/* 히스토리 네비게이션 */.floating-tabbar-history { display: flex; align-items: center; gap: 8px; margin-right: 3px;}.floating-tabbar-history-btn { display: flex; align-items: center; justify-content: center; width: 50px; height: 35px; cursor: pointer; transition: all 0.3s ease; position: relative; overflow: hidden;}.floating-tabbar-history-btn:disabled { opacity: 0.3; cursor: not-allowed;}.floating-tabbar-history-btn::before { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: rgba(255, 255, 255, 0.2); border-radius: 8px; opacity: 0; transition: opacity 0.3s ease;}.floating-tabbar.light-mode .floating-tabbar-history-btn::before { background: rgba(0, 0, 0, 0.1);}.floating-tabbar-history-btn:not(:disabled):active::before { opacity: 1;}.floating-tabbar-history-btn:not(:disabled):active { transform: scale(0.9);}.floating-tabbar-history-icon { width: 24px; height: 24px; stroke: rgba(255, 255, 255, 0.9); transition: all 0.3s ease;}.floating-tabbar.light-mode .floating-tabbar-history-icon { stroke: rgba(0, 0, 0, 0.8);}.floating-tabbar-menu { display: flex; align-items: center; flex: 1;}.floating-tabbar-menu > div { flex: 1;}.floating-tabbar-item { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 4px; cursor: pointer; transition: all 0.3s ease; padding: 8px 12px; border-radius: 12px; user-select: none; position: relative; overflow: hidden; flex: 1; text-decoration: none;}.floating-tabbar-item::before { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: rgba(255, 255, 255, 0.2); border-radius: 12px; opacity: 0; transition: opacity 0.3s ease;}.floating-tabbar.light-mode .floating-tabbar-item::before { background: rgba(0, 0, 0, 0.1);}.floating-tabbar-item:active::before { opacity: 1;}.floating-tabbar-icon { width: 20px; height: 20px; stroke: rgba(255, 255, 255, 0.9); transition: all 0.3s ease;}.floating-tabbar.light-mode .floating-tabbar-icon { stroke: rgba(0, 0, 0, 0.8);}.floating-tabbar-item:active .floating-tabbar-icon { transform: scale(0.9);}.floating-tabbar-label { font-size: 10px; color: rgba(255, 255, 255, 0.8); font-weight: 500; transition: color 0.3s ease;}.floating-tabbar.light-mode .floating-tabbar-label { color: rgba(0, 0, 0, 0.7);}.floating-tabbar-refresh { display: flex; align-items: center; justify-content: center; width: 44px; height: 44px; background: rgba(255, 255, 255, 0.3); border: 1px solid rgba(255, 255, 255, 0.4); border-radius: 50%; cursor: pointer; transition: all 0.3s ease; position: relative; overflow: hidden;}.floating-tabbar.light-mode .floating-tabbar-refresh { background: rgba(0, 0, 0, 0.1); border: 1px solid rgba(0, 0, 0, 0.2);}.floating-tabbar-refresh::before { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: rgba(255, 255, 255, 0.2); border-radius: 50%; opacity: 0; transition: opacity 0.3s ease;}.floating-tabbar.light-mode .floating-tabbar-refresh::before { background: rgba(0, 0, 0, 0.1);}.floating-tabbar-refresh:active::before { opacity: 1;}.floating-tabbar-refresh:active { transform: scale(0.95);}.floating-tabbar-refresh-icon { width: 20px; height: 20px; stroke: #fff; stroke-width: 2; transition: transform 0.6s ease;}.floating-tabbar.light-mode .floating-tabbar-refresh-icon { stroke: #000;}.floating-tabbar-refresh.spinning .floating-tabbar-refresh-icon { transform: rotate(360deg);}/* PWA 모바일에서만 표시 */.pwa-mobile .floating-tabbar { display: block;}/* 매우 작은 화면에서 간격 조정 */@media (max-width: 400px) { .floating-tabbar { padding: 0 8px; } .floating-tabbar-item { padding: 6px 6px; } .floating-tabbar-refresh { width: 40px; height: 40px; } .floating-tabbar-history { margin-right: 4px; } .floating-tabbar-history-btn { width: 24px; height: 24px; } .floating-tabbar-history-icon { width: 12px; height: 12px; }}/* 안전 영역 대응 (iPhone X 이후) */@supports (bottom: env(safe-area-inset-bottom)) { .floating-tabbar { padding-bottom: env(safe-area-inset-bottom); height: calc(60px + env(safe-area-inset-bottom)); } body.pwa-mobile { padding-bottom: calc(60px + env(safe-area-inset-bottom)); }}</style><!-- 모바일 하단 고정 탭바 --><div class="floating-tabbar"> <div class="floating-tabbar-container"> <!-- 히스토리 네비게이션 --> <div class="floating-tabbar-history"> <button class="floating-tabbar-history-btn" id="historyBack" onclick="goBack()" disabled> <svg class="floating-tabbar-history-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <polyline points="15,18 9,12 15,6"/> </svg> </button> <button class="floating-tabbar-history-btn" id="historyForward" onclick="goForward()" disabled> <svg class="floating-tabbar-history-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <polyline points="9,18 15,12 9,6"/> </svg> </button> </div> <div class="floating-tabbar-menu"> <?php if (isset($is_member) ? $is_member : '') { ?> <!-- 회원용 탭바 --> <div><a href="<?php echo G5_URL ?>" class="floating-tabbar-item"> <svg class="floating-tabbar-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/> <polyline points="9,22 9,12 15,12 15,22"/> </svg> <span class="floating-tabbar-label">홈</span> </a></div> <div><a href="<?php echo G5_URL ?>/dashboard" class="floating-tabbar-item"> <svg class="floating-tabbar-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <rect x="3" y="3" width="7" height="7"/> <rect x="14" y="3" width="7" height="7"/> <rect x="14" y="14" width="7" height="7"/> <rect x="3" y="14" width="7" height="7"/> </svg> <span class="floating-tabbar-label">대시보드</span> </a></div> <div><a href="javascript:void(0);" onclick="toggleFloatingNotification()" class="floating-tabbar-item"> <svg class="floating-tabbar-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z"/> <polyline points="22,6 12,13 2,6"/> </svg> <span class="floating-tabbar-label">알림</span> </a></div> <div><a href="<?php echo G5_URL ?>/rb/home.php?mb_id=<?php echo $member['mb_id'] ?>" class="floating-tabbar-item"> <svg class="floating-tabbar-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"/> <circle cx="12" cy="7" r="4"/> </svg> <span class="floating-tabbar-label">마이페이지</span> </a></div> <?php } else { ?> <!-- 비회원용 탭바 --> <div><a href="<?php echo G5_URL ?>" class="floating-tabbar-item"> <svg class="floating-tabbar-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/> <polyline points="9,22 9,12 15,12 15,22"/> </svg> <span class="floating-tabbar-label">홈</span> </a></div> <div><a href="<?php echo G5_BBS_URL ?>/board.php?bo_table=free" class="floating-tabbar-item"> <svg class="floating-tabbar-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M3 3h18v18H3zM9 9h6m-6 4h6m-6 4h4"/> <line x1="9" y1="9" x2="15" y2="9"/> <line x1="9" y1="13" x2="15" y2="13"/> <line x1="9" y1="17" x2="13" y2="17"/> </svg> <span class="floating-tabbar-label">게시판</span> </a></div> <div><a href="<?php echo G5_BBS_URL ?>/board.php?bo_table=notice" class="floating-tabbar-item"> <svg class="floating-tabbar-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/> <polyline points="14,2 14,8 20,8"/> <line x1="16" y1="13" x2="8" y2="13"/> <line x1="16" y1="17" x2="8" y2="17"/> <polyline points="10,9 9,9 8,9"/> </svg> <span class="floating-tabbar-label">공지</span> </a></div> <div><a href="<?php echo G5_BBS_URL ?>/login.php" class="floating-tabbar-item"> <svg class="floating-tabbar-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4"/> <polyline points="10,17 15,12 10,7"/> <line x1="15" y1="12" x2="3" y2="12"/> </svg> <span class="floating-tabbar-label">로그인</span> </a></div> <?php } ?> </div> <button class="floating-tabbar-refresh" onclick="floatingTabbarRefresh()"> <svg class="floating-tabbar-refresh-icon" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" d="M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0 3.181 3.183a8.25 8.25 0 0 0 13.803-3.7M4.031 9.865a8.25 8.25 0 0 1 13.803-3.7l3.181 3.182m0-4.991v4.99" /> </svg> </button> </div></div><script>// 히스토리 네비게이션 함수들function updateHistoryButtons() { const backBtn = document.getElementById('historyBack'); const forwardBtn = document.getElementById('historyForward'); const currentIndex = parseInt(sessionStorage.getItem('historyIndex') || '0'); const maxIndex = parseInt(sessionStorage.getItem('maxHistoryIndex') || '0'); backBtn.disabled = currentIndex <= 0; forwardBtn.disabled = currentIndex >= maxIndex;}function goBack() { if (window.history.length > 1) { const currentIndex = parseInt(sessionStorage.getItem('historyIndex') || '0'); sessionStorage.setItem('historyIndex', Math.max(0, currentIndex - 1).toString()); window.history.back(); }}function goForward() { const currentIndex = parseInt(sessionStorage.getItem('historyIndex') || '0'); const maxIndex = parseInt(sessionStorage.getItem('maxHistoryIndex') || '0'); if (currentIndex < maxIndex) { sessionStorage.setItem('historyIndex', (currentIndex + 1).toString()); window.history.forward(); }}// 페이지 로드 시 히스토리 인덱스 업데이트function trackPageNavigation() { const currentIndex = parseInt(sessionStorage.getItem('historyIndex') || '0'); if (performance.navigation.type === 0) { const newIndex = currentIndex + 1; sessionStorage.setItem('historyIndex', newIndex.toString()); sessionStorage.setItem('maxHistoryIndex', newIndex.toString()); } updateHistoryButtons();}// 배경 밝기 감지 및 테마 자동 변경function detectFloatingTabbarBrightness() { const tabbar = document.querySelector('.floating-tabbar'); if (!tabbar) return; const footer = document.querySelector('footer'); if (footer) { const footerRect = footer.getBoundingClientRect(); const windowHeight = window.innerHeight; // 푸터가 화면 하단 근처에 있는지 확인 if (footerRect.top < windowHeight) { tabbar.classList.remove('light-mode'); } else { tabbar.classList.add('light-mode'); } } else { tabbar.classList.add('light-mode'); }}// 스크롤 시 배경 감지let floatingTabbarTicking = false;function updateFloatingTabbarTheme() { if (!floatingTabbarTicking) { requestAnimationFrame(() => { detectFloatingTabbarBrightness(); floatingTabbarTicking = false; }); floatingTabbarTicking = true; }}// 새로고침 버튼function floatingTabbarRefresh() { const refreshBtn = document.querySelector('.floating-tabbar-refresh'); refreshBtn.classList.add('spinning'); setTimeout(() => { location.reload(); }, 600);}// popstate 이벤트 리스너window.addEventListener('popstate', function(event) { setTimeout(updateHistoryButtons, 100);});// 초기화document.addEventListener('DOMContentLoaded', function() { trackPageNavigation(); window.addEventListener('scroll', updateFloatingTabbarTheme); window.addEventListener('resize', updateFloatingTabbarTheme); detectFloatingTabbarBrightness(); updateHistoryButtons(); // 터치 피드백 document.querySelectorAll('.floating-tabbar-item, .floating-tabbar-refresh, .floating-tabbar-history-btn').forEach(element => { element.addEventListener('touchstart', function() { if (!this.disabled) { this.style.transform = 'scale(0.95)'; } }); element.addEventListener('touchend', function() { setTimeout(() => { this.style.transform = ''; }, 150); }); });});</script>기존 플로팅 툴바를 하단에 고정하고 하단에 60px 여백을 줌
    토시아 2025-10-21 유저자료실
  • 설정을 저장해도 저장값이 저장안되고 계속 내용이 사라지네요...DB 업데이트도 했건만 계속 사라지네요iwinv 호스팅 사용중입니다.
    토시아 2025-10-21 질문답변
  • 저도 iwinv 쓰고있는데 동일현상입니다. 혹시 해결하셨나요?
    토시아 2025-10-21 질문답변
  • 비밀 댓글입니다.
    쩌리맨 2025-10-15 질문답변
  • 비밀글로 홈페이지 주소를 남겨주시면 확인 해보겠습니다.
    최고관리자 2025-10-15 질문답변
  • 프로그램 설치후 설정도 정확하게 다했고 테스트 발송 기능에서 직접 발송 처리를 해보았는데 알림이 오지 않습니다.사이트에 직접 접속해서 알림아이콘 클릭해서도 보이고 발송 로그에서도 정상적으로 발송 되었다고 기록이 되어 있는데 실제는 오지 않네요 뭐가 문제가 있는걸까요?
    쩌리맨 2025-10-15 질문답변
  • 관리자용으로는 알림을 생각도 못했네요. 이렇게 응용할 수도 있었군요. 좋은 아이디어 감사합니다. ^^
    민트다이어리 2025-10-15 질문답변
  • 저도 궁금했는데, 가능하군요. ^^
    민트다이어리 2025-10-15 질문답변
  • 안녕하세요. 푸시매니저입니다.홈페이지 리뉴얼이 조기 완료 되었습니다.감사합니다.------------------안녕하세요, 푸시매니저입니다.먼저 다른 작업에 몰두하며 푸시매니저 서비스 관리에 미흡했던 점에 대해서 죄송의 말씀 드립니다.더욱 더 품질 높은 서비스를 제공하기 위해 홈페이지 개편이 이루어질 예정입니다.홈페이지 개편은 10월 14일 13시부터, 10월 16일 09시까지 이루어질 예정이며, 푸시매니저 서비스는 정상적으로 이용이 가능합니다.감사합니다.
    최고관리자 2025-10-14 공지사항
  • 빠른 답변 감사합니다!
    쩌리맨 2025-10-14 질문답변
  • 비회원의 경우 알림수신 설정 후 수신까지 문제없이 구현은 가능합니다만, 추후 알림 수신을 해제할때 기기 설정에서 해제 하는 방법 외에 알림 구독 해제 방법에 제한이 있을 수 있습니다. 차후 관리자 설정에서 푸시 알림 수신 구독 허용 범위를 직접 설정하실 수 있도록 개편하겠습니다.
    최고관리자 2025-10-14 질문답변
  • 우선 정말 좋은 서비스 만들어 주셔서 감사합니다.혹시 제가 원하는 기능의 경우는꼭 회원이 아니더라도 기기에서 구독 설정을 했을때 PWA 푸시 알림처리를 하고 싶은데 그건 불가능 한걸까요???꼭 회원으로 가입해야 지만 가능한것인지 문의 드립니다.감사합니다.
    쩌리맨 2025-10-14 질문답변
  • 안녕하세요.파일업로드후 관리자모드에서 푸시매니저 설치를 눌렀는데아래와 같은 에러가 팝업이 됩니다.pushmanager_config 테이블이 미생성 / 업로드 디렉토리 미생성나머지 테이블은 설치가 되었구요. 설치 중 오류가 발생했습니다. 1101 : BLOB/TEXT column 'pwa_popup_description' can't have a default value어떤경우 일까요?
    천팔 2025-10-11 질문답변