{"payload":{"header_redesign_enabled":false,"results":[{"body":"RESTful protocol for Installations . The following Foreign Key apply: installations.scenario_id : Foreign Key to Scenarios installations.belongsToInstallation : Foreign Key to Installations READ Installations GET /api/inst?scn_id={scn_id} & filter={filter} & sort={sort} & limit={limit} & skip={skip} | index Added to installations (for now)\nexample: curl ' http://localhost:8080/cassandra/api/inst?scn_id=4ff5bca7e4b0082c63d08df3 & limt=20 & filter=\\{x:234.232\\} & sort=\\{y:-1\\} ' Valid query parameters:\n@QueryParam(\"scn_id\") String scn_id, @QueryParam(\"filter\") String filter, @QueryParam(\"sort\") String sort, @QueryParam(\"limit\") int limit, @QueryParam(\"skip\") int skip sort parameter should be a JSON object, e.g. & sort={y:1} for ascending order and & sort={y:-1} for descending order\nMore info on: http://www.mongodb.org/display/DOCS/Sorting+and+Natural+Order filter should be a JSON object, e.g. & filter={x:234.232} Retrieves the installations in the scenario (names, ids). Consumes: Route, Parameter Produces: JSON {\n\"success\": true,\n\"message\": \"Installations retrieved successfully\",\n\"size\": 2,\n\"data\": [\n{\n\"_id\": {\n\"$oid\": \"4ff5bca7e4b0082c63d08df6\"\n},\n\"name\": \"Installation 1\",\n\"type\": \"Installation Type\",\n\"description\": \"Installation description\",\n\"scenario_id\": \"4ff5bca7e4b0082c63d08df3\"\n},\n{\n\"_id\": {\n\"$oid\": \"4ff5bca7e4b0082c63d08df7\"\n},\n\"name\": \"Installation 2\",\n\"description\": \"Installation description 2\",\n\"scenario_id\": \"4ff5bca7e4b0082c63d08df3\",\n\"belongsToInstallation\": \"4ff5bca7e4b0082c63d08df6\"\n}\n]\n} READ Installation GET /api/inst/{inst_id} | show Fetches the properties of the Installation and other included entities (names, ids) such as Appliances that are included in the Installation . Consumes: Route Produces: JSON CREATE Installation POST /api/inst | create Creates a new Installation based on the things added in the form. Consumes: Route, JSON {\n name: \"Installation 1\",\n type : \"Installation Type\",\n description : \"Installation description\",\n scenario_id: \"4ff5bca7e4b0082c63d08df3\",\n belongsToInstallation : \"4ff5bca7e4b0082c63d08df6\"\n location : \"Description of location\",\n x : 234.232,\n y : 12.12\n } Produces: JSON {\n \"success\": true,\n \"message\": \"Installation created successfully\",\n \"objectCreated\": {\n name: \"Installation 1\",\n type : \"Installation Type\",\n description : \"Installation description\",\n scenario_id: \"4ff5bca7e4b0082c63d08df3\",\n belongsToInstallation : \"4ff5bca7e4b0082c63d08df6\"\n location : \"Description of location\",\n x : 234.232,\n y : 12.12,\n \"_id\": {\n \"$oid\": \"4ff5c327e4b0082c63d08e01\"\n }\n }\n} UPDATE Installation PUT /api/inst/{inst_id} | update Updates the properties of the Installation after editing. Consumes: Route, JSON Produces: JSON Send back the full JSON defining the Installation with the updated fields. DELETE Installation DELETE /api/inst/{inst-id} | delete Deletes the existing Installation . The Appliances are not deleted if they are referenced in other Installations . Consumes: Route Produces: Delete status Installation Schema {\n \"name\": \"Installation\",\n \"type\": \"object\",\n \"description\": \"A consumer/producer of energy\",\n \"properties\": {\n \"scenario_id\": {\n \"type\": \"string\",\n \"description\": \"The Scenario this Installation belongs to\",\n \"optional\": false\n },\n \"name\": {\n \"type\": \"string\",\n \"description\": \"Name of the installation\",\n \"optional\": true\n },\n \"type\": {\n \"type\": \"string\",\n \"description\": \"Type of the installation\",\n \"optional\": true\n }, \n \"description\": {\n \"type\": \"string\",\n \"description\": \"Description of the installation\",\n \"optional\": true\n },\n \"belongsToInstallation\": {\n \"type\": \"string\",\n \"description\": \"The ObjectId of the Installation this installation belongs to\",\n \"optional\": true\n },\n \"location\": {\n \"type\": \"string\",\n \"description\": \"The location of the Installation\",\n \"optional\": true\n },\n \"x\": {\n \"type\": \"number\",\n \"description\": \"The X coordinates of the Installation\",\n \"optional\": true\n },\n \"y\": {\n \"type\": \"number\",\n \"description\": \"The Y coordinates of the Installation\",\n \"optional\": true\n }\n },\n \"additionalProperties\" : false\n}","filename":"Installations.md","format":"markdown","hl_body":"RESTful protocol for Installations . The following Foreign Key apply: installations.scenario_id : Foreign Key to Scenarios installations.belongsToInstallation : Foreign Key to Installations READ ...","hl_title":"Installations","id":"557f5367ee949371cde301b1d3569adac070474e","path":"Installations.md","public":true,"repo":{"repository":{"id":5494952,"name":"platform","owner_id":1758399,"owner_login":"fgiannar","updated_at":"2014-09-22T13:12:31.221Z","has_issues":false}},"repo_id":5494952,"title":"Installations","updated_at":"2012-07-23T02:28:55.000-07:00"},{"body":"Important Push registration is enabled by default, that means that you don't need to use method for enabling it. Disabled push registration is the one that will completely stop receiving push notifications.\nDisabling push registration is needed to be used only if you want to opt out of receiving notifications.\nIf you just don't want notifications to be displayed in the notification center, send silent campaign, or use method .withoutDisplayNotification() . Disabling the push registration In order to disable the current user from receiving push messages, you have to change his push registration status. Here are the steps: Start MobileMessaging SDK in a way it's described in the Quick Start Guide if it is not started yet. Once the SDK has been successfully initialized and started, do the following: val installation = Installation ()\ninstallation.isPushRegistrationEnabled = false MobileMessaging .getInstance(context).saveInstallation(installation, object : ResultListener < Installation > () { override fun onResult ( result : Result < Installation , MobileMessagingError > ) { // process result here }\n}) expand to see Java code Installation installation = new Installation (); installation . setPushRegistrationEnabled ( false ); MobileMessaging . getInstance ( context ). saveInstallation ( installation , new ResultListener < Installation > () { @ Override public void onResult ( Result < Installation , MobileMessagingError > result ) { // process result here }\n}); Enabling the push registration In order to enable current user back to receiving push messages, you need to enable user's push registration: Start MobileMessaging SDK in a way it's described in the Quick Start Guide if it is not started yet. Once the SDK has been successfully initialized and started, do the following: val installation = Installation ()\ninstallation.isPushRegistrationEnabled = true MobileMessaging .getInstance(context).saveInstallation(installation, object : ResultListener < Installation > () { override fun onResult ( result : Result < Installation , MobileMessagingError > ) { // process result here }\n}) expand to see Java code Installation installation = new Installation (); installation . setPushRegistrationEnabled ( true ); MobileMessaging . getInstance ( context ). saveInstallation ( installation , new ResultListener < Installation > () { @ Override public void onResult ( Result < Installation , MobileMessagingError > result ) { // process result here }\n}); Retrieving the current push registration status In order to get the current registration status, use the following code: var isPushRegistrationEnabled = MobileMessaging .getInstance( this ).installation.isPushRegistrationEnabled expand to see Java code boolean isPushRegistrationEnabled = MobileMessaging . getInstance ( this ). getInstallation (). isPushRegistrationEnabled ();","filename":"How-to-completely-stop-or-start-receiving-push-messages.md","format":"markdown","hl_body":" following: val installation = Installation ()\ninstallation.isPushRegistrationEnabled = false MobileMessaging .getInstance(context).saveInstallation(installation, object : ResultListener < Installation","hl_title":"How to completely stop or start receiving push messages","id":"fc172d8825d5c2fb06b073ee64bd74f9c3941749","path":"How-to-completely-stop-or-start-receiving-push-messages.md","public":true,"repo":{"repository":{"id":56227769,"name":"mobile-messaging-sdk-android","owner_id":1288491,"owner_login":"infobip","updated_at":"2024-05-20T13:38:15.744Z","has_issues":true}},"repo_id":56227769,"title":"How to completely stop or start receiving push messages","updated_at":"2022-11-09T08:48:16.000Z"},{"body":"Release 1.9 (legacy) What's new? What's new in OpenQuake 1.9 Installation Installation (Ubuntu 14.04 and Ubuntu 12.04, from package) Running on multiple nodes (Ubuntu) Installation (RHEL 7 and clones, from package) Running on multiple nodes (RHEL and clones) VirtualBox (OVA) appliance Technology Stack Documentation Full documentation Manual WebUI documentation Source Code/API Documentation Release 1.8 (legacy) What's new? What's new in OpenQuake 1.8 Installation Installation (Ubuntu 14.04 and Ubuntu 12.04, from package) Running on multiple nodes (Ubuntu) Installation (RHEL 7 and clones, from package) Running on multiple nodes (RHEL and clones) VirtualBox (OVA) appliance Technology Stack Documentation Full documentation Manual WebUI documentation Source Code/API Documentation Release 1.7 (legacy) What's new? What's new in OpenQuake 1.7 Installation Installation (Ubuntu 14.04 and Ubuntu 12.04, from package) Installation (RHEL/CentOS 7, from package) VirtualBox (OVA) appliance Technology Stack Documentation Manual WebUI documentation Source Code/API Documentation Release 1.6 (legacy) What's new? What's new in OpenQuake 1.6 Installation Installation (Ubuntu 14.04 and Ubuntu 12.04, from package) Installation (RHEL/CentOS 7, from package) VirtualBox (OVA) appliance Technology Stack Documentation Manual WebUI documentation Source Code/API Documentation Release 1.5 (legacy) What's new? What's new in OpenQuake 1.5 Installation Installation (Ubuntu 14.04 and Ubuntu 12.04, from package) Installation (RHEL/CentOS 7, from package) VirtualBox (OVA) appliance Technology Stack Documentation Manual Source Code/API Documentation Release 1.4 (legacy) What's new? What's new in OpenQuake 1.5 Installation Installation (Ubuntu 12.04 and Ubuntu 14.04, from package) VirtualBox (OVA) appliance Technology Stack Documentation Manual Source Code/API Documentation Release 1.3 (legacy) What's new? What's new in OpenQuake 1.3 Installation Installation (Ubuntu 12.04, from package) Technology Stack Documentation Manual Source Code/API Documentation Release 1.2 (legacy) What's new? What's new in OpenQuake 1.2 Incompatible changes between OpenQuake 1.0 and 1.2 How to upgrade an OpenQuake 1.2 database Installation Installation (Ubuntu 12.04, from package) Technology Stack Release 1.0 (legacy) Release 1.0 has been superseded by release 1.2. Installation (Ubuntu 12.04, from package) Technology Stack","filename":"Legacy-Releases-(from-1.0-to-1.9).md","format":"markdown","hl_body":"Release 1.9 (legacy) What's new? What's new in OpenQuake 1.9 Installation Installation (Ubuntu 14.04 and Ubuntu 12.04, from package) Running on multiple nodes (Ubuntu) Installation (RHEL 7 and clones","hl_title":"Legacy Releases (from 1.0 to 1.9)","id":"edd17db8d788642f67cfc2051b3a12d7e9c9c194","path":"Legacy-Releases-(from-1.0-to-1.9).md","public":true,"repo":{"repository":{"id":744916,"name":"oq-engine","owner_id":316546,"owner_login":"gem","updated_at":"2024-06-01T06:32:52.826Z","has_issues":true}},"repo_id":744916,"title":"Legacy Releases (from 1.0 to 1.9)","updated_at":"2017-09-25T16:40:23.000+02:00"},{"body":"Table of contents Terminology Installation Enabling/disabling push registration Setting installation as primary Custom attributes User Personalization: phone numbers, emails and external user ID External User ID Depersonalization Personalize with force depersonalization Standard attributes Custom attributes Tags User data storage Terminology Mobile Messaging SDK employs specific terms in order to address different type of information that you can synchronize towards Infobip Platform. You will see User and Installation terms in the SDK similarly to what you can see at People section at Infobip Portal. Installation is a specific installation of your application. You can see it as Mobile App Messaging (Push Notifications) destination under \"Contact Information\" tab of a user profile. A single user can have zero or more installations of different applications. You can change some specific settings of each installation of a user, add Custom attributes to it or do a remote Logout of a specific installation. User represents a single person profile with Standard attributes , Custom attributes and Tags which you can set via the SDK. Both user and installation objects are initialized once Mobile Messaging SDK is successfully started. Installation Installation is a specific installation (or instance) of your application on a user's device. One user can have multiple installations.\nYou can get current installation details from server: MobileMessaging .getInstance(context).fetchInstallation( object : ResultListener < Installation > () { override fun onResult ( result : Result < Installation , MobileMessagingError > ) {\n \n }\n}) expand to see Java code MobileMessaging . getInstance ( context ). fetchInstallation ( new ResultListener < Installation > () { @ Override public void onResult ( Result < Installation , MobileMessagingError > result ) {\n \n }\n}); All the current users installations are also available under user profile: val user : User = .. . val installations : List < Installation > = user.getInstallations() expand to see Java code User user = ...; List < Installation > installations = user . getInstallations (); Enabling/disabling push registration You can temporarily \"disable\" your installation if you don't want to receive push notifications: val installation = Installation ()\ninstallation.isPushRegistrationEnabled = false MobileMessaging .getInstance(context).saveInstallation(installation, object : ResultListener < Installation > () { override fun onResult ( result : Result < Installation , MobileMessagingError > ) {\n \n }\n}) expand to see Java code Installation installation = new Installation (); installation . setPushRegistrationEnabled ( false ); MobileMessaging . getInstance ( context ). saveInstallation ( installation , new ResultListener < Installation > () { @ Override public void onResult ( Result < Installation , MobileMessagingError > result ) {\n\n }\n}); Setting installation as primary On the Infobip account, a single user profile can have one or more mobile devices with the application installed. You might want to mark one of these devices as the primary device and send push messages only to this device (e.g. receive bank authorization codes only on one device). To achieve this and similar use-cases, you can utilize the APIs provided by the Mobile Messaging SDK. For this feature to work, the API request for sending the push notification must include a special parameter targetOnlyPrimaryDevices set to true . Parameters for sending a single push notification can be checked in the Infobip API Docs . With this parameter, push notifications will not be sent to any installations that are not marked as primary . This means that for this feature to work, both the mobile implementation and the API request parameter must be used in conjunction. By default, all installations are marked as non-primary. To set a particular installation as primary, either the Contact Information API or the following Mobile Messaging SDK API can be used: val installation = Installation ()\ninstallation.isPrimaryDevice = true MobileMessaging .getInstance(context).saveInstallation(installation, object : ResultListener < Installation > () { override fun onResult ( result : Result < Installation , MobileMessagingError > ) {\n \n }\n}) expand to see Java code Installation installation = new Installation (); installation . setPrimaryDevice ( true ); MobileMessaging . getInstance ( context ). saveInstallation ( installation , new ResultListener < Installation > () { @ Override public void onResult ( Result < Installation , MobileMessagingError > result ) {\n\n }\n}); You can set/reset primary setting for any other installation of a current user: val pushRegId : String = < Push Registration ID of another installation > MobileMessaging .getInstance(context).setInstallationAsPrimary(pushRegId, true , object : ResultListener < List < Installation > > () { override fun onResult ( result : Result < List < Installation > , MobileMessagingError > ) {\n \n }\n}) expand to see Java code String pushRegId = < Push Registration ID of another installation > ; MobileMessaging . getInstance ( context ). setInstallationAsPrimary ( pushRegId , true , new ResultListener < List < Installation > > () { @ Override public void onResult ( Result < List < Installation > , MobileMessagingError > result ) {\n \n }\n}); Custom attributes An Installation can have custom attributes in the same way as User does, so that you would be able to reach only a specific installation of a user. val installation = Installation ()\ninstallation.setCustomAttribute( \" OneTimePasswords \" , CustomAttributeValue ( true )) MobileMessaging .getInstance(context).saveInstallation(installation, object : ResultListener < Installation > () { override fun onResult ( result : Result < Installation , MobileMessagingError > ) {\n \n }\n}) expand to see Java code Installation installation = new Installation (); installation . setCustomAttribute ( \"OneTimePasswords\" , new CustomAttributeValue ( true )); MobileMessaging . getInstance ( context ). saveInstallation ( installation , new ResultListener < Installation > () { @ Override public void onResult ( Result < Installation , MobileMessagingError > result ) {\n\n }\n}); These custom attributes can be seen under push destination card on a portal: User You can provide additional user's data to the server, so that you will be able to send personalised targeted messages to exact user and have other nice features. Library supports a set of predefined attributes as well as custom ones. You can always get current user data from server via the SDK API. The request produce an HTTP call, so make sure to handle failures if any. MobileMessaging .getInstance(context).fetchUser( object : ResultListener < User > () { override fun onResult ( result : Result < User , MobileMessagingError > ) {\n \n }\n}) expand to see Java code MobileMessaging . getInstance ( context ). fetchUser ( new MobileMessaging . ResultListener < User > () { @ Override public void onResult ( Result < User , MobileMessagingError > result ) {\n \n }\n}); Personalization: phone numbers, emails and external user ID Each user can have Phone numbers , Emails and External user ID . These fields are unique identifiers of a user profile on Infobip platform and provide capability to personalize any app installation with a user profile. The platform provides data grouping functions based on these parameters. For example, if two installations of a particular app will try to save the same Phone number , then both of them will be collected under a single user. Phone number , Email and External user ID are also widely used when targeting users with messages across different channels via Infobip platform. Following restrictions apply: Phone number: string, https://en.wikipedia.org/wiki/E.164 , i.e. \"79210000000\" ) Email: string, format described in https://tools.ietf.org/html/rfc2822 , i.e. \"user@mail.com\" ) External User Id: any string, except any form of \"null\", \"Null\", \"NULL\" etc are not supported and would be considered as JSON null val user = User ()\nuser.phones = HashSet ( listOf ( \" 79210000000 \" ))\nuser.emails = HashSet ( listOf ( \" john.doe@infobip.com \" ))\nuser.externalUserId = \" ExternalId \" MobileMessaging .getInstance(context).saveUser(user, object : MobileMessaging . ResultListener < User > () { override fun onResult ( result : Result < User , MobileMessagingError > ) {\n \n }\n}) expand to see Java code User user = new User (); user . setPhones ( new HashSet < > ( Arrays . asList ( \"79210000000\" )); user . setEmails ( new HashSet < > ( Arrays . asList ( \"john.doe@infobip.com\" )); user . setExternalUserId ( \"ExternalId\" ); MobileMessaging . getInstance ( context ). saveUser ( user , new MobileMessaging . ResultListener < User > () { @ Override public void onResult ( Result < User , MobileMessagingError > result ) {\n\n }\n}); Please note that saveUser() may return a USER_MERGE_INTERRUPTED error if you have provided an already existing Phone number, Email, or External User Id that are already taken by another existing user profile. In other words, that particular phone/email/externalUserId is a unique identifier of an already existing user, different from the one that this installation is currently personalized with. You can find more details about this, and other possible errors at Server errors . If you wish to personalize the app installation with another existing user, that is, merge current user with another one, please use our Personalize API: val userIdentity = UserIdentity ()\nuserIdentity.phones = HashSet ( listOf ( \" 79210000000 \" ))\nuserIdentity.emails = HashSet ( listOf ( \" john.doe@infobip.com \" ))\nuserIdentity.externalUserId = \" ExternalId \" MobileMessaging .getInstance(context).personalize(userIdentity, null , object : ResultListener < User > () { override fun onResult ( result : Result < User , MobileMessagingError > ) {\n \n }\n}) expand to see Java code UserIdentity userIdentity = new UserIdentity (); userIdentity . setPhones ( new HashSet < > ( Arrays . asList ( \"79210000000\" )); userIdentity . setEmails ( new HashSet < > ( Arrays . asList ( \"john.doe@infobip.com\" )); userIdentity . setExternalUserId ( \"ExternalId\" ); MobileMessaging . getInstance ( context ). personalize ( userIdentity , null , new ResultListener < User > () { @ Override public void onResult ( Result < User , MobileMessagingError > result ) {\n \n }\n}); External User ID You can use External User ID to uniquely target your user. External User ID is meant to be an ID of a user in an external (non-Infobip) service. It can be any string and can be shared across different instances of your app, so that a user with multiple devices can still be targeted as a single user of your app. Notice: for externalUserId any string values such as \"null\", \"Null\" or \"NULL\" are not supported and would be considered as JSON null Depersonalization You can depersonalize current installation to detach it from current user profile so that the user won't receive messages when targeted by any person attribute: MobileMessaging .getInstance(context).depersonalize( object : ResultListener < SuccessPending > () { override fun onResult ( result : Result < SuccessPending , MobileMessagingError > ) {\n \n }\n}) expand to see Java code MobileMessaging . getInstance ( context ). depersonalize ( new ResultListener < SuccessPending > () { @ Override public void onResult ( Result < SuccessPending , MobileMessagingError > result ) {\n \n }\n}); You also can depersonalize any installation that is personalized with the current user: val pushRegId : String = < push reg id of another installation of user > MobileMessaging .getInstance(context).depersonalizeInstallation(pushRegId, object : ResultListener < List < Installation > > () { override fun onResult ( result : Result < List < Installation > , MobileMessagingError > ) {\n \n }\n}) expand to see Java code String pushRegId = < push reg id of another installation of user > MobileMessaging . getInstance ( context ). depersonalizeInstallation ( pushRegId , new ResultListener < List < Installation > > () { @ Override public void onResult ( Result < List < Installation > , MobileMessagingError > result ) {\n \n }\n}); Q: When should I log out my users? A: Application users can (and probably should) be logged out if the app meets all the following conditions: you leverage user attributes functionality your application has \"log out\"/\"sign out\" feature you don't want a newly logged in (signed up) user to be targeted by other user's data (such as phone numbers, first name, custom attributes etc.) and receive personalized messages you want logged out (signed out) user to still receive broadcast notifications (if not, you need to disable push registration ) Personalize with force depersonalization If you want previous personalization to be reset, in other words, you want current users other installations to depersonalized, provide a special argument forceDepersonalize : val userIdentity = UserIdentity ()\nuserIdentity.phones = HashSet ( listOf ( \" 79210000000 \" ))\nuserIdentity.emails = HashSet ( listOf ( \" john.doe@infobip.com \" ))\nuserIdentity.externalUserId = \" ExternalId \" MobileMessaging .getInstance(context).personalize(userIdentity, null , true , object : ResultListener < User > () { override fun onResult ( result : Result < User , MobileMessagingError > ) {\n \n }\n}) expand to see Java code UserIdentity userIdentity = new UserIdentity (); userIdentity . setPhones ( new HashSet < > ( Arrays . asList ( \"79210000000\" )); userIdentity . setEmails ( new HashSet < > ( Arrays . asList ( \"john.doe@infobip.com\" )); userIdentity . setExternalUserId ( \"ExternalId\" ); MobileMessaging . getInstance ( context ). personalize ( userIdentity , null , true , new ResultListener < User > () { @ Override public void onResult ( Result < User , MobileMessagingError > result ) {\n \n }\n}); Standard attributes You can set different standard attributes of a user, such as First name , Last name , Birthday etc.: val user = User ()\nuser.firstName = \" John \" user.lastName = \" Doe \" user.gender = UserAttributes . Gender . Male user.birthday = SimpleDateFormat ( \" yyyy-MM-dd \" ).parse( \" 1968-02-10 \" ) MobileMessaging .getInstance(context).saveUser(user, object : ResultListener < User > () { override fun onResult ( result : Result < User , MobileMessagingError > ) {\n \n }\n}) expand to see Java code User user = new User (); user . setFirstName ( \"John\" ); user . setLastName ( \"Doe\" ); user . setGender ( User . Gender . Male ); user . setBirthday ( new SimpleDateFormat ( \"yyyy-MM-dd\" ). parse ( \"1968-02-10\" )); MobileMessaging . getInstance ( context ). saveUser ( user , new MobileMessaging . ResultListener < User > () { @ Override public void onResult ( Result < User , MobileMessagingError > result ) {\n \n }\n}); Custom attributes Apart from a list of standard attributes, each User can have a set of custom ones. These are commonly used to cover any use-cases about targeting and segmentation, which are not covered by the platform out of the box. Custom attributes are key-value pairs. Keys are of string type, values can be of string , number , boolean , date , datetime or list of objects data type. Difference between date and datetime types is that usage of date doesn't sync time to the server (e.g. \"2020-11-30\"), but with datetime we provide timestamp as well that can be visible on web. You can easily update custom attributes of a user with the same api: val user = User ()\nuser.setCustomAttribute( \" favouriteMeal \" , CustomAttributeValue ( \" pizza \" ))\nuser.setCustomAttribute( \" bootSize \" , CustomAttributeValue ( 9 ))\nuser.setCustomAttribute( \" isSubscribed \" , CustomAttributeValue ( true ))\nuser.setCustomAttribute( \" installationDate \" , CustomAttributeValue ( Date ()))\nuser.setCustomAttribute( \" lastVisitDateTime \" , CustomAttributeValue ( CustomAttributeValue . DateTime ( Date ())))\nuser.removeCustomAttribute( \" height \" ) // this way data will be erased on server // add list of objects as a custom attribute val favsList : ArrayList < ListCustomAttributeItem > = ArrayList () val listCustomAttributeItem1 = ListCustomAttributeItem .builder()\n .putString( \" id \" , \" 1 \" )\n .putNumber( \" price \" , 99.99 )\n .putBoolean( \" sale \" , true )\n .build() val listCustomAttributeItem2 = ListCustomAttributeItem .builder()\n .putString( \" id \" , \" 2 \" )\n .putNumber( \" price \" , 149.99 )\n .putBoolean( \" sale \" , false )\n .build()\nfavsList.add(listCustomAttributeItem1)\nfavsList.add(listCustomAttributeItem2)\nuser.setListCustomAttribute( \" favsList \" , ListCustomAttributeValue (favsList)) // save data to server MobileMessaging .getInstance(context).saveUser(user, object : ResultListener < User > () { override fun onResult ( result : Result < User , MobileMessagingError > ) {\n \n }\n}) expand to see Java code User user = new User (); user . setCustomAttribute ( \"favouriteMeal\" , new CustomAttributeValue ( \"pizza\" )); user . setCustomAttribute ( \"bootSize\" , new CustomAttributeValue ( 9 )); user . setCustomAttribute ( \"isSubscribed\" , new CustomAttributeValue ( true )); user . setCustomAttribute ( \"installationDate\" , new CustomAttributeValue ( new Date ())); user . setCustomAttribute ( \"lastVisitDateTime\" , new CustomAttributeValue ( new CustomAttributeValue . DateTime ( new Date ()))); user . removeCustomAttribute ( \"height\" ); // this way data will be erased on server // add list of objects as a custom attribute ArrayList < ListCustomAttributeItem > favsList = new ArrayList < > (); ListCustomAttributeItem listCustomAttributeItem1 = ListCustomAttributeItem . builder ()\n . putString ( \"id\" , \"1\" )\n . putNumber ( \"price\" , 99.99 )\n . putBoolean ( \"sale\" , true )\n . build (); ListCustomAttributeItem listCustomAttributeItem2 = ListCustomAttributeItem . builder ()\n . putString ( \"id\" , \"2\" )\n . putNumber ( \"price\" , 149.99 )\n . putBoolean ( \"sale\" , false )\n . build (); favsList . add ( listCustomAttributeItem1 ); favsList . add ( listCustomAttributeItem2 ); user . setListCustomAttribute ( \"favsList\" , new ListCustomAttributeValue ( favsList )); // save data to server MobileMessaging . getInstance ( context ). saveUser ( user , new MobileMessaging . ResultListener < User > () { @ Override public void onResult ( Result < User , MobileMessagingError > result ) {\n\n }\n}); And you can get current values of the custom attributes as well: val user = MobileMessaging .getInstance(context).user val favoriteMeal = user !! .getCustomAttributeValue( \" favoriteMeal \" ).stringValue() val bootSize : Int = user.getCustomAttributeValue( \" bootSize \" ).numberValue().toInt() val isSubscribed = user.getCustomAttributeValue( \" isSubscribed \" ).booleanValue() val installationDate = user.getCustomAttributeValue( \" installationDate \" ).dateValue() val lastVisitDateTime = user.getCustomAttributeValue( \" lastVisitDateTime \" ).dateTimeValue() val favsList2 = user.getListCustomAttributeItems( \" favsList \" ) expand to see Java code User user = MobileMessaging . getInstance ( context ). getUser (); String favoriteMeal = user . getCustomAttributeValue ( \"favoriteMeal\" ). stringValue (); Integer bootSize = user . getCustomAttributeValue ( \"bootSize\" ). numberValue (). intValue (); Boolean isSubscribed = user . getCustomAttributeValue ( \"isSubscribed\" ). booleanValue (); Date installationDate = user . getCustomAttributeValue ( \"installationDate\" ). dateValue (); CustomAttributeValue . DateTime lastVisitDateTime = user . getCustomAttributeValue ( \"lastVisitDateTime\" ). dateTimeValue (); List < ListCustomAttributeItem > favsList2 = user . getListCustomAttributeItems ( \"favsList\" ); With this data, you can segment users by using Segments and target them by their custom attribute values: List of objects Detailed description on what list of objects is, some common use cases and how to set it on web are provided here .\nMobile implementation specifics: as provided in the upper example of updating custom attributes, list of objects can be set as a custom attribute, but this type is more complex list of objects needs to be created on web it needs to have the same structure as on web when it's provided from SDK, otherwise error will be returned as an error response supported types are: string , number , boolean , date and datetime Tags You can add or remove Tags from users based on their preferences or interests. Using Tags you can easily segment users which are interested in any specific topic and send messages only to such users. val user = User ()\nuser.tags = HashSet ( listOf ( \" Promotions \" , \" Transactions \" )) MobileMessaging .getInstance(context).saveUser(user, object : MobileMessaging . ResultListener < User > () { override fun onResult ( result : Result < User , MobileMessagingError > ) {\n \n }\n}) expand to see Java code User user = new User (); user . setTags ( new HashSet < > ( Arrays . asList ( \"Promotions\" , \"Transactions\" )); MobileMessaging . getInstance ( context ). saveUser ( user , new MobileMessaging . ResultListener < User > () { @ Override public void onResult ( Result < User , MobileMessagingError > result ) {\n\n }\n}); Afterwards you will see these tags in a user profile and will be able to segment such users when sending targeted messages or campaigns. User data storage By default, user data is stored on a device, so it can be available even when the device is offline. Also, we store unreported user data, so we can automatically retry sending it to our server.\nIn order to change default behaviour and disable storing user data, do as follows: MobileMessaging . Builder (application)\n .withoutStoringUserData()\n .build() expand to see Java code new MobileMessaging . Builder ( application )\n . withoutStoringUserData ()\n . build ();","filename":"Users-and-installations.md","format":"markdown","hl_body":"Table of contents Terminology Installation Enabling/disabling push registration Setting installation as primary Custom attributes User Personalization: phone numbers, emails and external user ID","hl_title":"Users and installations","id":"8bb3b9cf2fd042ce5f32588ce31e3697098d5a68","path":"Users-and-installations.md","public":true,"repo":{"repository":{"id":56227769,"name":"mobile-messaging-sdk-android","owner_id":1288491,"owner_login":"infobip","updated_at":"2024-05-20T13:38:15.744Z","has_issues":true}},"repo_id":56227769,"title":"Users and installations","updated_at":"2023-12-01T08:10:57.000Z"},{"body":"Table of contents Terminology Installation Enabling/disabling push registration Setting installation as primary Custom attributes User Personalization: phone numbers, emails and external user ID External User ID Depersonalization Personalize with force depersonalization Standard attributes Custom attributes Tags User data storage Terminology Mobile Messaging SDK employs specific terms in order to address different type of information that you can synchronize towards Infobip Platform. You will see MMUser and MMInstallation terms in the SDK similarly to what you can see at People section at Infobip Portal. MMInstallation is a specific installation of your application. You can see it as Mobile App Messaging (Push Notifications) destination under \"Contact Information\" tab of a user profile. A single user can have zero or more installations of different applications. You can change some specific settings of each installation of a user, add Custom attributes to it or do a remote Logout of a specific installation. User represents a single person profile with Standard attributes , Custom attributes and Tags which you can set via the SDK. Both user and installation objects are initialized once Mobile Messaging SDK is successfully started. Installation MMInstallation is a specific installation (or instance) of your application on a user's device. One user can have multiple installations.\nYou can get current installation details from server: MobileMessaging. fetchInstallation ( completion : { installation, error in if let error = error { < handle error if not nil > } else { print ( \" installation updated: \\( installation ) \" )\n }\n}) expand to see Objective-C code [MobileMessaging fetchInstallationWithCompletion: ^(MMInstallation * _Nullable installation, NSError * _Nullable error) { if (error != nil ) { < handle error if not nil > } else { NSLog ( @\" installation updated: %@ ) \" , installation);\n }\n}]; All the current users installations are also available under user profile: let installations: [MMInstallations] ? = MobileMessaging. getUser () ? . installations expand to see Objective-C code NSArray < MMInstallation * > *installations = [[MobileMessaging getUser ] installations ]; Enabling/disabling push registration You can temporarily \"disable\" your installation if you don't want to receive push notifications: if let installation = MobileMessaging. getInstallation () {\n installation. isPushRegistrationEnabled = false MobileMessaging. saveInstallation (installation, completion : { error in if let error = error { < handle error if not nil > }\n })\n} expand to see Objective-C code MMInstallation * installation = [MobileMessaging getInstallation ]; if (installation != nil ) {\n installation. isPushRegistrationEnabled = false ;\n [MobileMessaging saveInstallation: installation completion: ^( NSError * _Nullable error) { if (error != nil ) { /* handle error if not nil */ }\n }];\n} Setting installation as primary On the Infobip account, a single user profile can have one or more mobile devices with the application installed. You might want to mark one of these devices as the primary device and send push messages only to this device (e.g. receive bank authorization codes only on one device). To achieve this and similar use-cases, you can utilize the APIs provided by the Mobile Messaging SDK. For this feature to work, the API request for sending the push notification must include a special parameter targetOnlyPrimaryDevices set to true . Parameters for sending a single push notification can be checked in the Infobip API Docs . With this parameter, push notifications will not be sent to any installations that are not marked as primary . This means that for this feature to work, both the mobile implementation and the API request parameter must be used in conjunction. By default, all installations are marked as non-primary. To set a particular installation as primary, either the Contact Information API or the following Mobile Messaging SDK API can be used: if let installation = MobileMessaging. getInstallation () {\n installation. isPrimaryDevice = true MobileMessaging. saveInstallation (installation, completion : { error in if let error = error { < handle error if not nil > }\n })\n} expand to see Objective-C code MMInstallation * installation = [MobileMessaging getInstallation ]; if (installation != nil ) {\n installation. isPrimaryDevice = true ;\n [MobileMessaging saveInstallation: installation completion: ^( NSError * _Nullable error) { if (error != nil ) { /* handle error if not nil */ }\n }];\n} You can set/reset primary setting for any other installation of a current user: let pushRegId = < Push Registration ID of another installation > MobileMessaging. setInstallation ( withPushRegistrationId : pushRegId, asPrimary : false , completion : { installations, error in if let error = error { < handle error if not nil > } else { print ( \" installations updated: \\( installations ) \" )\n }\n}) expand to see Objective-C code NSString *pushRegId = < Push Registration ID of another installation > ;\n[MobileMessaging setInstallationWithPushRegistrationId: pushRegId asPrimary: false completion: ^( NSArray < MMInstallation * > * _Nullable installations, NSError * _Nullable error) { if (error != nil ) { /* handle error if not nil */ } else { NSLog ( @\" installations updated: %@ \" , installations);\n }\n}]; Custom attributes An Installation can have custom attributes in the same way as User does. Custom installation attributes allow you to target specific installations of the same user. if let installation = MobileMessaging. getInstallation () {\n installation. customAttributes = [ \" OneTimePasswords \" : true as NSNumber]\n\n MobileMessaging. saveInstallation (installation, completion : { error in if let error = error { < handle error if not nil > }\n })\n} expand to see Objective-C code MMInstallation * installation = [MobileMessaging getInstallation ]; if (installation != nil ) {\n installation. customAttributes = @{ @\" OneTimePasswords \" : @ YES };\n [MobileMessaging saveInstallation: installation completion: ^( NSError * _Nullable error) { if (error != nil ) { /* handle error if not nil */ }\n }];\n} These custom attributes can be seen under push destination card on a portal: User You can provide additional user's data to the server, so that you will be able to send personalised targeted messages to exact user and have other nice features. Library supports a set of predefined attributes as well as custom ones. You can always get current user data from server via the SDK API. The request produce an HTTP call, so make sure to handle failures if any. MobileMessaging. fetchUser ( completion : { user, error in if let error = error { < handle error if not nil > } else { print ( \" user fetched: \\( user ) \" )\n }\n}) expand to see Objective-C code [MobileMessaging fetchUserWithCompletion: ^(MMUser * _Nullable user, NSError * _Nullable error) { if (error != nil ) { /* handle error if not nil */ } else { NSLog ( @\" user fetched \" , user)\n }\n}]; Personalization: phone numbers, emails and external user ID Each user can have Phone numbers , Emails and External user ID . These fields are unique identifiers of a user profile on Infobip platform and provide capability to personalize any app installation with a user profile. The platform provides data grouping functions based on these parameters. For example, if two installations of a particular app will try to save the same Phone number , then both of them will be collected under a single user. Phone number , Email and External user ID are also widely used when targeting users with messages across different channels via Infobip platform. Following restrictions apply: Phone number: string, https://en.wikipedia.org/wiki/E.164 , i.e. \"79210000000\" ) Email: string, format described in https://tools.ietf.org/html/rfc2822 , i.e. \"user@mail.com\" ) External User Id: any string, except any form of \"null\", \"Null\", \"NULL\" etc are not supported and would be considered as JSON null if let user = MobileMessaging. getUser () {\n user. phones = [ \" 79210000000 \" ]\n user. emails = [ \" john.doe@infobip.com \" ]\n user. externalUserId = \" ExternalId \" MobileMessaging. saveUser (user, completion : { error in if let error = error { < handle error if not nil > }\n })\n} expand to see Objective-C code MMUser *user = [MobileMessaging getUser ]; if (user != nil ) {\n user. phones = @[ @\" 79210000000 \" ];\n user. emails = @[ @\" john.doe@infobip.com \" ];\n user. externalUserId = @\" ExternalId \" ;\n\n [MobileMessaging saveUser: user completion: ^( NSError * _Nullable error) { if (error != nil ) { /* handle error if not nil */ }\n }];\n} Please note that saveUser() may return a USER_MERGE_INTERRUPTED error if you have provided an already existing Phone number, Email, or External User Id that are already taken by another existing user profile. In other words, that particular phone/email/externalUserId is a unique identifier of an already existing user, different from the one that this installation is currently personalized with. You can find more details about this, and other possible errors at Server errors . If you wish to personalize the app installation with another existing user, that is, merge current user with another one, please use our Personalize API: let userIdentity = MMUserIdentity ( phones : [ \" 79210000000 \" ], emails : [ \" john.doe@infobip.com \" ], externalUserId : \" ExternalId \" )\nMobileMessaging. personalize ( withUserIdentity : userIdentity, userAttributes : nil , completion : { error in if let error = error { < handle error if not nil > }\n}) expand to see Objective-C code MMUserIdentity *userIdentity = [[MMUserIdentity alloc ] initWithPhones: @[ @\" 79210000000 \" ] emails: @[ @\" john.doe@infobip.com \" ] externalUserId: \" ExternalId \" ];\n[MobileMessaging personalizeWithUserIdentity: userIdentity userAttributes: nil completion: ^( NSError * _Nullable error) { if (error != nil ) { /* handle error if not nil */ }\n}]; External User ID You can use External User ID to uniquely target your user. External User ID is meant to be an ID of a user in an external (non-Infobip) service. It can be any string and can be shared across different instances of your app, so that a user with multiple devices can still be targeted as a single user of your app. Notice: for externalUserId any string values such as \"null\", \"Null\" or \"NULL\" are not supported and would be considered as JSON null . Depersonalization You can depersonalize current installation to detach it from current user profile so that the user won't receive messages when targeted by any person attribute: let pushRegId = < Push Registration ID of another installation > MobileMessaging. depersonalize ( completion : { status, error in if let error = error { < handle error if not nil > } else { print ( \" installations depersonalized, status: \\( status ) \" )\n }\n}) expand to see Objective-C code NSString *pushRegId = < Push Registration ID of another installation > ;\n[MobileMessaging depersonalizeWithCompletion: ^( enum MMSuccessPending status, NSError * _Nullable error) { if (error != nil ) { /* handle error if not nil */ } else { NSLog ( @\" Installation depersonalized, status: %ld \" , ( long )status);\n }\n}]; You also can depersonalize any installation that is personalized with the current user: let currentUser = MobileMessaging. getUser () let pushRegId = currentUser ? . installations ? . < filter the one appropriately > . pushRegistrationId MobileMessaging. depersonalizeInstallation ( withPushRegistrationId : pushRegId, completion : { installations, error in if let error = error { < handle error if not nil > } else { print ( \" installations updated: \\( installations ) \" )\n }\n}) expand to see Objective-C code MMUser *currentUser = [MobileMessaging getUser ]; NSString *pushRegId = currentUser.intallations. < filter the one appropriately > .pushRegistrationId;\n[MobileMessaging depersonalizeInstallationWithPushRegistrationId: pushRegId completion: ^( NSArray < MMInstallation * > * _Nullable installations, NSError * _Nullable error) { if (error != nil ) { /* handle error if not nil */ } else { NSLog ( @\" Installation updated %@ \" , installations);\n }\n}]; Q: When should I depersonalize my users installations? A: Installation can (and probably should) be depersonalized if the app meets all the following conditions: you leverage user attributes functionality your application has \"log out\"/\"sign out\" feature you don't want a newly logged in (signed up) user to be targeted by other user's data (such as phone numbers, first name, custom attributes etc.) and receive personalized messages you want logged out (signed out) user to still receive broadcast notifications (if not, you need to disable push registration ) Personalize with force depersonalization If you want previous personalization to be reset, in other words, you want current users other installations to depersonalized, provide a special argument forceDepersonalize : let userIdentity = MMUserIdentity ( phones : [ \" 79210000000 \" ], emails : nil , externalUserId : nil ) let userAttributes = MMUserAttributes ( firstName : \" John \" , middleName : nil , lastName : \" Doe \" , ... )\nMobileMessaging. personalize ( forceDepersonalize : true , userIdentity : userIdentity, userAttributes : userAttributes, completion : { error in if let error = error { < handle error if not nil > }\n}) expand to see Objective-C code MMUserIdentity *userIdentity = [[MMUserIdentity alloc ] initWithPhones: @[ @\" 79210000000 \" ] emails: nil externalUserId: nil ];\nMMUserAttributes *userAttributes = [[MMUserAttributes alloc ] initWithFirstName: @\" John \" middleName: nil lastName: @\" Doe \" tags: nil genderNonnull: MMGenderNonnullUndefined birthday: nil customAttributes: nil ];\n[MobileMessaging personalizeWithForceDepersonalize: true userIdentity: userIdentity userAttributes: userAttributes completion: ^( NSError * _Nullable error) { if (error != nil ) { /* handle error if not nil */ }\n}]; Standard attributes You can set different standard attributes of a user, such as First name , Last name , Birthday etc.: if let user = MobileMessaging. getUser () {\n user. firstName = \" John \" user. lastName = \" Doe \" user. gender = . Male user. birthday = Date ( fromString : \" 01.01.1970 \" )\n\n MobileMessaging. saveUser (user, completion : { error in if let error = error { < handle error if not nil > }\n })\n} expand to see Objective-C code MMUser *user = [MobileMessaging getUser ]; if (user != nil ) {\n user. firstName = @\" John \" ;\n user. lastName = @\" Doe \" ;\n user. genderNonnull = MMGenderNonnullMale;\n user. birthday = [Date fromString: @\" 01.01.1970 \" ];\n\n [MobileMessaging saveUser: user completion: ^( NSError * _Nullable error) { if (error != nil ) { /* handle error if not nil */ }\n }];\n} Custom attributes Apart from list of standard attributes, each MMUser can have a set of custom ones. Custom attributes commonly used to cover those use-cases about targeting and segmentation that are not supported by the platform out of the box. Custom attributes are key-value pairs. Keys are of string types, values can be of number , boolean , date , dateTime or list of objects data types. Difference between date and datetime types is that usage of date doesn't sync time to the server (e.g. \"2020-11-30\"), but with datetime we provide timestamp as well that can be visible on web. You can easily update custom attributes of a user as follows: if let user = MobileMessaging. getUser () {\n user. customAttributes = [ \" favoriteMeal \" : \" pizza \" as NSString, \" bootSize \" : 9.5 as NSNumber, \" isSubscribed \" : true as NSNumber \" height \" : NSNull (), // this way data will be erased on server \" installationDate \" : NSDate (), \" lastVisitDateTime \" : MMDateTime ( date : Date ()], \" favsList \" : [\n [ \" id \" : \" 1 \" , \" price \" : 99.99 , \" sale \" : true ],\n [ \" id \" : \" 2 \" , \" price \" : 149.99 , \" sale \" : false ],\n ] as NSArray\n ]\n\n MobileMessaging. saveUser (user, completion : { error in if let error = error { < handle error if not nil > }\n })\n} expand to see Objective-C code MMUser *user = [MobileMessaging getUser ]; if (user != nil ) {\n user. customAttributes = @{ @\" favoriteMeal \" : @\" pizza \" , @\" bootSize \" : @ 9.5 , @\" isSubscribed \" : @ YES , @\" height \" : [ NSNull null ], @\" installationDate \" : [ NSDate date ], @\" lastVisitDateTime \" : [[MMDateTime alloc ] initWithDate: [ NSDate date ]], @\" favsList \" : @[\n @{ @\" id \" : @\" 1 \" , @\" price \" : @ 99.99 , @\" sale \" : @ YES },\n @{ @\" id \" : @\" 2 \" , @\" price \" : @ 149.99 , @\" sale \" : @ NO }\n ]\n };\n \n [MobileMessaging saveUser: user completion: ^( NSError * _Nullable error) { if (error != nil ) { /* handle error if not nil */ }\n }];\n } And you can get current values of the custom attributes as well: let user = MobileMessaging. getUser () let favoriteMeal = user ? . customAttributes ? [ \" favoriteMeal \" ] as? NSString let bootSize = (user ? . customAttributes ? [ \" bootSize \" ] as? NSNumber) ? . doubleValue let isSubscribed = (user ? . customAttributes ? [ \" isSubscribed \" ] as? NSNumber) ? . boolValue let installationDate = user ? . customAttributes ? [ \" installationDate \" ] as? NSDate let lastVisitDateTime = user ? . customAttributes ? [ \" lastVisitDateTime \" ] as? MMDateTime let favsList = user ? . customAttributes ? [ \" favsList \" ] as? NSArray expand to see Objective-C code MMUser *user = [MobileMessaging getUser ]; NSString *favoriteMeal = ( NSString *)user.customAttributes[ @\" favoriteMeal \" ]; double bootSize = [( NSNumber *)user.customAttributes[ @\" bootSize \" ] doubleValue ]; BOOL isSubscribed = [( NSNumber *)user.customAttributes[ @\" isSubscribed \" ] boolValue ]; NSDate *installationDate = ( NSDate *)user.customAttributes[ @\" installationDate \" ];\nMMDateTime *lastVisitDateTime = (MMDateTime *)user.customAttributes[ @\" lastVisitDateTime \" ]; NSArray *favsList = ( NSArray *)user.customAttributes[ @\" favsList \" ]; With this data, you can segment users by using Segments and target them by their custom attribute values: List of objects Detailed description on what list of objects is, some common use cases and how to set it on web are provided here .\nMobile implementation specifics: as provided in the upper example of updating custom attributes, list of objects can be set as a custom attribute, but this type is more complex list of objects needs to be created on web it needs to have the same structure as on web when it's provided from SDK, otherwise error will be returned as an error response supported types are: string , number , boolean , date and datetime Tags You can add or remove Tags from users based on their preferences or interests. Using Tags you can easily segment users which are interested in any specific topic and send messages only to such users. if let user = MobileMessaging. getUser () {\n user. tags = [ \" Promotions \" , \" Transactions \" ]\n\n MobileMessaging. saveUser (user, completion : { error in if let error = error { < handle error if not nil > }\n })\n} expand to see Objective-C code MMUser *user = [MobileMessaging getUser ]; if (user != nil ) {\n user. tags = @[ @\" Promotions \" , @\" Transactions \" ];\n [MobileMessaging saveUser: user completion: ^( NSError * _Nullable error) { if (error != nil ) { /* handle error if not nil */ }\n }];\n} Afterwards you will see these tags in a user profile and will be able to segment such users when sending targeted messages or campaigns. User data storage By default, user data is stored on a device, so it can be available even when the device is offline. Also, we store unreported user data, so we can automatically retry sending it to our server.\nIn order to change default behaviour and disable storing user data, do as follows: MobileMessaging. privacySettings . userDataPersistingDisabled = true","filename":"Users-and-installations.md","format":"markdown","hl_body":"Table of contents Terminology Installation Enabling/disabling push registration Setting installation as primary Custom attributes User Personalization: phone numbers, emails and external user ID","hl_title":"Users and installations","id":"58881eee7d58d079c8890842859c2615186d3e84","path":"Users-and-installations.md","public":true,"repo":{"repository":{"id":56227703,"name":"mobile-messaging-sdk-ios","owner_id":1288491,"owner_login":"infobip","updated_at":"2024-04-26T09:07:30.224Z","has_issues":true}},"repo_id":56227703,"title":"Users and installations","updated_at":"2023-12-01T08:08:56.000Z"},{"body":"View Assist Wiki Home 01 Tablet Satellite Installation Android Software IP Webcam installation and configuration RtpMic installation and configuration Fully Kiosk installation and configuration Wallpanel installation and configuration Home Assistant Assist Pipeline installation and configuration StreamAssist Extension installation and configuration Browser Mod Extension installation and configuration 02 View Assist Installation View Assist device configuration Dashboard and Views Control Automations Custom Sentences More to come Thanks for your patience 03 Supported Devices Lenovo ThinkSmart Experimental ESPHome Voice Satellite","filename":"_Sidebar.md","format":"markdown","hl_body":"View Assist Wiki Home 01 Tablet Satellite Installation Android Software IP Webcam installation and configuration RtpMic installation and configuration Fully Kiosk installation and configuration ...","hl_title":"_Sidebar","id":"a3bf10bdbb0d23405dd7ade5dea945b51a88d072","path":"_Sidebar.md","public":true,"repo":{"repository":{"id":768643328,"name":"View-Assist","owner_id":2521542,"owner_login":"dinki","updated_at":"2024-06-01T20:31:29.077Z","has_issues":true}},"repo_id":768643328,"title":"_Sidebar","updated_at":"2024-06-01T15:40:27.000-05:00"},{"body":"Deprecated New file could be found here https://github.com/ioBroker/ioBroker.docs/blob/master/docs/en/install/linux.md Installation guide This page contains a short description on how to install ioBroker. See below for more detailed and localized version of the installation steps. Linux based systems and MacOS Installing ioBroker Please open a SSH shell. You do not need to use a root shell to install ioBroker. If a normal unprivilidged user exists you should start the installation with this user. Then execute curl -sL https://iobroker.net/install.sh | bash - This will install ioBroker in 4 steps and show its progress: Creating ioBroker directory (1/4) Downloading installation files (2/4) Installing ioBroker (3/4) Finalizing installation (4/4) At the end you should see ioBroker was installed successfully Open http://localhost:8081 in a browser and start configuring! The installer will create a new user called \"iobroker\" on your Linux system and configures anything that iobroker and the adapter can run as this user. root is not longer needed and also \"sudo\" is no longer needed. Please do not use it! Configure ioBroker Go to http://IP-Adresse:8081 in your browser. To install adapters please use Admin UI in your browser or the ioBroker commandline commands like: iobroker start/stop iobroker install adaptername iobroker add adaptername https://github.com/ioBroker/ioBroker/wiki/Console-commands Detailed Guide German: http://www.iobroker.net/docu/?page_id=8323 & lang=de Update Installation (Permissions, Access Rights, ...) The installation as described above takes also care of setting correct permissions and access rights to files and also about special requirements. The installation logic will be enhances as soon as needed because additional requirements are added. The version of your installation is included in a file called INSTALLER_INFO.txt in your ioBroker installation directory. You can always check in https://github.com/ioBroker/ioBroker/blob/master/CHANGELOG_INSTALLER_LINUX.md what was updated after you installed ioBroker. For older installations or to update your installation to the latest installation version we have created a installation fixer script that is capable to update all installations to the same level.\nThe changelog of this fixer can be found at https://github.com/ioBroker/ioBroker/blob/master/CHANGELOG_FIXER_LINUX.md Running the Installation fixer is as easy as installing. Simply execute curl -sL https://raw.githubusercontent.com/ioBroker/ioBroker/stable-installer/fix_installation.sh | bash - and follow the instructions. You need to stop ioBroker before running the script. Windows Installation Download installer On windows the former installation way ist still the way to go. So please prepare your sytem with nodejs 8.12+ and npm 6.4.1+ Then create a directory for ioBroker (e.g. C:\\iobroker), an Administrator shell and change into this directory. Then run npm install iobroker and follow the instructions on screen. Detailed Guide German: https://www.iobroker.net/#de/documentation/install/windows.md","filename":"Installation.md","format":"markdown","hl_body":"Deprecated New file could be found here https://github.com/ioBroker/ioBroker.docs/blob/master/docs/en/install/linux.md Installation guide This page contains a short description on how to install","hl_title":"Installation","id":"902bae9ac1f736e2810af10fa01f09b0005dda3d","path":"Installation.md","public":true,"repo":{"repository":{"id":22886718,"name":"ioBroker","owner_id":7231148,"owner_login":"ioBroker","updated_at":"2024-05-24T16:42:59.363Z","has_issues":true}},"repo_id":22886718,"title":"Installation","updated_at":"2023-01-07T15:28:22.000+02:00"},{"body":"Notes Requires an F5 for ingres, may need to make region api capable of supporting nginx ingress as well. LDAP isn't required, but if its used you'll need to install corp-auth Quay can be replaced with any docker registry that has credentials/protected write access to place gold master images, only tested with quay Need to make brokers (twilio, aws rds, papertrail, all of 'em optional) Need to make route 53 pluggable with other dns systems(?) Need to make digicert pluggable and replacable with lets encrypt. Support more than just AWS?... in brokers? and terraforming kube? Steps Check Third Party Systems: Papertrail log drain Twilio account AWS account/keys DigiCert account/keys Quay account/keys LDAP service account Master credentials for on-prem postgres? Github Bot Account / org Check Domains/Security: Check domain systems (route 53) LDAP Elevated access group, normal group, base dn, etc Check Network: Check elb-ingress-certificate systems Check F5 systems (install f5 via virtual edition on AWS?) check perms on existing F5, partitions, etc, ask inside vs. outside VIP) Check f5-ingress-certificate systems Begin AWS Provisioning Create one or two kubernetes (engineering cluster + runtime, or combined?) ETCD (EC2) Controllers/Workers (EC2) Kafka (EC2 or kubrerenetes w/helm? — requires statefulsets — https://github.com/kubernetes/charts/tree/master/incubator/kafka ) InfluxDB (EC2 or kubernetes w/helm? — https://github.com/kubernetes/charts/tree/master/stable/influxdb ) MongoDB (EC2 or kubernetes w/helm? — https://github.com/kubernetes/charts/tree/master/stable/mongodb ) RabbitMQ (EC2 or kubernetes w/helm? — https://github.com/kubernetes/charts/tree/master/stable/rabbitmq ) Syslog F5/kafka collector (EC2) Provision initial alamo-api database (postgres ris) Service Installations: Installation of vault (helm? https://github.com/kubernetes/charts/tree/master/incubator/vault ) Installation of jenkins build system (helm? https://github.com/kubernetes/charts/tree/master/stable/jenkins ) Kafkalogs plugin, docker pipeline etc plugin, ec2 slaves Installation of jenkins test system (helm? https://github.com/kubernetes/charts/tree/master/stable/jenkins ) Installation of quay/registry (helm? https://github.com/kubernetes/charts/tree/master/stable/docker-registry ) Installation of prometheus Installation of fluentd + config for kafka (zookeepers) Installation of nagios/monitoring/check systems (?) setup on opsgenie? Installation of membanks (helm? ) + default dashboards Installation of alamo-api Terraform RDS DB parameter groups for postgres Terraform RDS DB parameter groups for mysql Terraform RDS option groups for memcached Terraform RDS option groups for redis Terraform RDS hobby database Installation of postgres aws broker + prepro Installation of mysql aws broker + prepro Installation of memcached aws broker + prepro Installation of redis aws broker + prepro Installation of elastic search aws broker Installation of mongodb broker Installation of rabbitmq broker Installation of postgres-on-prem broker Installation of s3 aws broker Installation of service watcher Installation of node watcher Run alamo-api tests or any other tests Install in-akkeris services: Install log shuttle Install log session Install controller-api Install akkeris-api Install auth-api Install build shuttle Install corporate oauth (optional, if using ldap) Install site/routes for apps and auth sites Reset config or backfill config with sites Installation of metrics sampler Installation of app watcher Installation of self diagnostics Installation of cache scanner Installation of rabbitmq scanner Installation of postgres scanner Installation of anomaly/metrics-syslog-collector Installation of router scanner Run region-api tests, controller-api tests, ui tests","filename":"Installation-skeleton.md","format":"markdown","hl_body":" Installations: Installation of vault (helm? https://github.com/kubernetes/charts/tree/master/incubator/vault ) Installation of jenkins build system (helm? https://github.com/kubernetes/charts/tree/master","hl_title":"Installation skeleton","id":"5da10198cc63499b5978c2b833777b71ab236974","path":"Installation-skeleton.md","public":true,"repo":{"repository":{"id":133992392,"name":"contributing","owner_id":33560024,"owner_login":"akkeris","updated_at":"2018-05-22T12:58:29.690Z","has_issues":true}},"repo_id":133992392,"title":"Installation skeleton","updated_at":"2018-05-20T21:17:10.000-06:00"},{"body":"Welcome to the Arch Linux wiki! Installations Arch Linux Installation UEFI Arch Linux Installation LEGACY MariaDB Installation KDE Desktop Installation XFCE Desktop Installation Xmonad Desktop Installation LXQT Desktop Installation Display Manager Installation SSH Configuration & Installation QEMU Virtual Machine Installation Google Fonts Installation Bluetooth Installation Samba File Share Installation Apache Http Server Installation Flutter Installation Disk Cloning Configurations Wine Prefixes Configuration Drivers TP LINK tl wn821n v6 Driver Installation Utils Programs Games Arch Linux Commands & Helpful Content","filename":"Home.md","format":"markdown","hl_body":"Welcome to the Arch Linux wiki! Installations Arch Linux Installation UEFI Arch Linux Installation LEGACY MariaDB Installation KDE Desktop Installation XFCE Desktop Installation Xmonad Desktop ...","hl_title":"Home","id":"82d0f57cf813a127eae1201dca0fa503252be906","path":"Home.md","public":true,"repo":{"repository":{"id":562105712,"name":"arch_linux","owner_id":106118473,"owner_login":"LeandroTheDev","updated_at":"2024-02-14T17:13:12.319Z","has_issues":true}},"repo_id":562105712,"title":"Home","updated_at":"2024-05-30T13:50:29.000Z"},{"body":"#DiskCleanupFunction\nThe DiskCleanupFunction Class consists of functions related to cleaning up user's Wolfenstein: Enemy Territory Installation. ##Functions\n###DeleteETKey\nThis function checks fs_homepath and fs_basepath of the user's Wolfenstein: Enemy Territory Installation for ETKey and if it exists, the ETKey would be deleted. Code Format: DeleteETKey([fs_homepath], [fs_basepath]) [fs_homepath] - The fs_homepath of the user's Wolfenstein: Enemy Territory Installation. eg. C:\\Program Files (x86)\\Enemy Territory [fs_basepath] - The fs_basepath of the user's Wolfenstein: Enemy Territory Installation. eg. C:\\Program Files (x86)\\Enemy Territory ###DeleteModKey\nThis function checks fs_homepath and fs_basepath of the user's Wolfenstein: Enemy Territory Installation for specified Mod Keys and if the specified mod key exists, it would be deleted. As of ETLibrary Version 1.0.0.0 Beta, mods which are supported by this function are silent and nitmod. Code Format: DeleteModKey([fs_homepath], [fs_basepath], [ModName]) [fs_homepath] - The fs_homepath of the user's Wolfenstein: Enemy Territory Installation. eg. C:\\Program Files (x86)\\Enemy Territory [fs_basepath] - The fs_basepath of the user's Wolfenstein: Enemy Territory Installation. eg. C:\\Program Files (x86)\\Enemy Territory [ModName] - Name of Mod eg. For silent mod, write silent . List of [ModName] as of ETLibrary Version 1.0.0.0 Beta, silent nitmod ###DeleteCustomModKey\nThis function checks fs_homepath and fs_basepath of the user's Wolfenstein: Enemy Territory Installation for Custom Mod Key not supported by DeleteModKey Function and if it exists, the custom mod key would be deleted. Code Format: DeleteCustomModKey([fs_homepath], [fs_basepath], [ModFolderName], [ModKeyFile]) [fs_homepath] - The fs_homepath of the user's Wolfenstein: Enemy Territory Installation. eg. C:\\Program Files (x86)\\Enemy Territory [fs_basepath] - The fs_basepath of the user's Wolfenstein: Enemy Territory Installation. eg. C:\\Program Files (x86)\\Enemy Territory [ModFolderName] - The mod folder name in the user's Wolfenstein: Enemy Territory Installation. eg. silent mod folder name is silent .\n[ModKeyFile] - The mod key in the mod folder located in the user's Wolfenstein: Enemy Territory Installation. eg. The mod key in silent mod is silent.dat . ###DeleteProfiles\nThis function checks fs_homepath and fs_basepath of the user's Wolfenstein: Enemy Territory Installation for profiles and if profiles exists, the profiles would be deleted. Code Format: DeleteProfiles([fs_homepath], [fs_basepath]) [fs_homepath] - The fs_homepath of the user's Wolfenstein: Enemy Territory Installation. eg. C:\\Program Files (x86)\\Enemy Territory [fs_basepath] - The fs_basepath of the user's Wolfenstein: Enemy Territory Installation. eg. C:\\Program Files (x86)\\Enemy Territory ###DeleteTemporaryFiles\nThis function checks fs_homepath and fs_basepath of the user's Wolfenstein: Enemy Territory Installation for Temporary Files and if it exists, the temporary files would be deleted. Code Format: DeleteTemporaryFiles([fs_homepath], [fs_basepath]) [fs_homepath] - The fs_homepath of the user's Wolfenstein: Enemy Territory Installation. eg. C:\\Program Files (x86)\\Enemy Territory [fs_basepath] - The fs_basepath of the user's Wolfenstein: Enemy Territory Installation. eg. C:\\Program Files (x86)\\Enemy Territory ###DeleteUnnecessaryFiles\nThis function checks fs_homepath and fs_basepath of the user's Wolfenstein: Enemy Territory Installation for unnecessary files such as .pid, hunkusage.dat and servercache.dat files. If they exists, the ETKey would be deleted. Code Format: DeleteUnnecessaryFiles([fs_homepath], [fs_basepath]) [fs_homepath] - The fs_homepath of the user's Wolfenstein: Enemy Territory Installation. eg. C:\\Program Files (x86)\\Enemy Territory [fs_basepath] - The fs_basepath of the user's Wolfenstein: Enemy Territory Installation. eg. C:\\Program Files (x86)\\Enemy Territory ###DeleteLogFiles\nThis function checks fs_homepath and fs_basepath of the user's Wolfenstein: Enemy Territory Installation for Log Files and if they exists, the log files would be deleted. Code Format: DeleteLogFiles([fs_homepath], [fs_basepath]) [fs_homepath] - The fs_homepath of the user's Wolfenstein: Enemy Territory Installation. eg. C:\\Program Files (x86)\\Enemy Territory [fs_basepath] - The fs_basepath of the user's Wolfenstein: Enemy Territory Installation. eg. C:\\Program Files (x86)\\Enemy Territory ###DeleteMapFiles\nThis function delete map files by contacting an Online Map List Server which would compare the user's Wolfenstein: Enemy Territory Installation's map files with the list. When all the map files in the user's Wolfenstein: Enemy Territory Installation are found, they are deleted. This method requires an internet connection. It is recommended to add a check for internet connection in your code before using this method. Code Format: DeleteMapFiles([fs_homepath], [fs_basepath], [MapListServer]) [fs_homepath] - The fs_homepath of the user's Wolfenstein: Enemy Territory Installation. eg. C:\\Program Files (x86)\\Enemy Territory [fs_basepath] - The fs_basepath of the user's Wolfenstein: Enemy Territory Installation. eg. C:\\Program Files (x86)\\Enemy Territory [MapListServer] - The Map List Server Address. eg. http://example.com/maplist.txt Map List Server List A list of available Online Map List Server with their respective Map List Server Address. The developer of ETLibrary is not the author of any of the Online Map List Server unless otherwise stated. All Online Map List Server are created by other developers and hence, the servers are not maintained by the developer of ETLibrary unless otherwise stated. In the event the Online Map List Server goes offline, ETLibrary's DeleteMapFiles method will not work. You can create your own Online Map List Server and used it in ETLibrary. Currently Unavailable. This list will be updated in the future. ###DeleteUserConfigurationFiles\nThis function delete User Configuration Files by contacting an Online User Configuration List Server which would compare the user's Wolfenstein: Enemy Territory Installation's User Configuration files with the list. When all the User Configuration files in the user's Wolfenstein: Enemy Territory Installation are found, all User Configuration files besides those that are found in the User Configuration List are deleted. This method requires an internet connection. It is recommended to add a check for internet connection in your code before using this method. Code Format: DeleteUserConfigurationFiles([fs_homepath], [fs_basepath], [UserConfigurationListServer]) [fs_homepath] - The fs_homepath of the user's Wolfenstein: Enemy Territory Installation. eg. C:\\Program Files (x86)\\Enemy Territory [fs_basepath] - The fs_basepath of the user's Wolfenstein: Enemy Territory Installation. eg. C:\\Program Files (x86)\\Enemy Territory [UserConfigurationListServer] - The User Configuration List Server Address. eg. http://example.com/userconfigurationlist.txt User Configuration List Server List A list of available Online User Configuration List Server with their respective User Configuration List Server Address. The developer of ETLibrary is not the author of any of the Online User Configuration List Server unless otherwise stated. All Online User Configuration List Server are created by other developers and hence, the servers are not maintained by the developer of ETLibrary unless otherwise stated. In the event the Online User Configuration List Server goes offline, ETLibrary's DeleteUserConfigurationFiles method will not work. You can create your own Online User Configuration List Server and used it in ETLibrary. Currently Unavailable. This list will be updated in the future.","filename":"DiskCleanupFunction.md","format":"markdown","hl_body":"#DiskCleanupFunction\nThe DiskCleanupFunction Class consists of functions related to cleaning up user's Wolfenstein: Enemy Territory Installation. ##Functions\n###DeleteETKey\nThis function checks","hl_title":"DiskCleanupFunction","id":"e39734b520b6656dca2d7f96b1db0798c08f7e8a","path":"DiskCleanupFunction.md","public":true,"repo":{"repository":{"id":42054174,"name":"ETLibrary","owner_id":11722703,"owner_login":"blackknight8653","updated_at":"2015-09-25T14:19:52.557Z","has_issues":true}},"repo_id":42054174,"title":"DiskCleanupFunction","updated_at":"2015-09-28T15:48:53.000+08:00"}],"type":"wikis","page":1,"page_count":100,"elapsed_millis":246,"errors":[],"result_count":247820,"facets":[],"protected_org_logins":[],"topics":null,"query_id":"","logged_in":false,"sign_up_path":"/signup?source=code_search_results","sign_in_path":"/login?return_to=https%3A%2F%2Fgithub.com%2Fsearch%3Fq%3Dinstallation%2Bin%253Abody%26type%3DWikis","metadata":null},"title":"Wiki search results"}