1

Ich bin mit Unity 5.5.2f1 Pro und Facebook SDK v 7.9.4Callback-Funktion Probleme in FB.API für Unity

Ich habe ein Skript, das nach der Anmeldung (in einer früheren Szene verwalten) sendet eine API-Anforderung an FB fragt nach Freunden, Namen und E-Mail und sendet diese Informationen als POST an eine PHP-Website.

Code:

[Serializable] 
public struct FBData { 
public string first_name; 
public string email; 
public string friends; 
public string id;} 

public class UserManagement : MonoBehaviour { 

string urlSaveUserData="some php website"; 
public Text testTxt; 
FBData parsedData; 

// Use this for initialization 
void Start() { 
    //Check if it's the first time the user is opening the app. 
    if (UserInfo.FIRST_TIME) { 
     //update text (only used for testing, should be removed in production.) 
     testTxt.text = "Your user id is: " + UserInfo.ID; 
     //Perform FB.API call to get User Data. 
     getUserData(); 

     //Save in SQL table. (won't get here if line in getUserData() is active) 
     StartCoroutine ("saveUserData"); 
    } else { 
     //do something else. 
    } 

Hinweis: Da dies für iOS gemeint ist, ich habe es auf einem Gerät zu testen, damit ich einen Text auf dem Bildschirm bin mit Informationen angezeigt werden (man denke an mich als schlecht implementierte Druckanweisung).

Das Problem: In meiner Callback-Funktion für FB.API schreibe ich in den Text GameObject (aka testTxt) die geparsten Informationen aus der Antwort, die im Custom UserInfo clss gespeichert ist. Es wird korrekt angezeigt, aber der Code bleibt dort stecken. Es geht nicht weiter zur nächsten Funktion. ABER, wenn ich diese Zeile lösche/kommentiere und nichts in dem Textfeld zeige. Die Codes werden mit der POST-Funktion fortgesetzt, ABER die Informationen aus dem API-Aufruf werden nicht übergeben, d. H. Meine benutzerdefinierte Klasse ist leer (was zu der Annahme führt, dass die Rückruffunktion überhaupt nicht aufgerufen wird).

public void getUserData(){ 

    string query = "me?fields=first_name,email,friends"; 
    FB.API (query, HttpMethod.GET, Apicallback, new Dictionary<string, string>()); 

} 

private void Apicallback(IGraphResult result){ 
    //Parse Graph response into a specific class created for this result. 
    parsedData = JsonUtility.FromJson<FBData>(result.RawResult); 

    //Pass each field into UserInfo class. 
    UserInfo.EMAIL = parsedData.email; 
    UserInfo.FRIENDS = parsedData.friends; 
    UserInfo.NAME = parsedData.first_name; 
    UserInfo.FACEBOOKID = parsedData.id; 

      /*problem area, if I comment line below, then previous information is apparently not stored. If left as is then testTxt displays correct information but code gets stuck there. */ 
    testTxt.text = "This is the info from USerInfoInside the APICallback: " + UserInfo.EMAIL + UserInfo.FRIENDS + UserInfo.FACEBOOKID; 
} 

Die Funktion unter Info zu PHP-Website zu senden, ist es zu illustrativen Zwecken:

Code:

public IEnumerator saveUserData() { 
    //get user info (this information is EMPTY if line in getUserData() is commented. 
    parsedData.id = UserInfo.FACEBOOKID; 
    parsedData.friends = UserInfo.FRIENDS; 
    parsedData.first_name = UserInfo.NAME; 
    parsedData.email = UserInfo.EMAIL; 

    //translate data into json 

    string JsonBodyData = JsonUtility.ToJson (parsedData); 

    //Custom web request (POST method doesnt seem to work very well, documentation example sends empty form) 
    var w = new UnityWebRequest(urlSaveUserData, "POST"); 
    byte[] bodyRaw = new System.Text.UTF8Encoding().GetBytes(JsonBodyData); 
    w.uploadHandler = (UploadHandler) new UploadHandlerRaw(bodyRaw); 
    w.downloadHandler = (DownloadHandler) new DownloadHandlerBuffer(); 
    w.SetRequestHeader("Content-Type", "application/json"); 

    yield return w.Send(); 
    //work with received data...} 

Im hier stecken jede Hilfe sehr geschätzt wird. Vielen Dank!

+0

seltsam, wie ist das Verhalten im Editor? –

+0

Haben Sie die Protokollierung aktiviert? Können Sie das xcode-Protokoll posten? –

+0

Eine Sache, die ich nicht verstehe, ist, warum Sie 'StartCoroutine (" saveUserData ")' von der 'Start' anstelle von' Apicallback' Funktion nach Erhalt der Antwort aufrufen. –

Antwort

0

Verwenden Sie unbedingt EscapeURL, wenn Sie Strings direkt für JSON- oder HTTP-POST- und GET-Methoden verwenden. Der Mangel an dieser Behandlung neigt dazu, Dinge zu überspielen, insbesondere in iOS-Plattformen.

Von dem, was ich sehen kann, dieser Code

string query = "me Felder = first_name, E-Mail, Freunde";

sollte stattdessen als

String-Abfrage entwertet werden = WWW.EscapeURL ("me Felder = first_name, E-Mail, Freunde?");

so Zeichen wie "?" wird nicht als URL-Symbol codiert.

Ich gehe davon aus, dass Sie dies für Ihr Beispiel nicht tun müssen, da UnityWebRequest bereits intern Ihre POST-Request-Strings entkommt, aber ich kann das nicht vollständig bestätigen.

Verwandte Themen