[ios] iOS 7에서 자동 푸시 알림이 작동하지 않습니다.

WWDC 2013의 “멀티 태스킹의 새로운 기능”프레젠테이션에는 자동 푸시 알림에 대한 섹션이 있습니다. 똑바로 보인다. 프레젠테이션에 따르면 사용 가능한 콘텐츠 만 1로 설정 한 상태에서 APS 페이로드를 보내면 사용자에게 알림이 표시되지 않습니다.

// A. This doesn't work
{
  aps: {
          content-available: 1
       }
}

내 테스트에 따르면 푸시가 수신되지 않아 작동하지 않는 것으로 나타났습니다. 그러나 사운드 속성을 포함하고 경고 속성을 제외하면 작동합니다 (더 이상 조용하지는 않지만).

// B. This works
{
  aps: {
          content-available: 1,
          sound: "default"
       }
}

그러나 무음 오디오를 재생하도록 사운드 속성을 변경하면 무음 푸시를 흉내낼 수 있습니다.

// C. This works too.
{
  aps: {
          content-available: 1,
          sound: "silence.wav"
       }
}

아는 사람 있나요:

  1. 이것이 버그라면?
  2. 그리고 B 또는 C가 원격 알림으로 취급되고 있다고 가정하는 것이 옳다면 (사운드 속성이 필요한 자동 푸시의 버그가 아님)? 그렇다면 이는 무음 푸시처럼 속도 제한이 없다는 것을 의미합니다. 그래서 나는 그것에 의존해서는 안됩니다.
  3. 속도 제한은 무엇입니까 (N은 X 초마다 푸시 등)?

미리 감사드립니다.

추가 정보로 편집

A의 경우 애플리케이션 상태는 중요하지 않습니다. 알림이 수신되지 않습니다.

아래와 같이 속성과 값을 따옴표로 묶는 경우에만 B와 C가 작동하는 것처럼 보입니다.

{"aps":{"content-available": 1, "sound":"silent.wav"}}

그리고 알림 은 상태에 관계없이 application : didReceiveRemoteNotification : fetchCompletionHandler :에 도착합니다 .



답변

이것은 또한 작동하며 도착했을 때 소리가 나지 않습니다.

{
    aps = {
        "content-available" : 1,
        sound : ""
    };
}

편집하다

이 문제가있는 사람들은이 링크 를 확인하는 것이 좋습니다. 나는 모든 앱 상태와 자동 푸시가 수신되고 수신되지 않을 때를 다루는 Apple 개발자 포럼의 스레드에 참여했습니다.


답변

그래서 어제이 문제를 발견했고, 빈 문자열로 설정된 사운드와 함께 페이로드를 보내려고 시도한 후에도 여전히 장치에서 진동 / 사운드가 발생했습니다. 결국 저는 Urban Airship의 블로그 게시물에서 다음을 보내야한다고 제안했습니다.

{ priority: 5 }

한 번도 본 적이없는 푸시 알림에서. 푸시 알림에 대한 Apple 문서를 숙독 한 후이 페이지에서 우연히 발견했습니다.

https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingwithAPNs.html

우선 순위가 “5”또는 “10”으로 설정되어야 함을 나타내며 다음을 설명합니다.

알림의 우선 순위입니다. 다음 값 중 하나를 제공하십시오.

10 푸시 메시지가 즉시 전송됩니다.

푸시 알림은 장치에서 경고, 소리 또는 배지를 트리거해야합니다. 콘텐츠 사용 가능 키만 포함 된 푸시에이 우선 순위를 사용하는 것은 오류입니다.

5 푸시 메시지는 수신 장치의 전원을 절약하는 시간에 전송됩니다.

궁극적으로 다음 형식으로 배지 카운트 (알림에서도 똑같이 할 수있을 것 같음)로 작동하는 자동 푸시 알림을받을 수있었습니다.

    aps =     {
        badge = 7;
        "content-available" = 1;
        priority = 5;
    };


답변

경고 속성으로 빈 문자열을 설정하려고 시도했지만 작동했습니다.

{
    aps =     {
        "content-available" = 1;
        "alert" = "";
    };
}

APNS가 푸시 페이로드의 유효성을 검사하기 위해이 속성의 존재를 확인하는 것 같습니다. 흥미롭게도 그들은 실제 내용을 확인하지 않습니다. 그래도 약간 엉뚱한 것 같습니다 …


답변

도구를 사용합니다. Knuff 가 내 장치로 푸시 알림을 보냅니다.

다음과 같이 보입니다.
여기에 이미지 설명 입력

그런 다음이 예제를 시도했습니다.

모두 작동하지만 우선 순위 10을 설정해야합니다!

따라서 도구를 사용하지 않는 경우에도주의해야합니다.


예 :

  • 경고 없음, 소리 없음
{
    "aps":{
        "content-available":1,
    }
}

  • 경고 만
{
    "aps":{
        "content-available":1,
        "alert":""
    }
}

  • 소리 만
{
    "aps":{
        "content-available":1,
        "sound":""
    }
}


답변

이것은 나를 위해 작동합니다.

{
  aps: {
          content-available: 1
       }
}

체크 Background fetch박스 를 체크하면 Project Capabilities>Background Modes


답변

나는 같은 문제를보고있다. “content-available”: 1로 푸시를 보내고 다른 속성이 설정되지 않은 경우 알림이 수신되지 않습니다. 다른 속성을 추가하면 완벽하게 작동합니다.

일시적인 해결책으로 배지 속성을 아이콘에 추가하는 것 외에는 사용자에게 경고하지 않기 때문에 배지 속성을 추가하고 있습니다.

더 나은 해결책을 찾았다면 알려주세요.


답변

우선 순위는 바이너리 스트림에서 하나의 항목으로 설정되어야하지만 페이로드 json 문자열에서는 설정되지 않아야합니다. 다음과 같이 우선 순위를 설정하는 데 최신 유형 2 형식 만 사용할 수 있습니다.

$token      = chr(1) . pack('n', 32)     . pack('H*', $deviceToken);
$payload    = chr(2) . pack('n', strlen($json)) . $json;
$identifier = chr(3) . pack('n', 4)      . pack('N', $notification);
$expiration = chr(4) . pack('n', 4)      . pack('N', time()+86400);
$priority   = chr(5) . pack('n', 1)      . chr($priority);

$frame_data = $token.$payload.$identifier.$expiration.$priority;
$frame_length = strlen(bin2hex($frame_data))/2;

$msg = chr(2) . pack('N', $frame_length) . $frame_data;

원격 알림 바이너리 메시지의 형식 유형 (첫 번째 바이트) :

0-단순 (이전) 1-향상된 (이전) 2-더 많은 매개 변수가있는 최신 (신규)