{"id":20218086,"url":"https://github.com/matrix-org/matrix-ios-sdk","last_synced_at":"2025-10-18T09:44:40.273Z","repository":{"id":21316912,"uuid":"24633503","full_name":"matrix-org/matrix-ios-sdk","owner":"matrix-org","description":"The Matrix SDK for iOS","archived":false,"fork":false,"pushed_at":"2025-03-11T18:25:35.000Z","size":23454,"stargazers_count":460,"open_issues_count":171,"forks_count":217,"subscribers_count":49,"default_branch":"develop","last_synced_at":"2025-05-10T17:48:18.441Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Objective-C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/matrix-org.png","metadata":{"files":{"readme":"README.rst","changelog":"CHANGES.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":"AUTHORS.rst","dei":null,"publiccode":null,"codemeta":null}},"created_at":"2014-09-30T10:06:39.000Z","updated_at":"2025-05-05T10:09:21.000Z","dependencies_parsed_at":"2023-11-23T18:28:47.551Z","dependency_job_id":"c02f1ef1-3706-4ba1-b02c-478972d4bd38","html_url":"https://github.com/matrix-org/matrix-ios-sdk","commit_stats":{"total_commits":7420,"total_committers":85,"mean_commits":87.29411764705883,"dds":0.5673854447439353,"last_synced_commit":"d3cd87b4fefd75941674ecd37bd466169057d2f9"},"previous_names":[],"tags_count":220,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matrix-org%2Fmatrix-ios-sdk","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matrix-org%2Fmatrix-ios-sdk/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matrix-org%2Fmatrix-ios-sdk/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matrix-org%2Fmatrix-ios-sdk/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/matrix-org","download_url":"https://codeload.github.com/matrix-org/matrix-ios-sdk/tar.gz/refs/heads/develop","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254471060,"owners_count":22076585,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-14T06:37:06.224Z","updated_at":"2025-10-18T09:44:35.250Z","avatar_url":"https://github.com/matrix-org.png","language":"Objective-C","funding_links":[],"categories":[],"sub_categories":[],"readme":".. image:: https://img.shields.io/cocoapods/v/MatrixSDK?style=flat-square\n   :target: https://github.com/matrix-org/matrix-ios-sdk/releases\n.. image:: https://img.shields.io/cocoapods/p/MatrixSDK?style=flat-square\n   :target: README.rst\n.. image:: https://img.shields.io/github/workflow/status/matrix-org/matrix-ios-sdk/Lint%20CI/develop?style=flat-square\n   :target: https://github.com/matrix-org/matrix-ios-sdk/actions?query=branch%3Adevelop\n.. image:: https://codecov.io/gh/matrix-org/matrix-ios-sdk/branch/develop/graph/badge.svg?token=2c9mzJoVpu\n   :target: https://codecov.io/gh/matrix-org/matrix-ios-sdk\n.. image:: https://img.shields.io/badge/License-Apache%202.0-yellowgreen.svg?style=flat-square\n   :target: https://opensource.org/licenses/Apache-2.0\n\n==============\nMatrix iOS SDK\n==============\n\nThis open-source library allows you to build iOS apps compatible with Matrix\n(http://www.matrix.org), an open standard for interoperable Instant Messaging\nand VoIP.\n\nThis SDK implements an interface to communicate with the Matrix Client/Server\nAPI which is defined at http://matrix.org/docs/api/client-server/.\n\n\nPod Deprecation\n===============\n\nThe SDK is no longer published directly to Cocopods following recent linting issues\nwith Xcode 14.3 and greater: `CocoaPods/CocoaPods#11839 \u003chttps://github.com/CocoaPods/CocoaPods/issues/11839\u003e`_.\nThis deprecation *only* covers the published pod, the SDK is still being maintained.\n\nIt is however worth noting that we're now primarily focussed on the `Matrix Rust SDK \u003chttps://github.com/matrix-org/matrix-rust-sdk\u003e`_ \nand its respective FFI bindings which are available as a `Swift package \u003chttps://github.com/matrix-org/matrix-rust-components-swift/\u003e`_.\nThis would likely be a more sensible choice for anyone starting a new project using Matrix on Apple platforms.\n\n\nUse the SDK in your app\n=======================\n\nThe SDK uses CocoaPods (http://cocoapods.org/) as library dependency manager.\nIn order to set this up::\n\n    sudo gem install cocoapods\n    pod setup\n\nThe best way to add the Matrix SDK to your application is to add the MatrixSDK repo to your Podfile::\n\n    pod 'MatrixSDK', :git =\u003e 'https://github.com/matrix-org/matrix-ios-sdk.git', :tag =\u003e 'vX.Y.Z'\n\n\nOptions\n=======\nIf you want to enable VoIP using the http://webrtc.org VoIP stack, add the following pod to your app Podfile::\n\n    pod 'MatrixSDK/JingleCallStack'\n\n\nOverview\n========\n\nAs a quick overview, there are the classes to know to use the SDK.\n\nMatrix API level\n----------------\n:``MXRestClient``:\n    Exposes the Matrix Client-Server API as specified by the Matrix standard to\n    make requests to a homeserver.\n\n\nBusiness logic and data model\n-----------------------------\nThese classes are higher level tools to handle responses from a homeserver.\nThey contain logic to maintain consistent chat room data.\n\n:``MXSession``:\n    This class handles all data arriving from the homeserver. It uses a\n    MXRestClient instance to fetch data from the homeserver, forwarding it to\n    MXRoom, MXRoomState, MXRoomMember and MXUser objects.\n\n:``MXRoom``:\n     This class provides methods to get room data and to interact with the room\n     (join, leave...).\n\n:``MXRoomState``:\n     This is the state of room at a certain point in time: its name, topic,\n     visibility (public/private), members, etc.\n\n:``MXRoomMember``:\n     Represents a member of a room.\n\n:``MXUser``:\n     This is a user known by the current user, outside of the context of a\n     room. MXSession exposes and maintains the list of MXUsers. It provides\n     the user id, displayname and the current presence state.\n\nEnd-to-end Encryption\n---------------------\nAll core E2EE functionality is implemented in an external `matrix-sdk-crypto \u003chttps://github.com/matrix-org/matrix-rust-sdk/tree/main/crates/matrix-sdk-crypto\u003e`_\nRust crate, which replaces all previous obj-c / Swift implementation that used to exist in this repository.\n`MatrixSDK` integrates this crate via `pod MatrixSDKCrypto` published `separately \u003chttps://github.com/matrix-org/matrix-rust-sdk/tree/main/bindings/apple#publishing-matrixsdkcrypto\u003e`_.\n\nCode in `MatrixSDK` consists mostly of wrappers, networking logic and glue code connecting encryption with\ngeneral app functionality, sync loops and session state. Some of the notable classes include:\n\n:``MXCrypto``:\n    Main entry-point into all cryptographic functionality, such as encrypting/decrypting\n    events, cross-signing users, or managing room key backups. It is owned by the current\n    session and therefore specific to the current user. \n\n:``MXRoomEventEncryption``/``MXRoomEventDecryption``:\n    Two classes responsible for encrypting and decrypting message events and tasks that\n    are closely dependent, such as sharing room keys, reacting to late key-shares etc.\n\n:``MXCryptoMachine``:\n    Wrapper around Rust-based `OlmMachine`, providing a more convenient API. Its three main\n    responsibilities are:\n    - adding a layer of abstraction between `MatrixSDK` and `MatrixSDKCrypto`\n    - mapping to and from raw strings passed into the Rust machine\n    - performing network requests and marking them as completed on behalf of the Rust machine\n\nTo publish a new version of `MatrixSDKCrypto` follow a `separate process \u003chttps://github.com/matrix-org/matrix-rust-sdk/tree/main/bindings/apple#publishing-matrixsdkcrypto\u003e`_.\nTo test local / unpublished changes in `MatrixSDKCrypto`, `build the framework \u003chttps://github.com/matrix-org/matrix-rust-sdk/tree/main/bindings/apple#building-only-the-crypto-sdk\u003e`_\nand re-direct the pod in your `Podfile` to `pod MatrixSDKCrypto, :path =\u003e your/local/rust-crypto-sdk/MatrixSDKCrypto.podspec`\n\nUsage\n=====\n\nThe sample app (https://github.com/matrix-org/matrix-ios-console)\ndemonstrates how to build a chat app on top of Matrix. You can refer to it,\nplay with it, hack it to understand the full integration of the Matrix SDK.\nThis section comes back to the basics with sample codes for basic use cases.\n\nOne file to import:\n\n**Obj-C**::\n\n    #import \u003cMatrixSDK/MatrixSDK.h\u003e\n\n**Swift**::\n\n    import MatrixSDK\n\nUse case #1: Get public rooms of an homeserver\n-----------------------------------------------\nThis API does not require the user to be authenticated. So, MXRestClient\ninstantiated with initWithHomeServer does the job:\n\n**Obj-C**::\n\n    MXRestClient *mxRestClient = [[MXRestClient alloc] initWithHomeServer:@\"http://matrix.org\"];\n    [mxRestClient publicRooms:^(NSArray *rooms) {\n\n        // rooms is an array of MXPublicRoom objects containing information like room id\n        MXLogDebug(@\"The public rooms are: %@\", rooms);\n\n    } failure:^(MXError *error) {\n    }];\n\n**Swift**::\n\n    let homeServerUrl = URL(string: \"http://matrix.org\")!\n    let mxRestClient = MXRestClient(homeServer: homeServerUrl, unrecognizedCertificateHandler: nil)\n    mxRestClient.publicRooms { response in\n        switch response {\n        case .success(let rooms):\n\n            // rooms is an array of MXPublicRoom objects containing information like room id\n            print(\"The public rooms are: \\(rooms)\")\n\n        case .failure: break\n        }\n    }\n\n\nUse case #2: Get the rooms the user has interacted with\n-------------------------------------------------------\nHere the user needs to be authenticated. We will use\n[MXRestClient initWithCredentials].\nYou'll normally create and initialise these two objects once the user has\nlogged in, then keep them throughout the app's lifetime or until the user logs\nout:\n\n**Obj-C**::\n\n    MXCredentials *credentials = [[MXCredentials alloc] initWithHomeServer:@\"http://matrix.org\"\n                                                                    userId:@\"@your_user_id:matrix.org\"\n                                                               accessToken:@\"your_access_token\"];\n\n    // Create a matrix client\n    MXRestClient *mxRestClient = [[MXRestClient alloc] initWithCredentials:credentials];\n\n    // Create a matrix session\n    MXSession *mxSession = [[MXSession alloc] initWithMatrixRestClient:mxRestClient];\n\n    // Launch mxSession: it will first make an initial sync with the homeserver\n    // Then it will listen to new coming events and update its data\n    [mxSession start:^{\n\n        // mxSession is ready to be used\n        // Now we can get all rooms with:\n        mxSession.rooms;\n\n    } failure:^(NSError *error) {\n    }];\n\n**Swift**::\n\n    let credentials = MXCredentials(homeServer: \"http://matrix.org\",\n                                    userId: \"@your_user_id:matrix.org\",\n                                    accessToken: \"your_access_token\")\n\n    // Create a matrix client\n    let mxRestClient = MXRestClient(credentials: credentials, unrecognizedCertificateHandler: nil)\n\n    // Create a matrix session\n    let mxSession = MXSession(matrixRestClient: mxRestClient)\n\n    // Launch mxSession: it will first make an initial sync with the homeserver\n    mxSession.start { response in\n        guard response.isSuccess else { return }\n\n        // mxSession is ready to be used\n        // now wer can get all rooms with:\n        mxSession.rooms\n    }\n\n\nUse case #2 (bis): Get the rooms the user has interacted with (using a permanent MXStore)\n-----------------------------------------------------------------------------------------\nWe use the same code as above but we add a MXFileStore that will be in charge of\nstoring user's data on the file system. This will avoid to do a full sync with the\nhomeserver each time the app is resumed. The app will be able to resume quickly.\nPlus, it will be able to run in offline mode while syncing with the homeserver:\n\n**Obj-C**::\n\n    MXCredentials *credentials = [[MXCredentials alloc] initWithHomeServer:@\"http://matrix.org\"\n                                                                    userId:@\"@your_user_id:matrix.org\"\n                                                               accessToken:@\"your_access_token\"];\n\n    // Create a matrix client\n    MXRestClient *mxRestClient = [[MXRestClient alloc] initWithCredentials:credentials];\n\n    // Create a matrix session\n    MXSession *mxSession = [[MXSession alloc] initWithMatrixRestClient:mxRestClient];\n\n    // Make the matrix session open the file store\n    // This will preload user's messages and other data\n    MXFileStore *store = [[MXFileStore alloc] init];\n    [mxSession setStore:store success:^{\n\n        // Launch mxSession: it will sync with the homeserver from the last stored data\n        // Then it will listen to new coming events and update its data\n        [mxSession start:^{\n\n            // mxSession is ready to be used\n            // Now we can get all rooms with:\n            mxSession.rooms;\n\n        } failure:^(NSError *error) {\n        }];\n    } failure:^(NSError *error) {\n    }];\n\n**Swift**::\n\n    let credentials = MXCredentials(homeServer: \"http://matrix.org\",\n                                    userId: \"@your_user_id:matrix.org\",\n                                    accessToken: \"your_access_token\")\n\n    // Create a matrix client\n    let mxRestClient = MXRestClient(credentials: credentials, unrecognizedCertificateHandler: nil)\n\n    // Create a matrix session\n    let mxSession = MXSession(matrixRestClient: mxRestClient)\n\n    // Make the matrix session open the file store\n    // This will preload user's messages and other data\n    let store = MXFileStore()\n    mxSession.setStore(store) { response in\n        guard response.isSuccess else { return }\n\n        // Launch mxSession: it will sync with the homeserver from the last stored data\n        // Then it will listen to new coming events and update its data\n        mxSession.start { response in\n            guard response.isSuccess else { return }\n\n            // mxSession is ready to be used\n            // now we can get all rooms with:\n            mxSession.rooms()\n        }\n    }\n\n\n\n\nUse case #3: Get messages of a room\n-----------------------------------\nWe reuse the mxSession instance created before:\n\n**Obj-C**::\n\n    // Retrieve the room from its room id\n    MXRoom *room = [mxSession room:@\"!room_id:matrix.org\"];\n\n    // Add a listener on events related to this room\n    [room.liveTimeline listenToEvents:^(MXEvent *event, MXEventDirection direction, MXRoomState *roomState) {\n\n        if (direction == MXTimelineDirectionForwards) {\n            // Live/New events come here\n        }\n        else if (direction == MXTimelineDirectionBackwards) {\n            // Events that occurred in the past will come here when requesting pagination.\n            // roomState contains the state of the room just before this event occurred.\n        }\n    }];\n\n**Swift**::\n\n    // Retrieve the room from its room id\n    let room = mxSession.room(withRoomId: \"!room_id:matrix.org\")\n\n    // Add a listener on events related to this room\n    _ = room?.liveTimeline.listenToEvents { (event, direction, roomState) in\n        switch direction {\n        case .forwards:\n            // Live/New events come here\n            break\n\n        case .backwards:\n            // Events that occurred in the past will come here when requesting pagination.\n            // roomState contains the state of the room just before this event occurred.\n            break\n        }\n    }\n\n\nLet's load a bit of room history using paginateBackMessages:\n\n**Obj-C**::\n\n    // Reset the pagination start point to now\n    [room.liveTimeline resetPagination];\n\n    [room.liveTimeline paginate:10 direction:MXTimelineDirectionBackwards onlyFromStore:NO complete:^{\n\n        // At this point, the SDK has finished to enumerate the events to the attached listeners\n\n    } failure:^(NSError *error) {\n    }];\n\n**Swift**::\n\n    // Reset the pagination start point to now\n    room?.liveTimeline.resetPagination()\n\n    room?.liveTimeline.paginate(10, direction: .backwards, onlyFromStore: false) { _ in\n        // At this point, the SDK has finished to enumerate the events to the attached listeners\n    }\n\n\n\nUse case #4: Post a text message to a room\n------------------------------------------\nThis action does not require any business logic from MXSession: We can use\nMXRestClient directly:\n\n**Obj-C**::\n\n    [mxRestClient sendTextMessageToRoom:@\"the_room_id\" text:@\"Hello world!\" success:^(NSString *event_id) {\n\n        // event_id is for reference\n        // If you have registered events listener like in the previous use case, you will get\n        // a notification for this event coming down from the homeserver events stream and\n        // now handled by MXSession.\n\n    } failure:^(NSError *error) {\n    }];\n\n**Swift**::\n\n    client.sendTextMessage(toRoom: \"the_room_id\", text: \"Hello World!\") { (response) in\n        if case .success(let eventId) = response {\n            // eventId is for reference\n            // If you have registered events listener like in the previous use case, you will get\n            // a notification for this event coming down from the homeserver events stream and\n            // now handled by MXSession.\n        }\n    }\n\nPush Notifications\n==================\n\nIn Matrix, a homeserver can send notifications out to a user when events\narrive for them. However in APNS, only you, the app developer, can send APNS\nnotifications because doing so requires your APNS private key. Matrix\ntherefore requires a seperate server decoupled from the homeserver to send\nPush Notifications, as you cannot trust arbitrary homeservers with your\napplication's APNS private key. This is called the 'Push Gateway'. More about\nhow notifications work in Matrix can be found at\nhttps://matrix.org/docs/spec/push_gateway/latest.html\n\nIn simple terms, for your application to receive push notifications, you will\nneed to set up a push gateway. This is a publicly accessible server specific\nto your particular iOS app that receives HTTP POST requests from Matrix Home\nServers and sends APNS. Matrix provides a reference push gateway, 'sygnal',\nwhich can be found at https://github.com/matrix-org/sygnal along with\ninstructions on how to set it up.\n\nYou can also write your own Push Gateway. See\nhttps://matrix.org/docs/spec/push_gateway/latest.html\nfor the specification on the HTTP Push Notification protocol. Your push\ngateway can listen for notifications on any path (as long as your app knows\nthat path in order to inform the homeserver) but Matrix strongly recommends\nthat the path of this URL be\n'/_matrix/push/v1/notify'.\n\nIn your application, you will first register for APNS in the normal way\n(assuming iOS 8 or above)::\n\n    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIRemoteNotificationTypeBadge\n                                                                                         |UIRemoteNotificationTypeSound\n                                                                                         |UIRemoteNotificationTypeAlert)\n                                                                                         categories:nil];\n    [...]\n\n    - (void)application:(UIApplication *)application\n            didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings\n    {\n        [application registerForRemoteNotifications];\n    }\n\nWhen you receive the APNS token for this particular application instance, you\nthen encode this into text and use it as the 'pushkey' to call\nsetPusherWithPushkey in order to tell the homeserver to send pushes to this\ndevice via your push gateway's URL. Matrix recommends base 64\nencoding for APNS tokens (as this is what sygnal uses)::\n\n    - (void)application:(UIApplication*)app\n      didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken {\n        NSString *b64Token = [self.deviceToken base64EncodedStringWithOptions:0];\n        NSDictionary *pushData = @{\n            @\"url\": @\"https://example.com/_matrix/push/v1/notify\" // your push gateway URL\n        };\n        NSString *deviceLang = [NSLocale preferredLanguages][0];\n        NSString *profileTag = makeProfileTag(); // more about this later\n        MXRestClient *restCli = [MatrixSDKHandler sharedHandler].mxRestClient;\n        [restCli\n            setPusherWithPushkey:b64Token\n            kind:@\"http\"\n            appId:@\"com.example.supercoolmatrixapp.prod\"\n            appDisplayName:@\"My Super Cool Matrix iOS App\"\n            deviceDisplayName:[[UIDevice currentDevice] name]\n            profileTag:profileTag\n            lang:deviceLang\n            data:pushData\n            success:^{\n                // Hooray!\n            } failure:^(NSError *error) {\n                // Some super awesome error handling goes here\n            }\n        ];\n    }\n\nWhen you call setPusherWithPushkey, this creates a pusher on the homeserver\nthat your session is logged in to. This will send HTTP notifications to a URL\nyou supply as the 'url' key in the 'data' argument to setPusherWithPushkey.\n\nYou can read more about these parameters in the Client / Server specification\n(http://matrix.org/docs/api/client-server/#!/Push32notifications/post_matrix_client_r0_pushers_set). A\nlittle more information about some of these parameters is included below:\n\nappId\n  This has two purposes: firstly to form the namespace in which your pushkeys\n  exist on a homeserver, which means you should use something unique to your\n  application: a reverse-DNS style identifier is strongly recommended. Its\n  second purpose is to identify your application to your Push Gateway, such that\n  your Push Gateway knows which private key and certificate to use when talking\n  to the APNS gateway. You should therefore use different app IDs depending on\n  whether your application is in production or sandbox push mode so that your\n  Push Gateway can send the APNS accordingly. Matrix recommends suffixing your\n  appId with '.dev' or '.prod' accordingly.\n\nprofileTag\n  This identifies which set of push rules this device should obey. For more\n  information about push rules, see the Client / Server push specification:\n  http://matrix.org/docs/api/client-server/#!/Push32notifications/post_matrix_client_r0_pushers_set\n  This is an identifier for the set of device-specific push rules that this\n  device will obey. The recommendation is to auto-generate a 16 character\n  alphanumeric string and use this string for the lifetime of the application\n  data. More advanced usage of this will allow for several devices sharing a set\n  of push rules.\n\nDevelopment\n===========\n\nThe repository contains a Xcode project in order to develop. This project does\nnot build an app but a test suite. See the next section to set the test\nenvironment.\n\nBefore opening the Matrix SDK Xcode workspace, you need to build it.\n\nThe project has some third party library dependencies declared in a pod file.\nYou need to run the CocoaPods command to download them and to set up the Matrix\nSDK workspace::\n\n        $ pod install\n\nThen, open ``MatrixSDK.xcworkspace``.\n\nTests\n=====\nThe tests in the SDK Xcode project are both unit and integration tests.\n\nUnit tests classes use the suffix \"UnitTests\" to differentiate them. A unit test is a test that does not make any HTTP requests or uses mocked HTTP requests.\n\nOut of the box, the tests use one of the homeservers (located at\nhttp://localhost:8080) of the \"Demo Federation of Homeservers\"\n(https://matrix-org.github.io/synapse/develop/development/demo.html?highlight=demo#synapse-demo-setup).\n\nBefore you install synapse you may need few dependencies to be installed on Mac OS:\n\n- **Homebrew**: run ``/bin/bash -c \"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)”``. More information can be found here https://brew.sh\n- **python 3**: downloading the latest stable version should be fine. Download the ``.pkg`` and install it from here https://www.python.org/downloads/\n- **pipx**: with python installed run ``pip3 install --user pipx``\n- **Rust**: run ``curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh``. more information can be found here https://www.rust-lang.org/tools/install\n- **icu4c**: Run ``brew install icu4c``\n- **Update env variables for icu4c**: if you use zsh run ``echo 'export PATH=\"/opt/homebrew/opt/icu4c/bin:$PATH\"' \u003e\u003e ~/.zshrc``. Otherwise try to update ``.bash_profile`` in the same way. You may have configured another folder for brew binaries. In that case try to run ``brew info icu4c`` to spot the correct path.\n- **pg_config**: you can get it by running ``brew install postgresql``\n\nYou first need to follow instructions to set up Synapse in development mode at https://github.com/matrix-org/synapse#synapse-development.\nThe cookbook is::\n\n      $ pip install --user pipx\n      $ python3 -m pipx ensurepath   # To run if `pipx install poetry` complained about PATH not being correctly set\n      $ pipx install poetry\n      $ git clone https://github.com/matrix-org/synapse.git\n      $ cd synapse\n      $ poetry install --extras all\n\nTo launch these test homeservers, type from the synapse root folder::\n\n      $ poetry run ./demo/start.sh --no-rate-limit\n\nTo verify that the synapse instance is actually running correctly, open a web browser and go to `http://127.0.0.1:8080`. A web page should confirm it.\n\nTo stop and reset the servers::\n\n      $ poetry run ./demo/stop.sh\n      $ poetry run ./demo/clean.sh\n\nYou can now run tests from the Xcode Test navigator tab or select the\nMatrixSDKTests scheme and click on the \"Test\" action.\n\nTest Plans\n----------\nWe have test plans for the macOS target to run tests separately or with different configurations.\n\nAllTests\n  Default test plan to run all tests.\n\nAllTestsWithSanitizers\n  Run all tests with 2 configurations: \"ASan + UBSan\" and \"TSan + UBSan\". \"UBSan\" for Unexpected Behavior Sanitizer. \"ASan\" for Address Sanitizier. \"Tsan\" for Thread Sanitizer. This setup was advised at WWDC2019 (https://developer.apple.com/videos/play/wwdc2019/413?time=2270). This test plan requires 2 builds and 2 test runs.\n\nUnitTests\n  Test plan for all unit tests.\n\nUnitTestsWithSanitizers\n  All unit tests with the 2 configurations described above: \"ASan + UBSan\" and \"TSan + UBSan\".\n\nKnown issues\n============\n\nCocoaPods may fail to install on OSX 10.8.x with \"i18n requires Ruby version\n\u003e= 1.9.3.\".  This is a known problem similar to\nhttps://github.com/CocoaPods/CocoaPods/issues/2458 that needs to be raised with\nthe CocoaPods team.\n\nRegistration\n------------\nThe SDK currently manages only login-password type registration.\nThis type of registration is not accepted by the homeserver hosted at\nmatrix.org. It has been disabled for security and spamming reasons.\nSo, for now, you will be not be able to register a new account with the SDK on\nsuch homeserver. But you can login an existing user.\n\nIf you run your own homeserver, the default launch parameters enables the\nlogin-password type registration and you will be able to register a new user to it.\n\nCopyright \u0026 License\n==================\n\nCopyright (c) 2014-2017 OpenMarket Ltd\nCopyright (c) 2017 Vector Creations Ltd\nCopyright (c) 2017-2018 New Vector Ltd\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use this work except in compliance with the License. You may obtain a copy of the License in the LICENSE file, or at:\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmatrix-org%2Fmatrix-ios-sdk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmatrix-org%2Fmatrix-ios-sdk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmatrix-org%2Fmatrix-ios-sdk/lists"}