def publishApp(self, app_info, map_info=None, fsInfo=None):
        """Publishes apps to AGOL/Portal
        
        Args:
            app_info (list): A list of JSON configuration apps to publish.
            map_info (list): Defaults to ``None``.
            fsInfo (list): Defaults to ``None``.
        Returns:
            dict: A dictionary of results objects.
            
        """
        if self.securityhandler is None:
            print ("Security handler required")
            return
        appDet = None
        try:
            app_results = []
            if isinstance(app_info, list):
                for appDet in app_info:
                    app_results.append(self._publishAppLogic(appDet=appDet,map_info=map_info,fsInfo=fsInfo))
            else:
                app_results.append(self._publishAppLogic(appDet=app_info,map_info=map_info,fsInfo=fsInfo))
            return app_results

        except (common.ArcRestHelperError) as e:
            raise e
        except Exception as e:

            line, filename, synerror = trace()
            raise common.ArcRestHelperError({
                "function": "publishApp",
                "line": line,
                "filename":  filename,
                "synerror": synerror,
            })

        finally:
            appDet = None

            del appDet
            gc.collect()
Publishes apps to AGOL/Portal
        
        Args:
            app_info (list): A list of JSON configuration apps to publish.
            map_info (list): Defaults to ``None``.
            fsInfo (list): Defaults to ``None``.
        Returns:
            dict: A dictionary of results objects.