2017-11-08 2 views
0

그래서 사용자들이 서로 통신 할 수있는 메시지 응용 프로그램을 만들었습니다. 나는 이것을하기 위해 파이어베이스를 사용하고있다. 이제 문제는 앱이 백그라운드에 있거나 닫혀있을 때 백그라운드에서 알림을 만들고 싶습니다. 읽지 않은 메시지에 대한 알림을받는 messenger/whatsapp와 유사합니다.내 채팅 응용 프로그램에 알림 SERVICE을 만드는 방법은 무엇입니까?

어떻게 만들 수 있습니까? 당신은 지금 그 응용 프로그램이 또는 더 쉽게 (구글 앱 엔진에서 예를 들어) 인스턴스를 제공 실행 중 필요가 클라이언트에 푸시 알림을 보내는

chat-room.java

public class Chat_Room extends AppCompatActivity{ 

private Button btn_send_msg; 
private EditText input_msg; 
private TextView chat_conversation; 

private String user_name,room_name; 
private DatabaseReference root ; 
private DatabaseReference Mnotification; 
private String temp_key; 


NotificationCompat.Builder notification; 
private static final int uniqueID = 1995; 

@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.chat_room); 

    btn_send_msg = (Button) findViewById(R.id.btn_send); 
    input_msg = (EditText) findViewById(R.id.msg_input); 
    chat_conversation = (TextView) findViewById(R.id.textView); 







    user_name = getIntent().getExtras().get("user_name").toString(); 
    room_name = getIntent().getExtras().get("room_name").toString(); 
    setTitle(" Room - "+room_name); 

    root = FirebaseDatabase.getInstance().getReference().child(room_name); 
    Mnotification = FirebaseDatabase.getInstance().getReference().child("notifications"); 

    btn_send_msg.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 

      Map<String,Object> map = new HashMap<String, Object>(); 
      temp_key = root.push().getKey(); 
      root.updateChildren(map); 

      DatabaseReference message_root = root.child(temp_key); 
      Map<String,Object> map2 = new HashMap<String, Object>(); 
      map2.put("name",user_name); 
      map2.put("msg",input_msg.getText().toString()); 

      message_root.updateChildren(map2); 
      //not(); 
      //test(); 

     } 
    }); 

    root.addChildEventListener(new ChildEventListener() { 
     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String s) { 

      append_chat_conversation(dataSnapshot); 

     } 

     @Override 
     public void onChildChanged(DataSnapshot dataSnapshot, String s) { 

      append_chat_conversation(dataSnapshot); 

     } 

     @Override 
     public void onChildRemoved(DataSnapshot dataSnapshot) { 

     } 

     @Override 
     public void onChildMoved(DataSnapshot dataSnapshot, String s) { 

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 

    }); 




} 


public void test() { 

    String tkn = FirebaseInstanceId.getInstance().getToken(); 
    String text = chat_msg; 
    not(); 
    Log.d("App", "Token[" + tkn + "]"); 





} 


public void not(){ 



    notification = new NotificationCompat.Builder(this); 
    notification.setAutoCancel(true); 

    notification.setSmallIcon(R.drawable.downloadfile); 
    notification.setTicker("This is the tocken"); 
    notification.setWhen(System.currentTimeMillis()); 
    notification.setContentTitle(user_name); 
    notification.setContentText(chat_msg); 


    Intent intent = new Intent(Chat_Room.this, Message.class); 
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
    notification.setContentIntent(pendingIntent); 


    NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 
    nm.notify(uniqueID, notification.build()); 





} 

private String chat_msg,chat_user_name; 

private void append_chat_conversation(DataSnapshot dataSnapshot) { 

    Iterator i = dataSnapshot.getChildren().iterator(); 

    while (i.hasNext()){ 

     chat_msg = (String) ((DataSnapshot)i.next()).getValue(); 
     chat_user_name = (String) ((DataSnapshot)i.next()).getValue(); 












     chat_conversation.append(chat_user_name +" : "+chat_msg +" \n"); 
     input_msg.setText(""); 
     test(); 





    } 



} 

}

답변

0

함수를 통해 Firebase 함수가 있습니다. 간단히 말하면 요청에 반응하고 알림을 보내는 서버에서 코드를 실행해야합니다.

이미 파이어베이스 데이터베이스를 사용하고 있기 때문에 파이어베이스 기능을 사용하는 것이 가장 쉬운 방법입니다. 함수를 작성한 다음 배포해야합니다.

--> firebase deploy --only functions 

새 데이터 (onCreate())가 작성되거나 업데이트되거나 심지어 데이터베이스에서 제거 될 때마다 함수가 트리거 될 수 있습니다. ("메시지"노드에서 새 메시지가 데이터베이스에 기록 될 때마다 트리거하도록 함수를 작성한다고 가정 해보십시오.

또한 사용자는 고유 한 메시징 "토큰"이 생성 된 클라이언트 측을 데이터베이스에 저장해야합니다. 나중에 함수에 알림을 보내야하므로 필요합니다. 함수에서 데이터베이스에서 해당 토큰을 검색하고 SDK를 통해 알림을 보내야합니다.

//your imports ; see sample linked below for a complete example 
//imagine your functions is triggered by any new write in "messages" node in your database 
exports.sendNotification = functions.database.ref('/messages/{keyId}').onWrite(

     //get the token that is already saved in db then ; 
     const payload = { 
     notification: { 
     title: 'You have a new follower!', 
     body: `${follower.displayName} is now following you.`, 
     icon: follower.photoURL 
     } 
     }; 

     admin.messaging().sendToDevice(tokens, payload); //which is a promise to handle 

}); 

샘플에 대한 중포 기지 기능 Here 참조를 통해 알림을 보내는 방법에 : 여기 설명 무엇의 단순화 된 코드입니다. Firebase 함수 샘플은 Here을 참조하십시오. Firebase 기능 및 트리거에 대한 자세한 내용은 here을 참조하십시오.

자세한 설명은 here (Firebase 기능 이전에 작성된 것임을 명심하십시오)을 참조하십시오. 따라서 앱 서버 인스턴스에 배포한다고 가정합니다. 또한 here은 알림을 보내기위한 클라우드 기능 (Firebase 기능) 사용에 대한 자세한 정보입니다.

+0

예를 들어 특정 부서의 사용자 목록이 포함 된 알림을 listview에 보내려면 해당 관리자가 3 개 부서를 담당하고 있으며이를 보내려한다고 가정 해 보겠습니다. 각 부서의 각 사용자 목록에 대한 알림 –

+0

각 부서의 사용자 목록을 보유하고있는 한 위와 동일한 대답이됩니다. 토큰을 반복하여 알림을 보내면됩니다. 시나리오가 다른 경우 무엇인지 확실하지 않습니다. Firebase 콘솔을 통해서도 앱의 모든 사용자에게 알림을 보내거나 청크로 분류 할 수 있습니다. – TheeBen

+0

예 장치를 사용하는 사람이 그 사람이 작성한 알림을 장치가 여러 장치 알림처럼 작동하는지 확실하지 않은 사용자에게 보내려합니다. –

관련 문제