Extra Form
PHP PHP 7.1
CMS XpressEngine

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

 

 

 

 

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

/**
 * Mobile class
 *
 * @author NAVER ([email protected])
 */
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');
    }
}
?>
 

  • profile

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

     

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

     

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

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

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

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

     

  • ? profile

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

     

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

  • profile ?

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

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

    아래가 웹앱 화면입니다.

     

    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

     

     

  • ? profile

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

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

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

  • ? profile
    웹에서는 모바일로 잘 보이네요.
    다만 모바일이 화면 크기에 따른 반응형은 아니고, 모바일 레이아웃을 별도로 사용하는 형태로 보입니다.
    그렇다면 앱에서 에이전트이름에 이것이 모바일이라는 것을 알려주는 글자가 없다는 것이네요.
    에이전트에 Mobile라는 글자가 추가되도록 해보세요.
  • profile
    앱 개발자분이 뭔가 잘 못하시는 듯 합니다.
    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


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