1

我一直在使用Firebase開發一個iOS應用幾個月,而且我遇到了一個問題,即對我的後端的呼叫失敗。爲了測試這個問題,我打開了Firebase上的模擬器並模擬了這個調用,並且沒有問題就成功了。所有其他呼叫按預期工作。Firebase:有沒有方法可以查看SDK發送的JSON有效內容?

我可以得出的唯一結論是JSON負載在某種程度上與我所期望的不同。

一些細節: 視圖控制器在我正在做的數據結構的連續觀測在後端林(使用observeEventOfType:withBlock:withCancelBlock:),並且在該屏幕上檢查盒操縱的該子值相同的數據結構。因此,每次選中或取消選中某個框時,它都會使用新值調用setValue:。然後,由於正在觀察父數據結構,它將被更新,並刷新屏幕。

我遇到的問題是,setValue:調用被拒絕,這又會觸發其他方法的cancelBlock。當我嘗試在我的Firebase儀表板上模擬setValue:時,它會成功。

我已經添加了相關的後端規則和問題在GitHub的要點失敗的方法在這裏: https://gist.github.com/jakehawken/4a4bb8d2f58c651d7310b3a1737bf11e

//RELEVANT BACKEND RULES FOR THE FAILING CALL (I'm writing to the "completed" path): 
"subtasks": { 
    "$list_item": { 
     ".validate": "newData.hasChildren(['subtaskDescription', 'completed'])", 
     "subtaskDescription" : { 
      ".validate" : "newData.isString()" 
     }, 
     "completed" : { 
      ".validate" : "newData.isNumber() && !newData.hasChildren()" 
     } 
    } 
} 

方法調用失敗(Objective-C的):

- (KSPromise *)markSubtask:(HDInProgressSubtask *)subtask completed:(BOOL)completed forListID:(NSString *)listID inProgressItemKey:(NSString *)inProgressKey subtaskKey:(NSString *)subtaskKey 
{ 
    KSDeferred *deferred = [KSDeferred defer]; 

    FIRDatabaseReference *specificSubtaskReference = [self specificSubtaskCompletionReferenceForListID:listID inProgressItemKey:inProgressKey subtaskKey:subtaskKey]; 

    FIRDatabaseReference *subtaskCompletionReference = [specificSubtaskReference child:kCompleted]; 

    NSNumber *value = [NSNumber numberWithBool:completed]; 

    [subtaskCompletionReference setValue:value withCompletionBlock:^(NSError * _Nullable error, FIRDatabaseReference * _Nonnull ref) { 
    if (error) 
    { 
     [deferred rejectWithError:error]; //Failing case 
    } 
    else 
    { 
     [deferred resolveWithValue:@(completed)]; //Success case 
    } 
    }]; 

    return deferred.promise; 
} 

這個調用應該只是發送數字1或者0(一個包裹在NSNumber中的BOOL),但是當我打開詳細日誌記錄時,它說它發送了這個巨獸:

{ 
    "d" :  { 
     "a" : "p", 
     "b" : { 
      "d" : 1, 
      "p" : "<the url path for this upload>" 
     }, 
     "r" : 11 
    }, 
    "t" : "d" 
} 

從模擬器明顯成功: sensitive information redacted

+0

交叉發表:https://groups.google.com/forum/#!topic/firebase-talk/XujlZtvDl6c –

+0

我不是最好的閱讀obj-c; 'completed'的價值是什麼?這是寫一個整數直接到完成的領域?我們確定這是被設置的?另外,在哪裏。寫規則,允許寫入此路徑?在這裏或在要點上沒有看到。 – Kato

+0

它是一個布爾值,即使它從未被分配過,它也會顯示一個錯誤的值。該文字語法只是將該布爾值包裹在NSNumber中。寫入規則在樹中較高,但在規則樹上調用較高。 – jakehawken

回答

0

我終於想通了自己。

我評論了我的所有驗證規則,以便我可以將任何我想要的內容發佈到後端。到目前爲止,我已經認識到,自從我將自己的布爾值封裝在NSNumber中後,我認爲後端會將該值存儲爲一個數字。因此,我對該路徑的規則是newValue.isNumber()。然而,事實證明,Firebase自動地知道它是一個布爾值,所以當我刪除了所有規則後,發佈到後端的值爲「true」。因此,我將該規則重寫爲newValue.isBoolean()現在它工作得很好。

這個故事的寓意:如果您初始化一個NSNumber用布爾,那麼當你其交給火力地堡,時生成將與該NSNumber的是開始用布爾意識所作的JSON有效載荷。

0

最近你可以是enabling debug logging

FIRDatabase.setLoggingEnabled(true) 
+0

是的,我做到了。然後將該日誌複製到儀表板模擬器。模擬呼叫通過。 :-( – jakehawken

+0

爲了幫助我,我需要看到[最小代碼(+ JSON +規則),再現問題](http://stackoverflow.com/help/mcve)。 –

+0

我現在在問題主體中包含了Github Gist和相關代碼。 – jakehawken

相關問題