Q&A

CMS/프레임워크 XE 1.x
개발 언어 PHP 7.1

아래 Mobile.class.php 에서 뭘 어떻게 바꿔야 되는건가요?

 

 

 

 

<?php
/* Copyright (C) NAVER <http://www.navercorp.com> */

/**
 * Mobile class
 *
 * @author NAVER (developers@xpressengine.com)
 */
class Mobile
{

    /**
     * Whether mobile or not mobile mode
     * @var bool
     */
    var $ismobile = NULL;

    /**
     * Get instance of Mobile class(for singleton)
     *
     * @return Mobile
     */
    function &getInstance()
    {
        static $theInstance;
        if(!isset($theInstance))
        {
            $theInstance = new Mobile();
        }
        return $theInstance;
    }

    /**
     * Get current mobile mode
     *
     * @return bool If mobile mode returns true or false
     */
    function isFromMobilePhone()
    {
        $oMobile = & Mobile::getInstance();
        return $oMobile->_isFromMobilePhone();
    }

    /**
     * Get current mobile mode
     *
     * @return bool
     */
    function _isFromMobilePhone()
    {
        if($this->ismobile !== NULL)
        {
            return $this->ismobile;
        }
        if(Mobile::isMobileEnabled() ===  || Context::get('full_browse') || $_COOKIE["FullBrowse"])
        {
            return ($this->ismobile = false);
        }

        $xe_web_path = Context::pathToUrl(_XE_PATH_);

        // default setting. if there is cookie for a device, XE do not have to check if it is mobile or not and it will enhance performace of the server.
        $this->ismobile = FALSE;

        $m = Context::get('m');
        if(strlen($m) == 1)
        {
            if($m == "1")
            {
                $this->ismobile = TRUE;
            }
            elseif($m == "0")
            {
                $this->ismobile = FALSE;
            }
        }
        elseif(isset($_COOKIE['mobile']))
        {
            if($_COOKIE['user-agent'] == md5($_SERVER['HTTP_USER_AGENT']))
            {
                if($_COOKIE['mobile'] == 'true')
                {
                    $this->ismobile = TRUE;
                }
                else
                {
                    $this->ismobile = FALSE;
                }
            }
            else
            {
                $this->ismobile = FALSE;
                setcookie("mobile", FALSE);
                setcookie("user-agent", FALSE);
                if(!$this->isMobilePadCheckByAgent() && $this->isMobileCheckByAgent())
                {
                    $this->ismobile = TRUE;
                }
            }
        }
        else
        {
            if($this->isMobilePadCheckByAgent())
            {
                $this->ismobile = FALSE;
            }
            else
            {
                if($this->isMobileCheckByAgent())
                {
                    $this->ismobile = TRUE;
                }
            }
        }

        if($this->ismobile !== NULL)
        {
            if($this->ismobile == TRUE)
            {
                if($_COOKIE['mobile'] != 'true')
                {
                    $_COOKIE['mobile'] = 'true';
                    setcookie("mobile", 'true');
                }
            }
            elseif($_COOKIE['mobile'] != 'false')
            {
                $_COOKIE['mobile'] = 'false';
                setcookie("mobile", 'false');
            }

            if($_COOKIE['user-agent'] != md5($_SERVER['HTTP_USER_AGENT']))
            {
                setcookie("user-agent", md5($_SERVER['HTTP_USER_AGENT']));
            }
        }

        return $this->ismobile;
    }

    /**
     * Detect mobile device by user agent
     *
     * @return bool Returns true on mobile device or false.
     */
    function isMobileCheckByAgent()
    {
        static $UACheck;
        if(isset($UACheck))
        {
            return $UACheck;
        }

        $oMobile = Mobile::getInstance();
        $mobileAgent = array('Android','Mobile');

        if($oMobile->isMobilePadCheckByAgent())
        {
            $UACheck = TRUE;
            return TRUE;
        }

        foreach($mobileAgent as $agent)
        {
            if(stripos($_SERVER['HTTP_USER_AGENT'], $agent) !== FALSE)
            {
                $UACheck = TRUE;
                return TRUE;
            }
        }
        $UACheck = FALSE;
        return FALSE;
    }

