我一直在使用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"
}
交叉發表:https://groups.google.com/forum/#!topic/firebase-talk/XujlZtvDl6c –
我不是最好的閱讀obj-c; 'completed'的價值是什麼?這是寫一個整數直接到完成的領域?我們確定這是被設置的?另外,在哪裏。寫規則,允許寫入此路徑?在這裏或在要點上沒有看到。 – Kato
它是一個布爾值,即使它從未被分配過,它也會顯示一個錯誤的值。該文字語法只是將該布爾值包裹在NSNumber中。寫入規則在樹中較高,但在規則樹上調用較高。 – jakehawken