8

다음과 같이 PHP를 사용하여 Firebase 알림을 내 웹 서비스를 통해 전송합니다. 앱이 전경과 배경에있을 때 안드로이드 앱이 최근 트레이에서 제거되었을 때 파이어베이스 (FCM) 알림이 나타나지 않습니다.

$url = 'https://fcm.googleapis.com/fcm/send'; 
     $fields = array(
      'registration_ids' => $tokens, 
      'data' => $message 
      ); 
     $headers = array(
      'Authorization:key = SERVER_KEY ', 
      'Content-Type: application/json' 
      ); 

1.Notifications

는 문제없이오고있다,하지만 알림이 오지 않아 다음 최근 트레이에서 응용 프로그램을 제거한 경우,이 이에 대한 모든 솔루션 처리 할 수 ​​있어야합니다? (Whatsup 알림 같은 설정 에서이 응용 프로그램을 중지 강제로 심지어 모든 시나리오를 보여주고있다)

2. "OnMessageReceived"이러한 메시지, 본문 내용을 내 활동/파편에 전달하는 방법 알림을 받습니까?

3. 모든 토큰을 배열에 추가하는 대신 모든 사람에게 알림을 보내려합니다. 그런 식으로 "모두에게 보내기"와 같이 처리 할 수있는 다른 방법은 없습니까?

public class MyFirebaseMessagingService extends FirebaseMessagingService { 
    private static final String TAG = "MsgService"; 
    @Override 
    public void onMessageReceived(RemoteMessage remoteMessage) { 
     Log.d(TAG, "From: " + remoteMessage.getFrom()); 
     Log.d(TAG, "Data Payload : " + remoteMessage.getData()); 
     sendNotification(remoteMessage.getData().get("message")); 
    } 
    private void sendNotification(String messageBody) { 
     Intent intent = new Intent(this, MainActivity.class); 
     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 
       PendingIntent.FLAG_ONE_SHOT); 
     Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
     NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) 
       .setSmallIcon(R.mipmap.ic_launcher) 
       .setContentTitle("Firebase Push Notification") 
       .setContentText(messageBody) 
       .setAutoCancel(true) 
       .setSound(defaultSoundUri) 
       .setContentIntent(pendingIntent); 
     NotificationManager notificationManager = 
       (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
     notificationManager.notify(0, notificationBuilder.build()); 
    } 
} 

실패 장치 (알림 는 최근 트레이에서 제거 후 오는되지 않음)

  • MI Redmi 주 2 (5.0.2 롤리팝)
  • 화웨이 명예 5C (5.1.1 롤리팝)

성공한 장치 : (최근 트레이에서 제거한 후에 알림이 전송 됨)

(210)
  • HTC 한 X (4.2 젤리 빈)
  • 삼성 은하 그랜드 프라임 (4.4 Kitkat으로)
+0

OS 버전 (Lollipop vs Jelly Bean 등)의 문제라고 생각하지 않습니다. Google Play 서비스가 수신자에게서 해산 된 앱을 깨울 수 있는지 여부는 문제가 될 가능성이 큽니다. 일부 제조업체에서는이 동작을 조정합니다. FCM 팀이 예상대로 작동하지 않는 장치를 더 깊이 볼 수 있도록 firebase 지원 문제를 제기하는 것이 좋습니다. https://firebase.google.com/support/ –

+0

데이터 메시지에도 동일한 문제가 있습니다. 그리고 내가 말할 수있는 한, 안드로이드의 어떤 버전에서도 작동하지 않습니다. 마시멜로와 롤리팝에 대한 테스트를 마쳤습니다. – rGun

+1

lava Irish x1 –

답변

5

앱은 어떤 문제없이 전경과 배경에있을 때 1.Notifications이오고있다, 그러나 경우 최근 트레이에서 앱을 삭제 한 다음 알림이 수신되지 않으면이 해결책을 처리해야합니다 ( ). 대신에 데이터를 전송하는, 당신은 알림을 전송하지 않는 한 당신이 remoteMessage.getNotification().getBody()에 널 포인터 예외를 받고해야 코드 당으로

