Один из способов избежать запятых, заключенных в квадратные скобки, - сначала сопоставить квадратные скобки. Пример для замены:
var result = sampleStr.replace(/([^\[,]*(?:\[[^\]]*\][^\[,]*)*),/g, '$1#');
Другой пример, если вы хотите разделить:
var result = sampleStr.match(/(?=[^,])[^\[,]*(?:\[[^\]]*\][^\[,]*)*/g);
Преимущество этих подходов в том, что вам не нужно разбирать всю строку до конца с представлением каждой запятой.
Я бы предложил удерживать SKProductsRequest
в переменной экземпляра, чтобы она не освобождалась.
так что-то вроде
self.request = SKProductsRequest(....)