Tag Archives: iPhone

[iPhone] Missing Push Notification Entitlement 해결하기

앱스토어에 새로 앱을 등록하고 아이튠즈 커넥트에서 Waiting for Review상태가 된것을 확인하고 안심하기에도 전에 다음과 같은 메일이 날라오는 경우가 있습니다.

사용자 삽입 이미지Missing Push Notification Entitlement라는 경고 메일이 도착하였습니다. 애플의 개발자 센터에서 Push Notification 서비스를 활성화 했지만 Entitlement에는 Push Notification의 활성화 여부를 기록하는 aps-environment정보가 존재하지 않는다는 메시지 입니다.

사용자 삽입 이미지
문제를 확인하기 위해 만들었던 Provisioning이 정상적으로 Active상태인지 확인합니다. 맞다면 다운 받아서 다음을 확인해 보도록 합니다. 터미널에서 다음의 명령으로 Provisioning의 내용을 확인할 수 있습니다.

$ security cms -D -i <filename.mobileprovision>
.
.
.
<dict>
    <key>application-identifier</key>
    <string>6JBPC845B4.kr.pe.theeye.sampleapp</string>
    <key>aps-environment</key>
    <string>production</string>
    <key>get-task-allow</key>
    <false/>
    <key>keychain-access-groups</key>
    <array>
        <string>6JBPC845B4.*</string>
    </array>
</dict>
.
.
.

Push Notification 설정이 잘못 되어있다면 위의 내용중에서 보이는 aps-environment정보가 누락되어있게 됩니다. 즉 다음의 내용이 존재하지 않을것입니다.

<key>aps-environment</key>
<string>production</string>

말이 복잡하지만 간단히 생각하면 사용하시는 Provisioning에 Push Notification정보가 누락된 상태라고 보시면 됩니다. 사실 푸시를 사용하지 않는 앱일 경우 무시해도 될 경고 메시지입니다만 리젝되는 경우도 많이 있다고 하니 무시하시면 안될 메일입니다.

사용자 삽입 이미지우선 가장 먼저 확인해 보셔야 할 부분은 개발자 센터의 App ID 메뉴에 진입하여 개발중인 앱의 Push Notification 정보를 확인해 보셔야 합니다. 당장에 Production환경의 Push Notification정보만 Enabled되어있으면 되지만 간혹 정상적으로 설정 되어있지만 위와 같이 나오지 않고 Configurable로 나오는 경우가 있습니다. 설정에 들어가 보면 정상적으로 설정이 되어있음에도 불구하고요.

사용자 삽입 이미지

[이 내용은 푸시 설정이 되어있음에도 App ID리스트 상에서 Enabled로 나오지 않을경우에만 참고하세요]
그 경우 어쩔수 없이 위와 같이 Production Push 인증서를 추가로 설정해 주셔야 합니다. 서비스의 무중단을 위하여 Production용 인증서는 동시에 2개까지 설정이 가능합니다. 추가를 해주시고 기존에 사용중인 인증서를 새로운 인증서로 교체해 주시기 바랍니다.

사용자 삽입 이미지정상적으로 추가가 되었다면 위와같이 Production용 인증서가 둘다 Enabled되어있는것을 확인하실 수 있습니다.

사용자 삽입 이미지

이제 다시 Provisioning을 갱신하여 사용하시면 됩니다. 하지만 여기서 중요한점은 단순히 갱신하는것보다는 위와 같이 아예 삭제를 한 뒤에 다시 새로 추가하시는것이 확실합니다. 몇번 해보니 갱신으로는 잘 안되는 경우가 있더군요.

위와 같은 과정을 거치게 되면 Provisioning에 정상적으로 aps-environment가 추가 되어있을 것이고 빌드하여 앱스토어에 등록하시면 문제 없이 등록이 될 것입니다.

[iPhone] URL스키마를 이용한 다른 어플리케이션 실행하기

아이폰 어플리케이션은 다른 외부의 어플리케이션을 URL을 사용하여 실행 할 수 있습니다. 예를 들어 다음의 어플리케이션들을 이와같은 URL을 이용하여 실행할 수 있습니다.