(Whatsup 알림이 모든 시나리오를 보여주고있다처럼 심지어 힘은 설정에서이 응용 프로그램을 중지) 귀하의 컬 요청에서 페이로드. 내 개인적인 경험에 따르면 방금 언급 한 문제는 Android Kitkat 또는 그 이하의 기기에서 특히 많이 발생합니다. Lollipop 이상에서는 Firebase 푸시가 정상적으로 작동하는 것 같습니다.

2. "onMessageReceived"에서 이러한 메시지, 본문 내용을 내 Activity/Fragments에 전달하는 방법에 대한 알림을 받았습니까?

onMessageReceived()에서 브로드 캐스트를 발행하고 브로드 캐스트 수신자를 활동에 등록하고 브로드 캐스트 인 텐트로 보낼 수 있습니다.예제 코드 :

활동

private BroadcastReceiver receiver; 

@Overrride 
public void onCreate(Bundle savedInstanceState){ 

    // your oncreate code 

    IntentFilter filter = new IntentFilter(); 
    filter.addAction("SOME_ACTION"); 

    receiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     String message = intent.getStringExtra("message"); 
    } 
    }; 
    registerReceiver(receiver, filter); 
} 

@Override 
protected void onDestroy() { 
    if (receiver != null) { 
    unregisterReceiver(receiver); 
    receiver = null 
    } 
    super.onDestroy(); 
} 

FirebaseMessagingService

public class MyFirebaseMessagingService extends FirebaseMessagingService { 
    private static final String TAG = "MsgService"; 
    @Override 
    public void onMessageReceived(RemoteMessage remoteMessage) { 
     Log.d(TAG, "From: " + remoteMessage.getFrom()); 
     Log.d(TAG, "Notification Message Body: " + remoteMessage.getData()); 

     Intent intent=new Intent(); 
     intent.setAction("SOME_ACTION"); 
     intent.putExtra("message", remoteMessage.getNotification().getBody()); 
     sendBroadcast(intent); 
    } 
} 

3.In 내가 대신 배열에 대한 모든 토큰을 추가하는, 모든 알림을 보낼 경우는. "ALL로 보내기"와 같이 처리 할 수있는 다른 방법이 있습니까? 그런 식 으로요?

흰색 아이콘 문제처럼 처리 할 수있는 자신의 문제가 중포 기지 콘솔을 사용하고, 알림의 사용자 정의 PARAMS를 추출하고, 중포 기지 API에서이 작업을 수행 할 수있는 유일한 방법 "ALL 보내기"어디에도 없습니다.

+0

질문 3 : 각 사용자를 "주제"에 등록하면 "모두 전송"하는 것이 가능하다고 생각합니다. –

+0

@Hisham 방금 테스트 한 기기로 내 게시물을 편집했습니다. 제 경우에는 사전 트레이너 장치가 작동 중입니다. 최근 트레이에서 앱을 제거한 후 평균 알림이 오지만 ** Lollipop 기기 알림이 오지 않을 것입니다 ** 앱을 삭제할 때 모두 이것에 대한 단서? 또한 편집 된'sendNotification (remoteMessage.getData(). get ("message"));' – Chandrahasan

1

정확히 Mi Phone 및 Huawei 전화에서도 FCM에 문제가있었습니다. FCM이나 앱이 아니라 기기 수준에서 문제가 아니라는 것을 알았습니다.

알림 또는 잠자기 잠금을 사용 중지하는 기기 수준 앱 설정을 사용하므로 메시지가 도착하면 onMessageReceived()가 시작되지 않습니다. 설정을 변경 한 후에 (주로 내 앱의 배터리 최적화를 비활성화하는 & 알림) 모든 것이 잘 작동합니다!

Firebase cloud messaging not received when app in background을 참조하십시오.

-1

이 문제는 백엔드 구현이 필요합니다. 어떻게이 단점을 극복했는지 논의 해 보겠습니다.

Google은 활동 라이프 사이클을 알고 있습니다. 따라서 파괴되면, 클라이언트 토큰을 등록 취소하는 백엔드 서비스를 호출합니다. 대상 클라이언트의 토큰이 등록 취소되었으므로 모든 수신 메시지가 이제 전달 대기 중입니다.

그래서 응용 프로그램을 다시 가져올 때 내 클라이언트를 등록하는 백 엔드 서비스를 호출합니다. 백엔드가 이제 내 장치의 새 클라이언트 토큰과 함께 큐에서 메시지를 보내기 시작합니다.

관련 문제