バグ #1698
【Android・iOS】フォロー通知の飛び先がフォローされた側のユーザーになる不具合
ステータス: | 新規 | 開始日: | 2018/07/09 | |
---|---|---|---|---|
優先度: | 通常 | 期日: | ||
担当者: | - | 進捗 %: | 0% | |
カテゴリ: | - | 作業時間の記録: | - | |
対象バージョン: | - |
説明
・プッシュ送信時のJSON
フォローした側→cWT2XRmvYp
フォローされた側→5JmRyhYtIH
・原因
・Android
{"action":"jp.ihearts.coslab.followed","aps":{"alert":"赤坂優太さんにフォローされました"},"target":"cWT2XRmvYp"}
・iOS {"target":"5JmRyhYtIH","aps":{"alert":"赤坂優太さんがフォローしました"},"action":"jp.ihearts.coslab.followed"}
Android・iOSは「target」に設定されているユーザーのプロフィールを開くように実装している。
Androidから打たれるプッシュ通知の「target」にはフォローした側のObjectIdが入っているが、
iOSから打たれるプッシュ通知の「target」にはフォローされた側のObjectIdが入っている
iOSからcloudcodeを呼ぶ際のパラメータに「target」が存在しているため
パラメータ同士が競合してフォローした側のObjectIDが入っていない
・Android
public static void sendFollowRequestParsePush(Activity activity, final CustomUser targetUser){ if(ParseUser.getCurrentUser()==null){ return; } CustomUser user=(CustomUser)ParseUser.getCurrentUser(); JSONObject data = null; String msg = user.getHandleName() + activity.getString(R.string.text_push_accept_follow); try { data = new JSONObject("{\"action\": \"jp.ihearts.coslab.followed\", \"aps\" : {\"alert\" : \"" + msg + "\"}, \"target\": \"" + user.getObjectId() + "\" }");←「target」にフォローした側のObjectIdが入っている } catch (JSONException e) { e.printStackTrace(); } if(data!=null) { ParseAccessor.sendClientPush(targetUser.getObjectId(), msg, data.toString(), new FunctionCallback<List<ParseObject>>() { @Override public void done(List<ParseObject> object, ParseException e) { if (e != null) { e.printStackTrace(); } } }); } public static void sendClientPush(String target, String message, String data, FunctionCallback<List<ParseObject>> callback) { HashMap<String, Object> params = new HashMap<>(); params.put("target", target);←フォローされた側のObjectIdが入っている params.put("message", message); params.put("data", data); Log.d("send", "sendClientPush"); ParseCloud.callFunctionInBackground("sendClientPush", params, callback); }
・iOS
func sendPushFollow(receiverObjId: String) { var param = [String: String]() param["action"] = "jp.ihearts.coslab.followed" param["target"] = receiverObjId←フォローされた側のObjectIdが入っている let pushMsg = String(format: NSLocalizedString("USERFOLLOW_FOLLOWED", comment: ""), IHUser.currentUserName()) let aDriver = IHParseDriver.instance() aDriver.sendPushNotification(param, text: pushMsg) } private func sendPushNotification(_ param: [String: String], text: String, callFuncName: String = "sendClientPush") { var param = param var dic = [String : AnyObject]() var dic2 = [String : String]() dic2["alert"] = text dic["aps"] = dic2 as AnyObject for (key,val) in param { dic[key ] = val as AnyObject } do { // Dict -> JSON let jsonData = try JSONSerialization.data(withJSONObject: dic, options: []) //(*)options?? param["data"] = NSString(data: jsonData, encoding: String.Encoding.utf8.rawValue)! as String } catch { print("Error!: \(error)") } PFCloud.callFunction(inBackground: callFuncName, withParameters: param as [AnyHashable: Any]) { result, error in if error != nil { } else { } } }
・cloudCode
Parse.Cloud.define("sendClientPush", function(request, response){ var target = request.params.target;←Android・iOSから渡されるJSONの「target」を参照している var message = request.params.message; var data = request.params.data; var obj = (new Function("return " + data))(); Util.console_error("target:"+JSON.stringify(target)); Util.console_error("message:"+JSON.stringify(message)); Util.console_error("obj:"+JSON.stringify(obj)); var pushQuery = new Parse.Query(Parse.Installation); var User = Parse.Object.extend("_User"); var user = new User(); user.id = target; pushQuery.equalTo("user", user); Parse.Push.send({ where:pushQuery, data:obj }, { useMasterKey: true }) .then(function() { // Push sent! //console.log("Push Success"); response.success(); }, function(error) { // There was a problem :( //console.log("Push Error"); response.error("NG"); }); });