2017-09-23 5 views
0

저는 웹 개발자로서 사용자를 특정 페이지로 리디렉션하기위한 푸시 요청을 통해 지침을받을 수있는 기본적으로 웹보기 인 응용 프로그램을 개발하려고합니다. 이미 기능이 있지만 문제를 해결하기 만하면됩니다.Backgound Firebase 푸시 알림 데이터 처리

Webview의 내용을 업데이트하는 푸시 정보를 받아 처리하는 클래스에서 함수를 만들려고했습니다. 그러나 하나의 클래스는 정적이고 다른 하나는 상속으로 인한 것이 아니기 때문에 약간의 충돌이 있으며 그렇게 할 수 없습니다.

알림을 클릭 할 때 푸시 요청 '날짜'내의 특정 필드에서 보낸 값을받는 "비어있는 메시지 클래스"내에서 문자열 변수를 만드는 방법이 있습니다. 내 MainActivity에서

public void onMessageReceived(RemoteMessage remoteMessage) { 
     Log.d("LOG_ONRECEIVE_1", "From: " + remoteMessage.getFrom()); 
     if (remoteMessage.getData().size() > 0) { 
      Log.d("LOG_VALID_DATA", "Message data payload: " + remoteMessage.getData()); 
     } 
     if (remoteMessage.getNotification() != null) { 
      Log.d("LOG_NULL_NOTIFICATION", "Message Notification Body: " + remoteMessage.getNotification().getBody()); 
     } 
     Map<String, String> data = remoteMessage.getData(); 
     sendNotification(remoteMessage); 
     if (data.containsKey("appReportedAction")) { 
      Log.d("SET_ACTION", "/appReportedAction/" + data.get("appReportedAction")); 
      NEW_URL_FROM_ACTION = MainActivity.SSLPROTOCOL + "://" + MainActivity.MAIN_URL +"/appReportedAction/" + data.get("appReportedAction"); 
     } 
    } 

웹뷰 내용을 변경하는 기능이있다 : FirebaseMessagingService를 확장 내 공용 클래스 FireBaseWatchMessages이있다. 그것은 다음과 같이 작동

public void changeViewContent(String actionView){ 
     setContentView(R.layout.activity_main); 
     mWebView = (WebView) findViewById(R.id.activity_main_webview); 
     WebSettings webSettings = mWebView.getSettings(); 
     webSettings.setJavaScriptEnabled(true); 
     if(FireBaseWatchMessages.NEW_URL_FROM_ACTION != "EMPTY"){ 
      mWebView.loadUrl(FireBaseWatchMessages.NEW_URL_FROM_ACTION); 
     } else { 
      mWebView.loadUrl(SSLPROTOCOL + "://" + MAIN_URL + actionView); 
     } 
     mWebView.setWebViewClient(new HelloWebViewClient()); 
    } 

그래서 응용 프로그램이 변수 "EMPTY"이외의 값이있는 경우 그래서 웹보기는 그 값이 아닌 기본 URL에 따라 수정 된 URL을 열 경우는, 확인 열 때.

푸시에 의해 전송 된 메시지를 클릭 할 때 응용 프로그램이 닫히면 해당 변수가 실제로 푸시에 의해 전송 된 값을받지 못하는 것처럼 해당 수정으로 열리지 않습니다.

응용 프로그램 디버거를 사용하면 열려 있지 않을 때 콘솔에 로그 명령이 표시되지 않는 것으로 나타났습니다. 응용 프로그램이 닫힐 때 해당 기능이 실제로 실행되지 않는다고 생각됩니다.

어떻게하면이 문제를 해결할 수 있습니까? 어떻게 알림을 클릭하면 매개 변수를 webview로 보내겠습니까?

+0

알림을 처리 했습니까? 인 텐트 사용? – Xenolion

+0

질문을 명확히하십시오! 더 많은 코드를 표시 하시겠습니까? – Xenolion

답변

0

