IT story

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

hot-time 2020. 9. 16. 20:58
반응형

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"으로 설정되어야 함을 나타내며 다음을 설명합니다.

The notification’s priority. Provide one of the following values:

10 The push message is sent immediately.

The push notification must trigger an alert, sound, or badge on the device. It is an error to use this priority for a push that contains only the content-available key.

5 The push message is sent at a time that conserves power on the device receiving it.

Ultimately, we were able to get silent push notifications working with a badge count (and I suspect you could even do the same with an alert) with the following format:

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

I have tried setting an empty string as the alert attribute and it also worked:

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

It seems like APNS is checking for the existence of this attributes for the purpose of validating the push payload. Interestingly, they are not checking the actual content. It seems a little bit hacky though...


I use the tool-Knuff send my push notification to my device.

It looks like: enter image description here

Then,I tried these example.

They are all work!But you must set the priority 10!

So if you are not use the tool,you also note it.


examples:

  • no alert,no sound

{
    "aps":{
        "content-available":1,
    }
}

  • only alert

{
    "aps":{
        "content-available":1,
        "alert":""
    }
}

  • only sound

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


This works for me:

{ 
  aps: { 
          content-available: 1 
       }
}

Look if you check Background fetch checkbox in Project Capabilities > Background Modes


I'm seeing the same problem. If I send a push with "content-available":1 and no other attributes set, the notification is never received. When I add any other attributes it works perfectly.

As a temporary work around I'm adding the badge attribute as this doesn't alert the user in any way apart from adding the badge to the icon.

Let me know if you've found a better solution.


Priority should be set as one item in binary stream but not in payload json string. Apparently only the latest type 2 format can be used in setting priority as follows:

$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;

Format types (first byte) for remote notification binary message:

0 - simple (old) 1 - enhanced (old) 2 - latest with more parameters (new)


Argh! Also pulling my hair out -- this isn't so much an answer as another example of a payload which DOESN'T work. The didReceiveRemoteNotification method is never called, although if the device is sleeping, the alert text IS displayed.

 {"aps":
    {  "alert":"alert!",
       "sound":"default",
       "content-available" : 1},
    "content-id":21482,
    "apt":"1"
}

"apt" is a custom field we use to indicate the notification type.


Setting 'sound' to 0 worked for me... :)


setting priority to 5 did not work for me, but setting sound or alert to an empty string did cause the notification to be handled as a high priority one


We had the same issue with no Notification being delivered. In our case we were using a silent push to update the badge number. When we set empty strings for alert (body and title) and sound it would work, but if any of the keys were not present it failed. Here is what worked, updating the badge with no sound or alert (log of the resulting userInfo dictionary in didReceiveRemoteNotification)

{
    aps =     {
        alert =         {
            body = "";
            title = "";
        };
        badge = 103;
        "content-available" = 1;
        sound = "";
    };
}

참고URL : https://stackoverflow.com/questions/19239737/silent-push-notification-in-ios-7-does-not-work

반응형