    /**
     * Check if user-agent is a tablet PC as iPad or Andoid tablet.
     *
     * @return bool TRUE for tablet, and FALSE for else.
     */
    function isMobilePadCheckByAgent()
    {
        static $UACheck;
        if(isset($UACheck))
        {
            return $UACheck;
        }
        $padAgent = array('Android');

        // Android with 'Mobile' string is not a tablet-like device, and 'Andoroid' without 'Mobile' string is a tablet-like device.
        // $exceptionAgent[0] contains exception agents for all exceptions.
        $exceptionAgent = array(0 => array('Opera Mini', 'Opera Mobi'), 'Android' => 'Mobile');

        foreach($padAgent as $agent)
        {
            if(strpos($_SERVER['HTTP_USER_AGENT'], $agent) !== FALSE)
            {
                if(!isset($exceptionAgent[$agent]))
                {
                    $UACheck = TRUE;
                    return TRUE;
                }
                elseif(strpos($_SERVER['HTTP_USER_AGENT'], $exceptionAgent[$agent]) === FALSE)
                {
                    // If the agent is the Android, that can be either tablet and mobile phone.
                    foreach($exceptionAgent[0] as $val)
                    {
                        if(strpos($_SERVER['HTTP_USER_AGENT'], $val) !== FALSE)
                        {
                            $UACheck = FALSE;
                            return FALSE;
                        }
                    }
                    $UACheck = TRUE;
                    return TRUE;
                }
            }
        }

        $UACheck = FALSE;
        return FALSE;
    }

    /**
     * Set mobile mode
     *
     * @param bool $ismobile
     * @return void
     */
    function setMobile($ismobile)
    {
        $oMobile = Mobile::getInstance();
        $oMobile->ismobile = $ismobile;
    }

    function isMobileEnabled()
    {
        $db_info = Context::getDBInfo();
        return ($db_info->use_mobile_view === 'Y');
    }
}
?>
 