1. 일반 웹브라우저 호출

내가 원하는 임의의 페이지로 이동하는 방법은 간단합니다. 앞으로 소개해 드릴 방법 역시 다음과 같은 방법으로 URL을 호출하시면 됩니다.
[code]NSURL *url = [NSURL URLWithString:@”http://theeye.pe.kr”];
[[UIApplication sharedApplication] openURL:url];[/code]

2. 구글맵 실행

다음과 같이 구글맵은 검색을 위한 문자열을 사용하여 원하는 위치로 이동을 할 수 있습니다.

http://maps.google.com/maps?q=${QUERY_STRING}

여기서 중요한것은 ${QUERY_STRING}을 사용하기 위해서는 URL 인코딩을 하여야 한다는 것입니다. 간단한 예제는 다음과 같습니다.
[code]// 쿼리문 생성
NSString* searchQuery = @”1 Infinite Loop, Cupertino, CA 95014″;
 
// 특수 문자 처리를 위해 인코딩을 합니다.
searchQuery = [addressText stringByAddingPercentEscapesUsingEncoding:
                      NSUTF8StringEncoding];
 
// URL 문자열을 생성합니다.
NSString* urlString = [NSString stringWithFormat:
                              @”http://maps.google.com/maps?q=%@”,
                              searchQuery];
 
// 실행
[[UIApplication sharedApplication]
  openURL:[NSURL URLWithString:urlText]];[/code]

3. 메일 에이전트 실행

위와 마찬가지로 매우 쓸만하고 간단하고 빠르게 메일을 발송할 수 있는 메일 에이전트를 호출합니다. 기본적으로 들어있는 것을 호출하는 것뿐이지만 받는 사람 주소가 미리 입력되어있습니다. 메일을 발송하기 위한 기본적인 형태는 HTML의 그것과 매우 똑같습니다.

mailto://${EMAIL_ADDRESS}

예를 들어 test@abcd.com으로 발송하기 위해서는 다음과 같이 사용하면 됩니다.
[code][[UIApplication sharedApplication] openURL:[NSURL URLWithString:
  @”mailto://test@abcd.com”]];[/code]

4. 전화걸기 (아이폰에서만 사용 가능)

마찬가지로 openURL을 사용하여 전화도 걸 수 있습니다. 한가지 장점은 전화를 종료하였을 때 어플리케이션으로 복귀를 할 수 있다는 점입니다. J2ME나 WML에서 사용하는 UML 스키마의 형태와 비슷합니다. 예를 들어 02-1234-1234로 전화를 걸 경우 다음과 같이 하면 됩니다.
[code][[UIApplication sharedApplication] openURL:[NSURL URLWithString:@”tel://0212341234″]];[/code]

5. SMS 보내기

전화걸기와 마찬가지로 아이팟 터치등에서는 사용할 수 없습니다. 매우 빠르게 SMS 클라이언트를 호출 할 수 있습니다. SMS의 URL은 전화와 달리 //를 사용하지 않습니다.

sms:${PHONENUMBER_OR_SHORTCODE}

[code][[UIApplication sharedApplication] openURL:[NSURL URLWithString:@”sms:55555″]];[/code]

6. 앱스토어 실행하기

앱스토어에서 나의 어플리케이션의 구매 버튼이 있는 페이지로 바로 이동시키는것은 꽤 중요한 일입니다. 앱스토어 링크의 경우엔 따로 URL스키마를 사용할 필요가 없습니다. 단지 아이튠즈의 URL링크를 그대로 사용하면 됩니다. URL이 다음과 같이 보인다고 가정하겠습니다.

[code]NSURL *appStoreUrl = [NSURL URLWithString:@”http://itunes.apple.com/us/app/id396402081?mt=8″];
[[UIApplication sharedApplication] openURL:appStoreUrl];[/code]

잘 되는군요^^

출처: http://iphonedevelopertips.com/cocoa/launching-other-apps-within-an-iphone-application.html