본문 바로가기

개발도구/iOS - 아이폰 개발

[ios] 푸시 한글 깨짐

푸시 php 소스를 구현하여 처리를 해보아도 영어 와 숫자는 잘 푸시가 들어 가는데 이상하게 한글은 소리만 나고 문자가 노티피케이션 센터에 나오지를 않는다. 검색을 해보니, utf-8 과 euc-kr의 차이라 하는데, 전혀 예상하지 못했었다. 

그래서 변환 하는 코드를 확인하여 중요하다 하여 변경해 보아도 잘 처리가 안되엇다. 결국 php 소스를 다른것으로 교체하기로 하고 아래의 소스를 참고 하기로 하였다. 


주소 : http://........php? mcontents=준비됬나요?

빨강색만 수정하여 사용하세요

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<?php

$alert = $_REQUEST["mcontents"];

echo $alert;

//exit;

//$alert ="준비됬나요??";

// 먼저 푸쉬를 넣을 때 표시할 문구와 기본적인 푸쉬 요소를 입력한다.

$payload = array();


$payload['aps'] = array('alert' =>  $alert, 'badge' => 0, 'sound' => 'default');

//alert은 푸쉬가 도착했을 때 표시할 문구이고 badge는 푸쉬가 도착했을 때 아이콘에 표시할 뱃지 수이고

//sound는 푸쉬가 도착했을 때 알림 소리이다.

//이제 이 것을 JSON문법 형태로 고쳐야 한다.

$push = json_encode($payload);

//아주 간단하다. 만약 변환된 형태가 궁금하다면 최상단의 링크를 참조하시라.

//만약 푸쉬를 통해서 앱으로 추가적인 정보를 전달해야 한다면 JSON으로 변환 전 추가적인 작업을 하자.

//$payload['extra_info'] = array('name' => 'Lifeclue', 'blog' => 'http://blog.naver.com/legendx');

//이런식으로 하면 푸쉬가 도착했을 때 앱에서 추가적으로 자료를 활용할 수 있다.

//이제 아까 만들었던 pem파일을 써먹을 차례다. 경로를 입력하자.

//만약 작성중인 php 파일과 같은 경로에 있다면

//테스트용
$apnsCert = 'apns-dev.pem';

//배포용
//$apnsCert = 'apns-pro.pem';


//그리고 애플의 푸쉬서버와 통신할 stream context를 작성한다.

$streamContext = stream_context_create();

stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert);

//그대로 갖다 붙이면 된다;

//이제 애플의 푸쉬 서버에 연결해보자.

//테스트용
$apns = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $error, $errorString, 60, STREAM_CLIENT_CONNECT, $streamContext);

//실제 배포용
//$apns = stream_socket_client('ssl://gateway.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);


//만약 앱을 배포할 때에는 애플 프로비저닝 포털의 App ID에서 개발용이 아닌 배포용 푸쉬 인증서를 받으신 후

//키체인에서 다시 인증서와 키를 추출한 후에 pem으로 돌리고 서버에 올리신 후 위에 있는 $apnsCert 변수의

//파일명을 바꿔주시면 되며, 바로 이 위에 있는 $apns변수의 주소에서 sandbox를 빼주시면 된다.

//ssl://gateway.push.aple.com

if (!$apns) {

print "Failed to connect $error $errorString\n";

return;

//만약 요청에 실패하면 Failed to connect가 브라우저에 뜰 것이다.

//자, 이제 드디어 푸쉬를 넣을 차례다!

$apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', "d33c32bfde342cf35e0c2ebe77295e2250fbbd2dafcd....-디바이스토큰값")) . chr(0) . chr(strlen($push)) . $push;

$writeResult = fwrite($apns, $apnsMessage);

//마지막으로 썼던 것은 스스로 정리하자.

//socket_close($apns);

fclose($apns);

?>

그래도 한글이 깨지거나 소리만 난다면 

meta 쪽을 euc-kr , utf-8 / 

또는 

 iconv("EUC-KR", "UTF-8", 한글 문자열); , iconv("UTF-8", "EUC-KR", 한글 문자열);

처리하여 보자!!!