먼저 사용자의 접근 방식이 일반적이지 않으며 서비스가 사용자 또는 장치에 의해 중지/정지 될 수 있으므로 데이터를 잃어 버리거나 장치가 돌아 왔기 때문에 이러한 방식으로 URL을 저장하지 않는 것이 좋습니다. 데이터가 손실 될 수 있습니다. 따라서 변수를 사용하는 대신 공유 환경 설정을 사용하는 두 가지 방법을 쉽게 만들었으며 앱을 사용하지 않아도 저장 장치가 영구적입니다.

public boolean addNewUrl(Context context, String url) { 
    SharedPreferences sharedPref = context.getSharedPreferences("SHARED URL", Context.MODE_PRIVATE); 
    SharedPreferences.Editor editor = sharedPref.edit(); 
    editor.putString("url", url); 
    return editor.commit(); 
} 

FireBaseWatchMessages에서 첫 번째 방법을 정의하고 URL을 저장하고 성공적으로 저장된 경우 true를 반환 첫 번째 방법은 다음과 같습니다 어떻게 여기

.

그리고 두 번째는 다음의이 소요 후

public String getUrlAndSetEmpty(Context context) { 
    SharedPreferences sharedPref = context.getSharedPreferences("SHARED URL", Context.MODE_PRIVATE); 
    SharedPreferences.Editor editor = sharedPref.edit(); 
    String current_url = sharedPref.getString("url", "EMPTY"); 
    editor.putString("url", "EMPTY"); 
    editor.apply(); 
    return current_url; 
} 

이 URL이 반환 얻기 위해 MainActivity이 정의도에 "EMPTY"URL을 설정합니다!

첫 번째 메소드는 서비스 FireBaseWatchMessages에서 호출됩니다. 이것은 우리의 경우에 대해 this 또는 FireBaseWatchMessages.this이고 또한 문자열 형식의 URL을 받아들이므로 String으로 URL을 변경하는 컨텍스트를 받아들입니다. 그런 다음 앱 내부 저장소에 url으로 저장합니다.

그래서 그냥 전화 :

addNewUrl(this,your_url_string); 

두 번째 방법

은 당신이 작업 할 MainActivity 또는 활동에 호출됩니다. 따라서 MainActivity에 정의하십시오. 그것은 무엇을 찾지 못하면 저장소에 저장된 URL이 있는지 확인합니다. 문자열 "EMPTY"을 발견하면 현재 url로 반환하고 저장된 String의 값을 empty로 변경합니다. 이미 하나 있어요. 그래서 그냥 전화 :

String url= getUrlAndSetEmpty(this); 

환호성 URL은 실제로 URL 문자열 또는 단순히 문자열 "EMPTY"일 수 있습니다. 논리를 다루십시오.

사례에 가장 적합한 방법입니다. 그것은 언제든지 작동합니다! 앱이 포 그라운드에서 볼 수 있는지 여부에 따라 다릅니다.

활동 작성시 의도를 올바르게 처리 한 경우 코드를 확인하십시오!

또한 Java에서 우리는 객체 (String 포함)를 비교할 때 (=) 대신에 (Object1.equals(Object2)) 부호를 사용합니다.

 if(FireBaseWatchMessages.NEW_URL_FROM_ACTION != "EMPTY") 

변경에 :

 if(!((FireBaseWatchMessages.NEW_URL_FROM_ACTION).equals("EMPTY"))) 

이 상태에서 거기 ! 기호를 잊지 마세요 그래서 당신은 전화 라인을 변경!

그래도 작동하지 않으면 Activity을 시작하는 데 사용한 의도를 확인하십시오.

+0

그럼, 명확하게 해 드리겠습니다. 문자열 검사와 URL 변경은 괜찮습니다 (아직 팁을 주셔서 감사합니다). 문제는 응용 프로그램이 닫히면 (NEW_URL_FROM_ACTION) 변수가 Firebase와 함께 보내는 매개 변수의 값을 가져 오지 않으며 응용 프로그램이 알림에서 클릭 동작으로 열릴 때도 발생하지 않습니다. –

+0

답변을 업데이트했습니다. 상단 부분을 읽으십시오! – Xenolion