NIFCLOUD-mbaas / UserCommunity

ニフクラ mobile backend ユーザーコミュニティ
https://mbaas.nifcloud.com/
81 stars 18 forks source link

NCMBUser saveInBackground で会員管理(user)の値を更新すると、ユーザー登録時の確認メールが飛んでくる #902

Open mtikaz opened 6 years ago

mtikaz commented 6 years ago

let user = NCMB.current()

user?.setObject(num , forKey: “field1”) user?.saveInBackground({ _ in //.... })

のようにして、更新はできるのですが、毎回、初回の更新だけ、ユーザー登録時の確認メールが送られて来ます。既に登録済みにもかかわらずです。2回目以降の処理では起きません。

何か間違ったことをしておりますでしょうか?

mtikaz commented 6 years ago

デフォルトのuserNameの変更でも同じ現象が見られましたので一部訂正。 もしや仕様でしょうか?mailAddressの変更で確認メールはわかりますが、他の項目で起きるのは?です。 あと、実験を繰り返した結果、最初のViewController起動200ミリ秒以内の更新ではメールは来ません。 SDK version 2.4.3, Xcode 9.4.1, swift4.1,iOS11.4.1 ID/パスワード認証,メールアドレス/パスワード認証は共に許可する、認証有効時間24時間 確認メールの送信:送信する

goofmint commented 6 years ago

メールアドレスの確認は済んでいるのでしょうか?

mtikaz commented 6 years ago

はい。mailAddressConfirm も true です。

goofmint commented 6 years ago

それは変ですね…。そういった現象になったことは個人的にはない気がします。

mtikaz commented 6 years ago

何が原因かわかりませんが、問題の1回目の更新では、目的の項目以外に、mailAddress, userNameも合わせて更新に行っているため、確認メールが送られているようです。2回目以降は、目的の項目だけが対象となっていて、それで大丈夫のようです。デバッグで追跡したところ、 NCMBObject.mの、 /* 通信前に履歴の取り出しと、次のOperationを保存するDictionaryをキューにセットする @return currentOperations オブジェクトの操作履歴 / -(NSMutableDictionary )beforeConnection{ //通信前に履歴の取り出し NSMutableDictionary currentOperations = [self currentOperations]; [operationSetQueue addObject:[[NSMutableDictionary alloc]init]]; return currentOperations; }

この履歴の取り出しで、1回目のみ、mailAddress, userNameがくっついて問題の3つになっていました。 なぜ、ログイン直後やリビルド直後にこれが起きているのかが良くわかりません。

goofmint commented 6 years ago

mailAddress を更新しているんですか?であればメールが出るかなと。

mtikaz commented 6 years ago

mailAddress, userNameともに何も明示的に変更していないのにこれが起きていたので今回問題提起させて頂いたのですが、ようやく原因らしきものにたどり着きました。

どうやら、ログイン時に直近の会員管理情報を取得するとこれが起きているようです。つまり、 user?.fetchInBackground({ (error ) in } をやると、次回のoperationSetQueue構築で、mailAddress, userNameが勝手にくっついてしまうようです。これをコメントアウトしてリビルド実行すると、メールは止まりました。

NCMBUser.current()では直近の情報が得られないのでfetchInBackgroundを使ったのですが、これは使うべきではないのでしょうか?プログラム上、直近の値をみて、他の項目値の更新をするかしないかを判断させるため、どうしても避けては通れません。そもそもなぜ、fetchInBackgroundで更新対象ではなかった項目がセットされるのかが不思議です。ここから先は素人なのでわかりませんが、そもそも、operationSetQueue構築で更新不要の項目がセットされること自体が問題ではないでしょうか?

mtikaz commented 6 years ago

続報ですが、NCMBUser.current()の、特に処理も値更新も記述せずとも、fetchInBackgroundとsaveInBackgroundを単に交互に実行するだけで、1回限りでなく毎回メールが届くようです。これはちょっと危険な感じがします。

@IBAction func shiken(_ sender: Any) {
    let user = NCMBUser.current()
    user?.fetchInBackground({ (error) in
        print("fetch")
    })
}

@IBAction func shiken2(_ sender: Any) {
    let user = NCMBUser.current()
    user?.saveInBackground({ (error) in
        print("save")
    })
}
masuhara commented 5 years ago

@mtikaz 同じ現象です。細かい確認はこれからですが、メールが何度も送られます。NCMBUser.current()が怪しい気がしています。

goofmint commented 5 years ago

中の人に聞いたところ、SDKの改修を行っているとのことです。修正は終わっており、リリース待ちという段階とのことなので、もうすぐ直るかと思います。

masuhara commented 5 years ago

@goofmint ありがとうございます!!

goofmint commented 5 years ago

お待たせしました。最新版で解決したとのことです!

http://info.biz.nifty.com/mb/2019/01/post-90.html