댓글 12

  • 원하는 것이 뭔지 제대로 설명하시지도 않고 코어 소스를 통째로 복붙하시면 대체 어쩌라는 건지...

     

    사이트 일반 설정 및 각 페이지/게시판의 설정 화면에서 "모바일 뷰 사용" 옵션이 켜져 있나요? 모바일 앱이라고 하셨는데, 특정 앱에서만 PC 화면이 나오는 건가요? 무슨 앱인가요? 기기 모델과 OS 버전은? 대답하는 사람이 저 위의 소스를 정말로 읽어보고 뭔가 쓸만한 대답을 내놓으려면 시간이 몇 분쯤 걸릴까요? 공짜로 답을 얻고 싶으시면 님도 그만한 정성을 들여서 질문을 쓰셔야지요.

     

    우선 뭔가 설정이 잘못된 것이 있나 살피고, 관련된 설정을 모두 확인한 후에도 여전히 마음에 안 드는 동작이 있으면 그 때 소스를 뜯어보는 것이 XE 방식입니다. ○○보드처럼 일단 소스부터 조지고 보는 방식은 노노예요. XE는 소스보다 사용자 설정이 우선입니다.

  • @기진곰
    아 죄송합니다.
    제가 이런쪽에 지식이 전혀 없는 상태로 모바일 웹앱 제작을 맡겼는데, 접속시 유저 에이전트가 app이나 Android일 경우 모바일 화면으로 보이게 설정해달라는 요청을 하셔서 혹시나해서 여기에 올려보게 되었습니다.
  • @기진곰

    개발자분이 웹앱 상태는 현재
    http://MainActivity.java는지금 앱으로 만들고있는데
    webSettings.setUserAgentString("app"); 이렇게 설정이되어있다고 하셨고요.

    제가 만든 웹사이트의 경우 XE 1.11.5버전이고 레이아웃은 반응형으로 웹도 구글 뒤져가면서 만들었습니다.
    사실 질문도 어떻게 해야되는지 몰라서 검색을 아무리해도 해당 정보가 안나오길래 무작정 글을 남기게 된거였어요.

     

  • @토토

    사이트 일반 설정 및 각 페이지/게시판의 설정 화면에서 "모바일 뷰 사용" 옵션이 켜져 있나요?
    사이트 일반 설정 및 각 페이지/게시판의 설정 화면에서 "모바일 뷰 사용" 옵션이 켜져 있나요?
    사이트 일반 설정 및 각 페이지/게시판의 설정 화면에서 "모바일 뷰 사용" 옵션이 켜져 있나요?
    사이트 일반 설정 및 각 페이지/게시판의 설정 화면에서 "모바일 뷰 사용" 옵션이 켜져 있나요?
    사이트 일반 설정 및 각 페이지/게시판의 설정 화면에서 "모바일 뷰 사용" 옵션이 켜져 있나요?

     

    레이아웃이 반응형으로 의도되었는지는 중요하지 않습니다. 님이 앱으로 접속했을 때 PC화면과 모바일화면을 구분하실 수 있다는 것은 제대로 된 반응형이 아니라는 뜻이니까요. XE에서 Android를 인식하도록 하는 것은 "모바일 뷰 사용" 옵션입니다. 그게 꺼져 있으면 다른 곳을 건드려봤자 소용없습니다.

  • @기진곰

    아 일반 크롬같은 플랫폼으로 봤을땐 제대로 모바일로 바껴서 나오는데 
    제작중인 웹앱에서는 풀사이즈로 나옵니다.

    웹앱 개발자분은 이걸 제가 스크립트 수정(?)을 해야 한다고 말씀하십니다.

    아래가 웹앱 화면입니다.

     

    KakaoTalk_20190903_081307081.jpg

     

     

    아래는 개발자분이 제게 하셨던 톡내용입니다.

     

     

     

    웹앱으로 사이트 접속시 PC화면으로 나오네요 ㅎ
    접속시 유저 에이전트가 app이나 Android일 경우 모바일 화면으로 보이게 설정해주시겠어요
    19.09.02 17:16
     
    아 반응형 스킨인데 모바일로 안바뀌나요?
        19.09.02 17:17
     
     
    웹브라우저로 접속시 반응형으로 잘 나옵니다 ㅎ
    웹앱으로 접속시에는 안나와서요.
    다른 고객분들도 그런 경우가 있었는대, 잘 변경해주시니까 됬습니다.
    19.09.02 17:19
     
    모바일뷰 사용으로 바꾸면 된다는 말이죠?
        19.09.02 17:19
     
     
    음 이 사이트가 참고가 되실거같습니다

    https://creativeprm.tistory.com/224

    http://MainActivity.java는
    제가 지금 앱으로 만들고있습니다
    webSettings.setUserAgentString("app"); 이렇게 설정이되어있구요
    19.09.02 17:30
     
    ???
        19.09.02 17:31
     
    제가 잘 몰라서...
        19.09.02 17:31
     
    아까 링크엔
        19.09.02 17:31
     

    http://mainactivite.java를
    수정해야된다고 되어있던데
        19.09.02 17:32
     
     
     
    유저에이전트가 앱으로 접속했을떄 반응형으로 화면이 보이게 해주시거나,
    아니면 app으로 접속할 url링크를 따로 주시거나 하면되겠습니다,
    19.09.02 17:32
     
    스크립트 추가했습니다.
        19.09.02 17:34
     
     
    네 alert알람 확인됬습니다. 이제 사이트 화면을 모바일로 해주시면됩니다.
    19.09.02 17:37
     
    그러면 반응형 스킨은 못쓰는네요?!
        19.09.02 17:39
     
    모바일뷰 사용으로 바꿨어요.
        19.09.02 17:42
     
     
    제가 xe 개발자는 아니라서, 자세히는 모르겠습니다 ㅎ

    https://xe1.xpressengine.com/tip/20901998

    해당 사이트가 참고가 되실수있을거같습니다.
    19.09.02 17:42
    아 이게 웹으로 강제로 고정이 되어있어서 모바일로 강제로 화면을 잡아둘 스크립트를 추가해야된다는 말씀이신거죠?
        19.09.02 17:51
     
     
    네 접속기기나 브라우저에 맞게 자연스럽게 접속하는거죠
    19.09.02 17:53
     
    뭘 해야되는지 이해는 했는데 [사이트 화면을 모바일로 해주시면됩니다.] 이걸 못하겠는데 어떡하죠?
        19.09.02 19:47
     
     
    음 모바일로 잡속하게되면 에이전트명이 어떤거일가요?
    19.09.02 19:51
     
    크롬 웹브라우저요
    19.09.02 19:51
     
    크롬이요
        19.09.02 19:51
     
     
    크롬으로 넣어서 빌드헤보겠습니다
    xe로 사용한 다른분은 설정을 하셨던걸로 기억해서요. 방법을 한번 찾아봐주세요 ㅎ
    19.09.02 19:53
     
        19.09.02 19:54
     
     
    에이전트를 크롬으로 변경해도 같은 결과네요.
    모바일 화면은 웹쪽에서 스크립트 작업을 하신다음 앱을 실행해서
    테스트를 해보시면 되는거기때문에, 앱패키징을 진행해서 플레이스토어에 올리겠습니다.
    19.09.03 04:33

     

     

  • @토토

    아랫분 말씀처럼 앱에서 UserAgent를 너무 성의없게 집어넣어서 그렇습니다. "app"이 아니라 정상적인 안드로이드 웹뷰 UserAgent가 나오도록 앱을 만들면 아무 문제가 없을 텐데, 지가 이상하게 만들어 놓고 사이트 운영자한테 감놔라 배놔라 하네요.

  • 앱이면....... 그 앱에서 어떻게 되어있는지도 정보가 필요하고
    xe의 설정도 어떻게 되어있는지도 정보가 필요하군요
  • @DoubleU
    앱은 제가 직접 만드는게 아니라서 제가 알고 있는 정보는 webSettings.setUserAgentString("app"); 이것밖에 없습니다.
  • 사이트 주소를 남기시면 일단 사이트의 문제인지, 앱의 문제인지는 확인이 가능합니다.
  • @DoubleU

    http://fromblink.cafe24.com/xe/ 한번 봐주시면 감사하겠습니다.

  • @토토
    웹에서는 모바일로 잘 보이네요.
    다만 모바일이 화면 크기에 따른 반응형은 아니고, 모바일 레이아웃을 별도로 사용하는 형태로 보입니다.
    그렇다면 앱에서 에이전트이름에 이것이 모바일이라는 것을 알려주는 글자가 없다는 것이네요.
    에이전트에 Mobile라는 글자가 추가되도록 해보세요.
  • 앱 개발자분이 뭔가 잘 못하시는 듯 합니다.
    XE는 브라우저의 에이전트 포함 문자열로 모바일을 구분합니다. 올려주신 파일의 코드가 그렇습니다.

    앱을 만들더라도 기본적으로 안드로이드가 가지는 에이전트 이름이 사라지지 않아야 할 것입니다. 그것이 사라지지 않는다면 앱으로 접속해도 똑같이 안드로이드 모바일 기기로 분류가 됩니다. 그래서 모바일로 보여집니다.

    타블렛,패드 와 같은 에이전트가 들어간 모바일기기는 PC형태로 보여지게 되어있구요.


    지금 XE사이트에서 가장 많이 사용하는 푸시앱에서는 아래와 같이 나오게 처리했으니
    Mozilla/5.0 (Linux; Android 6.0.1; STV100-3 Build/MMB29M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.143 Mobile Safari/537.36 APP_XEPUSH_Android


    이부분 개발자분께 의견을 전달해서 문제가 없도록 만들어야 합니다. 에이전트명을 추가하는 이유는 앱을 구분하기 위함인데 이 작업시 모바일 기기를 구분할 수 있는 문자열이 제거되어서는 안될 것 입니다.