The Matrix SDK for iOS

Overview

Matrix iOS SDK

This open-source library allows you to build iOS apps compatible with Matrix (http://www.matrix.org), an open standard for interoperable Instant Messaging and VoIP.

This SDK implements an interface to communicate with the Matrix Client/Server API which is defined at http://matrix.org/docs/api/client-server/.

Use the SDK in your app

The SDK uses CocoaPods (http://cocoapods.org/) as library dependency manager. In order to set this up:

sudo gem install cocoapods
pod setup

The best way to add the last release of the Matrix SDK to your application project is to add the MatrixSDK dependency to your Podfile:

# Obj-C
pod 'MatrixSDK'

If you want to use the develop version of the SDK, use instead:

# Obj-C pod 'MatrixSDK', :git => 'https://github.com/matrix-org/matrix-ios-sdk.git', :branch => 'develop'

Options

If you want also Swift support, add the following pod to your app Podfile:

pod 'MatrixSDK/SwiftSupport'

If you want to enable VoIP using the http://webrtc.org VoIP stack, add the following pod to your app Podfile:

pod 'MatrixSDK/JingleCallStack'

Overview

As a quick overview, there are the classes to know to use the SDK.

Matrix API level

MXRestClient: Exposes the Matrix Client-Server API as specified by the Matrix standard to make requests to a homeserver.

Business logic and data model

These classes are higher level tools to handle responses from a homeserver. They contain logic to maintain consistent chat room data.

MXSession: This class handles all data arriving from the homeserver. It uses a MXRestClient instance to fetch data from the homeserver, forwarding it to MXRoom, MXRoomState, MXRoomMember and MXUser objects.
MXRoom: This class provides methods to get room data and to interact with the room (join, leave...).
MXRoomState: This is the state of room at a certain point in time: its name, topic, visibility (public/private), members, etc.
MXRoomMember: Represents a member of a room.
MXUser: This is a user known by the current user, outside of the context of a room. MXSession exposes and maintains the list of MXUsers. It provides the user id, displayname and the current presence state.

Usage

The sample app (https://github.com/matrix-org/matrix-ios-console) demonstrates how to build a chat app on top of Matrix. You can refer to it, play with it, hack it to understand the full integration of the Matrix SDK. This section comes back to the basics with sample codes for basic use cases.

One file to import:

Obj-C:

#import <MatrixSDK/MatrixSDK.h>

Swift:

import MatrixSDK

Use case #1: Get public rooms of an homeserver

This API does not require the user to be authenticated. So, MXRestClient instantiated with initWithHomeServer does the job:

Obj-C:

MXRestClient *mxRestClient = [[MXRestClient alloc] initWithHomeServer:@"http://matrix.org"];
[mxRestClient publicRooms:^(NSArray *rooms) {

    // rooms is an array of MXPublicRoom objects containing information like room id
    MXLogDebug(@"The public rooms are: %@", rooms);

} failure:^(MXError *error) {
}];

Swift:

let homeServerUrl = URL(string: "http://matrix.org")!
let mxRestClient = MXRestClient(homeServer: homeServerUrl, unrecognizedCertificateHandler: nil)
mxRestClient.publicRooms { response in
    switch response {
    case .success(let rooms):

        // rooms is an array of MXPublicRoom objects containing information like room id
        print("The public rooms are: \(rooms)")

    case .failure: break
    }
}

Use case #2: Get the rooms the user has interacted with

Here the user needs to be authenticated. We will use [MXRestClient initWithCredentials]. You'll normally create and initialise these two objects once the user has logged in, then keep them throughout the app's lifetime or until the user logs out:

Obj-C:

MXCredentials *credentials = [[MXCredentials alloc] initWithHomeServer:@"http://matrix.org"
                                                                userId:@"@your_user_id:matrix.org"
                                                           accessToken:@"your_access_token"];

// Create a matrix client
MXRestClient *mxRestClient = [[MXRestClient alloc] initWithCredentials:credentials];

// Create a matrix session
MXSession *mxSession = [[MXSession alloc] initWithMatrixRestClient:mxRestClient];

// Launch mxSession: it will first make an initial sync with the homeserver
// Then it will listen to new coming events and update its data
[mxSession start:^{

    // mxSession is ready to be used
    // Now we can get all rooms with:
    mxSession.rooms;

} failure:^(NSError *error) {
}];

Swift:

let credentials = MXCredentials(homeServer: "http://matrix.org",
                                userId: "@your_user_id:matrix.org",
                                accessToken: "your_access_token")

// Create a matrix client
let mxRestClient = MXRestClient(credentials: credentials, unrecognizedCertificateHandler: nil)

// Create a matrix session
let mxSession = MXSession(matrixRestClient: mxRestClient)

// Launch mxSession: it will first make an initial sync with the homeserver
mxSession.start { response in
    guard response.isSuccess else { return }

    // mxSession is ready to be used
    // now wer can get all rooms with:
    mxSession.rooms
}

Use case #2 (bis): Get the rooms the user has interacted with (using a permanent MXStore)

We use the same code as above but we add a MXFileStore that will be in charge of storing user's data on the file system. This will avoid to do a full sync with the homeserver each time the app is resumed. The app will be able to resume quickly. Plus, it will be able to run in offline mode while syncing with the homeserver:

Obj-C:

MXCredentials *credentials = [[MXCredentials alloc] initWithHomeServer:@"http://matrix.org"
                                                                userId:@"@your_user_id:matrix.org"
                                                           accessToken:@"your_access_token"];

// Create a matrix client
MXRestClient *mxRestClient = [[MXRestClient alloc] initWithCredentials:credentials];

// Create a matrix session
MXSession *mxSession = [[MXSession alloc] initWithMatrixRestClient:mxRestClient];

// Make the matrix session open the file store
// This will preload user's messages and other data
MXFileStore *store = [[MXFileStore alloc] init];
[mxSession setStore:store success:^{

    // Launch mxSession: it will sync with the homeserver from the last stored data
    // Then it will listen to new coming events and update its data
    [mxSession start:^{

        // mxSession is ready to be used
        // Now we can get all rooms with:
        mxSession.rooms;

    } failure:^(NSError *error) {
    }];
} failure:^(NSError *error) {
}];

Swift:

let credentials = MXCredentials(homeServer: "http://matrix.org",
                                userId: "@your_user_id:matrix.org",
                                accessToken: "your_access_token")

// Create a matrix client
let mxRestClient = MXRestClient(credentials: credentials, unrecognizedCertificateHandler: nil)

// Create a matrix session
let mxSession = MXSession(matrixRestClient: mxRestClient)

// Make the matrix session open the file store
// This will preload user's messages and other data
let store = MXFileStore()
mxSession.setStore(store) { response in
    guard response.isSuccess else { return }

    // Launch mxSession: it will sync with the homeserver from the last stored data
    // Then it will listen to new coming events and update its data
    mxSession.start { response in
        guard response.isSuccess else { return }

        // mxSession is ready to be used
        // now we can get all rooms with:
        mxSession.rooms()
    }
}

Use case #3: Get messages of a room

We reuse the mxSession instance created before:

Obj-C:

// Retrieve the room from its room id
MXRoom *room = [mxSession room:@"!room_id:matrix.org"];

// Add a listener on events related to this room
[room.liveTimeline listenToEvents:^(MXEvent *event, MXEventDirection direction, MXRoomState *roomState) {

    if (direction == MXTimelineDirectionForwards) {
        // Live/New events come here
    }
    else if (direction == MXTimelineDirectionBackwards) {
        // Events that occurred in the past will come here when requesting pagination.
        // roomState contains the state of the room just before this event occurred.
    }
}];

Swift:

// Retrieve the room from its room id
let room = mxSession.room(withRoomId: "!room_id:matrix.org")

// Add a listener on events related to this room
_ = room?.liveTimeline.listenToEvents { (event, direction, roomState) in
    switch direction {
    case .forwards:
        // Live/New events come here
        break

    case .backwards:
        // Events that occurred in the past will come here when requesting pagination.
        // roomState contains the state of the room just before this event occurred.
        break
    }
}

Let's load a bit of room history using paginateBackMessages:

Obj-C:

// Reset the pagination start point to now
[room.liveTimeline resetPagination];

[room.liveTimeline paginate:10 direction:MXTimelineDirectionBackwards onlyFromStore:NO complete:^{

    // At this point, the SDK has finished to enumerate the events to the attached listeners

} failure:^(NSError *error) {
}];

Swift:

// Reset the pagination start point to now
room?.liveTimeline.resetPagination()

room?.liveTimeline.paginate(10, direction: .backwards, onlyFromStore: false) { _ in
    // At this point, the SDK has finished to enumerate the events to the attached listeners
}

Use case #4: Post a text message to a room

This action does not require any business logic from MXSession: We can use MXRestClient directly:

Obj-C:

[mxRestClient sendTextMessageToRoom:@"the_room_id" text:@"Hello world!" success:^(NSString *event_id) {

    // event_id is for reference
    // If you have registered events listener like in the previous use case, you will get
    // a notification for this event coming down from the homeserver events stream and
    // now handled by MXSession.

} failure:^(NSError *error) {
}];

Swift:

client.sendTextMessage(toRoom: "the_room_id", text: "Hello World!") { (response) in
    if case .success(let eventId) = response {
        // eventId is for reference
        // If you have registered events listener like in the previous use case, you will get
        // a notification for this event coming down from the homeserver events stream and
        // now handled by MXSession.
    }
}

Push Notifications

In Matrix, a homeserver can send notifications out to a user when events arrive for them. However in APNS, only you, the app developer, can send APNS notifications because doing so requires your APNS private key. Matrix therefore requires a seperate server decoupled from the homeserver to send Push Notifications, as you cannot trust arbitrary homeservers with your application's APNS private key. This is called the 'Push Gateway'. More about how notifications work in Matrix can be found at https://matrix.org/docs/spec/push_gateway/latest.html

In simple terms, for your application to receive push notifications, you will need to set up a push gateway. This is a publicly accessible server specific to your particular iOS app that receives HTTP POST requests from Matrix Home Servers and sends APNS. Matrix provides a reference push gateway, 'sygnal', which can be found at https://github.com/matrix-org/sygnal along with instructions on how to set it up.

You can also write your own Push Gateway. See https://matrix.org/docs/spec/push_gateway/latest.html for the specification on the HTTP Push Notification protocol. Your push gateway can listen for notifications on any path (as long as your app knows that path in order to inform the homeserver) but Matrix strongly recommends that the path of this URL be '/_matrix/push/v1/notify'.

In your application, you will first register for APNS in the normal way (assuming iOS 8 or above):

UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIRemoteNotificationTypeBadge
                                                                                     |UIRemoteNotificationTypeSound
                                                                                     |UIRemoteNotificationTypeAlert)
                                                                                     categories:nil];
[...]

- (void)application:(UIApplication *)application
        didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
{
    [application registerForRemoteNotifications];
}

When you receive the APNS token for this particular application instance, you then encode this into text and use it as the 'pushkey' to call setPusherWithPushkey in order to tell the homeserver to send pushes to this device via your push gateway's URL. Matrix recommends base 64 encoding for APNS tokens (as this is what sygnal uses):

- (void)application:(UIApplication*)app
  didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken {
    NSString *b64Token = [self.deviceToken base64EncodedStringWithOptions:0];
    NSDictionary *pushData = @{
        @"url": @"https://example.com/_matrix/push/v1/notify" // your push gateway URL
    };
    NSString *deviceLang = [NSLocale preferredLanguages][0];
    NSString *profileTag = makeProfileTag(); // more about this later
    MXRestClient *restCli = [MatrixSDKHandler sharedHandler].mxRestClient;
    [restCli
        setPusherWithPushkey:b64Token
        kind:@"http"
        appId:@"com.example.supercoolmatrixapp.prod"
        appDisplayName:@"My Super Cool Matrix iOS App"
        deviceDisplayName:[[UIDevice currentDevice] name]
        profileTag:profileTag
        lang:deviceLang
        data:pushData
        success:^{
            // Hooray!
        } failure:^(NSError *error) {
            // Some super awesome error handling goes here
        }
    ];
}

When you call setPusherWithPushkey, this creates a pusher on the homeserver that your session is logged in to. This will send HTTP notifications to a URL you supply as the 'url' key in the 'data' argument to setPusherWithPushkey.

You can read more about these parameters in the Client / Server specification (http://matrix.org/docs/api/client-server/#!/Push32notifications/post_matrix_client_r0_pushers_set). A little more information about some of these parameters is included below:

appId
This has two purposes: firstly to form the namespace in which your pushkeys exist on a homeserver, which means you should use something unique to your application: a reverse-DNS style identifier is strongly recommended. Its second purpose is to identify your application to your Push Gateway, such that your Push Gateway knows which private key and certificate to use when talking to the APNS gateway. You should therefore use different app IDs depending on whether your application is in production or sandbox push mode so that your Push Gateway can send the APNS accordingly. Matrix recommends suffixing your appId with '.dev' or '.prod' accordingly.
profileTag
This identifies which set of push rules this device should obey. For more information about push rules, see the Client / Server push specification: http://matrix.org/docs/api/client-server/#!/Push32notifications/post_matrix_client_r0_pushers_set This is an identifier for the set of device-specific push rules that this device will obey. The recommendation is to auto-generate a 16 character alphanumeric string and use this string for the lifetime of the application data. More advanced usage of this will allow for several devices sharing a set of push rules.

Development

The repository contains a Xcode project in order to develop. This project does not build an app but a test suite. See the next section to set the test environment.

Before opening the Matrix SDK Xcode workspace, you need to build it.

The project has some third party library dependencies declared in a pod file. You need to run the CocoaPods command to download them and to set up the Matrix SDK workspace:

$ pod install

Then, open MatrixSDK.xcworkspace.

Tests

The tests in the SDK Xcode project are both unit and integration tests.

Unit 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.

Out of the box, the tests use one of the homeservers (located at http://localhost:8080) of the "Demo Federation of Homeservers" (https://github.com/matrix-org/synapse#running-a-demo-federation-of-synapses).

You first need to follow instructions to set up Synapse in development mode at https://github.com/matrix-org/synapse#synapse-development. If you have already installed all dependencies, the steps are:

$ git clone https://github.com/matrix-org/synapse.git
$ cd synapse
$ virtualenv -p python3 env
$ source env/bin/activate
(env) $ python -m pip install --no-use-pep517 -e .

Every time you want to launch these test homeservers, type:

$ virtualenv -p python3 env
$ source env/bin/activate
(env) $ demo/start.sh --no-rate-limit

You can now run tests from the Xcode Test navigator tab or select the MatrixSDKTests scheme and click on the "Test" action.

Test Plans

We have test plans for the macOS target to run tests separately or with different configurations.

AllTests
Default test plan to run all tests.
AllTestsWithSanitizers
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.
UnitTests
Test plan for all unit tests.
UnitTestsWithSanitizers
All unit tests with the 2 configurations described above: "ASan + UBSan" and "TSan + UBSan".

Known issues

CocoaPods may fail to install on OSX 10.8.x with "i18n requires Ruby version >= 1.9.3.". This is a known problem similar to https://github.com/CocoaPods/CocoaPods/issues/2458 that needs to be raised with the CocoaPods team.

Registration

The SDK currently manages only login-password type registration. This type of registration is not accepted by the homeserver hosted at matrix.org. It has been disabled for security and spamming reasons. So, for now, you will be not be able to register a new account with the SDK on such homeserver. But you can login an existing user.

If you run your own homeserver, the default launch parameters enables the login-password type registration and you will be able to register a new user to it.

Copyright & License

Copyright (c) 2014-2017 OpenMarket Ltd Copyright (c) 2017 Vector Creations Ltd Copyright (c) 2017-2018 New Vector Ltd

Licensed 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:

http://www.apache.org/licenses/LICENSE-2.0

Unless 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.

Comments
  • Add Swift refinements to several classes

    Add Swift refinements to several classes

    This pull request adds Swift language refinements to the APIs in MXRestClient and MXSession.

    NOTE: Swift requires iOS 8.0 or above. Therefore this PR breaks compatibility with iOS 7.0.

    Summary:

    • APIs with success+failure callbacks are simplified into a single callback that handles both cases (more on this technique below)
    • URLs are typed as URL instead of String, where possible.
    • "Stringly-typed" enums (i.e. parameters that expect one of several string constants, like kMXLoginFlowTypePassword) are now available as Swift enums. Situations where a custom constant may be provided are handled with a .custom(String) case (or similar).
    • This PR should have no impact on the Obj-C API

    before

    let addressUrlString = "http://127.0.0.1:8008"
    let client = MXRestClient(homeServer: addressUrlString, andOnUnrecognizedCertificateBlock: nil)
    _ = client?.login(withLoginType: kMXLoginFlowTypePassword, username: "alice", password: "securePassword", success: { (credentials) in
    
        // Stop the loading animation
        self.progressIndicator.stopAnimation(nil)
        let credentials = credentials!
    
        // Cache the credentials for later, and complete the setup process...
    
    }, failure: { (error) in
    
        // Stop the loading animation
        self.progressIndicator.stopAnimation(nil)
        let error = error!
    
        // An error has occurred...
        print("An error has occurred:", error)
    })
    

    Issues

    1. The MXRestClient initializer returns an optional.
    2. Swift expects the programmer to handle the MXHTTPOperation returned from login(). If the return value is unused, the compiler will throw a warning unless the programmer explicitly ignores it using the _ = syntax.
    3. Multiple callbacks in a single method is not very Swifty.
    4. Swift interprets the values passed into the callbacks as optionals (even though the SDK should never return nil)
    5. Cleanup code (eg. stop a loading spinner) must be written twice โ€“ not very DRY.

    after

    let addressUrl = URL(string: "http://127.0.0.1:8008")!
    let client = MXRestClient(homeServer: addressUrl, unrecognizedCertificateHandler: nil)
    client.login(type: .password, username: "alice", password: "securePassword") { response in
    
        // Stop the animation
        self.progressIndicator.stopAnimation(nil)
    
        switch response {
        case .success(let credentials):
            // Cache the credentials for later, and complete the setup process...
            break
    
        case .failure(let error):
            // An error has occurred...
            print("An error has occurred:", error)
            break
        }
    }
    

    Improvements

    1. MXRestClient initializer no longer returns an optional
    2. The API uses the @discardableresult attribute, which permits the programmer to ignore the return value by default (the API still returns a HTTPOperation, if it's desired)
    3. type: is now an enum, enabling more concise usage. (In fact, .password is the default value, so that parameter could be omitted altogether)
    4. A single callback handles both success and failure cases in a type-safe yet flexible way (see below). Swift's trailing closure syntax makes more sense in this case.
    5. Cleanup code is only written once.

    Handling Callbacks in Swift: MXResponse<T>

    public enum MXResponse<T> {
        case success(T)
        case failure(Error)
    
        /* ... */
    }
    

    This enum enables Swift to return a single value that encapsulates both success and error conditions. The associated type for each case (either T or Error) is guaranteed to be non-nil.

    Usage:

    Use a switch statement to handle both a success and an error:

    mxRestClient.publicRooms { response in
        switch response {
        case .success(let rooms):
            // Do something useful with these rooms
            break
    
        case .failure(let error):
            // Handle the error in some way
            break
        }
    }
    

    Silently ignore the failure case:

    mxRestClient.publicRooms { response in
        guard let rooms = response.value else { return }
        // Do something useful with these rooms
    }
    

    Signed-off-by: Avery Pierce [email protected]

    opened by avery-pierce 21
  • [e2e issue] client badly considers someone is not a room member

    [e2e issue] client badly considers someone is not a room member

    I have found an interesting and systematic issue related to e2e encryption on iOS and synapse. A creates an e2e room with B They send messages -> OK. A invites C C send a message: A can decrypt this message but not B. After some investigation. I found the reason. C considers B is not a room member so it does not send him the needed megolm keys. Problem is linked to MxRoomState -> handleStateEvent. He considers the user is no more part of the room and remove him. If I have a look on the /sync response received by C just after he has joined the room:

    B is in room->joins->state->events with state{ membership = join;type = "m.room.member";} => correct But in timeline events , the last events we receive related to B is "B has been invited" But the events related to "B has joined room" is missing even if more recent than event "B has been invited" Last event in this timeline events is "C has joined room" I can provide you in isntrumented log if you want. So For me, there is an issue on Synapse which does not send correct event to C. But client should be robust to this use case.

    To conclude, I will try to implement following work around on client: if a m.room.member event in the timeline event is older than m.room.member state event associated to same member, its should be ignored. But perhaps this issue concerns all state events.

    I have added this check in MxRoomState -> handleStateEvent for RoomMember only. It seems to fix the issue. Manu, do you think it is an acceptable work around? Or can we fix it in a better way?

    opened by Jean-PhilippeR 12
  • Remove depency to WebRTC and add parameter to use GA

    Remove depency to WebRTC and add parameter to use GA

    I'm ready to discuss about this fix.

    The problem is the use of "use_frameworks!" parameter in the Podfile includ in swift project.

    Indeed, with cocoa pods 1.x and the use_frameworks parameters, pod are built atomically and cannot refer to library that are not directly linked to the pod.

    So you can have build issue like:

    Undefined symbols '_GAI' not found in MXFileStore.o

    opened by samuel-gallet 11
  • App crash at launch when setting matrix session to _MyUser object

    App crash at launch when setting matrix session to _MyUser object

    Describe the bug The app keeps crashing after launch, the crash points to self->_myUser.mxSession = self; inside setStore method in MXSession.m file.

    SDK Version: 0.22.5

    To Reproduce I don't know how it happened in our production app, But you can reproduce it by setting a breakpoint on mxSession.setStore() method, Then the app will keep crashing. Expected behavior The app shouldn't crash.

    Smartphone (please complete the following information):

    • Device: iPhone X
    • OS: iPhone OS 15.3.1 (19D52)

    Additional context

    Exception Type: EXC_CRASH (SIGABRT) Exception Codes: 0x0000000000000000, 0x0000000000000000 Exception Note: EXC_CORPSE_NOTIFY Triggered by Thread: 0

    Last Exception Backtrace: 0 CoreFoundation 0x182aa6d3c __exceptionPreprocess + 216 (NSException.m:200) 1 libobjc.A.dylib 0x199e206a8 objc_exception_throw + 56 (objc-exception.mm:565) 2 CoreFoundation 0x182b76768 -[NSObject(NSObject) doesNotRecognizeSelector:] + 140 (NSObject.m:147) 3 CoreFoundation 0x182a40f6c forwarding + 1440 (NSForwarding.m:3577) 4 CoreFoundation 0x182a401dc _CF_forwarding_prep_0 + 92 5 MatrixSDK 0x10577495c 0x10558c000 + 2001244 6 libdispatch.dylib 0x1827721a4 _dispatch_call_block_and_release + 24 (init.c:1517) 7 libdispatch.dylib 0x1827731a8 _dispatch_client_callout + 16 (object.m:560) 8 libdispatch.dylib 0x1827544b8 _dispatch_main_queue_callback_4CF$VARIANT$armv81 + 908 (inline_internal.h:2601) 9 CoreFoundation 0x182a62888 CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE + 12 (CFRunLoop.c:1795) 10 CoreFoundation 0x182a20188 __CFRunLoopRun + 2528 (CFRunLoop.c:3144) 11 CoreFoundation 0x182a32e1c CFRunLoopRunSpecific + 572 (CFRunLoop.c:3268) 12 GraphicsServices 0x1a2de59a0 GSEventRunModal + 160 (GSEvent.c:2200) 13 UIKitCore 0x185266b90 -[UIApplication _run] + 1080 (UIApplication.m:3493) 14 UIKitCore 0x184ffc16c UIApplicationMain + 332 (UIApplication.m:5047) 15 Ibraq 0x10245af8c 0x102264000 + 2060172 16 dyld 0x103a98250 start + 444 (dyldMain.cpp:879)

    Thread 0 name: Thread 0 Crashed: 0 libsystem_kernel.dylib 0x00000001bcb5a9e8 __pthread_kill + 8 1 libsystem_pthread.dylib 0x00000001dd063824 pthread_kill + 208 (pthread.c:1668) 2 libsystem_c.dylib 0x000000018cfa7448 raise + 28 (raise.c:30) 3 FirebaseCrashlytics 0x0000000103db8b14 FIRCLSSignalEnumerateHandledSignals + 16 (FIRCLSSignal.c:55) 4 FirebaseCrashlytics 0x0000000103db8b14 FIRCLSSignalSafeInstallPreexistingHandlers + 228 (FIRCLSSignal.c:186) 5 FirebaseCrashlytics 0x0000000103db88d8 FIRCLSSignalHandler + 560 (FIRCLSSignal.c:325) 6 libsystem_platform.dylib 0x00000001dd048d48 _sigtramp + 52 (sigtramp.c:116) 7 libsystem_pthread.dylib 0x00000001dd063824 pthread_kill + 208 (pthread.c:1668) 8 libsystem_c.dylib 0x000000018cfa70b4 abort + 120 (abort.c:118) 9 libc++abi.dylib 0x0000000199f15e1c abort_message + 128 (abort_message.cpp:78) 10 libc++abi.dylib 0x0000000199f07bec demangling_terminate_handler() + 296 (cxa_default_handlers.cpp:71) 11 libobjc.A.dylib 0x0000000199e26018 _objc_terminate() + 124 (objc-exception.mm:701) 12 Bugsnag 0x0000000103bb22a4 CPPExceptionTerminate() + 492 (BSG_KSCrashSentry_CPPException.mm:192) 13 FirebaseCrashlytics 0x0000000103da3f18 FIRCLSTerminateHandler() + 340 (FIRCLSException.mm:335) 14 libc++abi.dylib 0x0000000199f152cc std::__terminate(void (*)()) + 16 (cxa_handlers.cpp:59) 15 libc++abi.dylib 0x0000000199f15274 std::terminate() + 60 (cxa_handlers.cpp:88) 16 libdispatch.dylib 0x00000001827731bc _dispatch_client_callout + 36 (object.m:563) 17 libdispatch.dylib 0x00000001827544b8 _dispatch_main_queue_callback_4CF$VARIANT$armv81 + 908 (inline_internal.h:2601) 18 CoreFoundation 0x0000000182a62888 CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE + 12 (CFRunLoop.c:1795) 19 CoreFoundation 0x0000000182a20188 __CFRunLoopRun + 2528 (CFRunLoop.c:3144) 20 CoreFoundation 0x0000000182a32e1c CFRunLoopRunSpecific + 572 (CFRunLoop.c:3268) 21 GraphicsServices 0x00000001a2de59a0 GSEventRunModal + 160 (GSEvent.c:2200) 22 UIKitCore 0x0000000185266b90 -[UIApplication _run] + 1080 (UIApplication.m:3493) 23 UIKitCore 0x0000000184ffc16c UIApplicationMain + 332 (UIApplication.m:5047) 24 Ibraq 0x000000010245af8c 0x102264000 + 2060172 25 dyld 0x0000000103a98250 start + 444 (dyldMain.cpp:879)

    opened by RamadanAlharahsheh 10
  • Pod file problem in sample

    Pod file problem in sample

    Getting the following error when trying to run the sample app:

    diff: /../Podfile.lock: No such file or directory
    diff: /Manifest.lock: No such file or directory
    error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.
    

    I'm new to CocoaPods so hopefully this is a simple things.

    Thanks

    opened by stefanalund 8
  • Allow custom HTTP headers on registration and login

    Allow custom HTTP headers on registration and login

    Is your feature request related to a problem? Please describe.

    We currently run federated servers for a very vulnerable audience.

    We want to be a good citizen in the fediverse, so we want to stop spammers from using our systems.

    The currently available solutions have the following problems for us:

    1. We don't want to sell our audience to Google via Recaptcha.
    2. They're not English speakers, might not even understand latin scripture, therefore will have problems filling that captcha anyway.
    3. We don't want to make them give us any identifying things like phone numbers or mail addresses to keep them safe.

    Describe the solution you'd like

    In order to sort out spam bots on our servers, we like our client apps to send an API key on registration via HTTP headers.

    We're not interested in supporting other clients than our own, but we want to stay federated.

    I'll send a PR with the code changes we need to make this happen.

    Describe alternatives you've considered

    We'd really hate to maintain patches on our own.

    Other workarounds would need to make use of reflection (aka Objective-C-KVO) and a bunch of code duplication.

    Another idea would be to add proprietary steps to the registration process. However, it seems, as pluggable, as the API design looks, Synapse isn't actually that pluggable in that regard.

    Considering the imminent threat with spam bots, HTTP headers seem like a way quicker and more viable solution.

    opened by tladesignz 7
  • Freeze MXResponse enum

    Freeze MXResponse enum

    When using niochat/MatrixSDK (or MatrixSDK.xcframework) any switch against MXResponse produces a warning that unknown cases are unhandled.

    Hoping this change is welcome as I can't foresee any other cases that could be added to MXResponse?

    Please let me know if there's any changes you would like.

    Signed-off-by: Doug Earnshaw [email protected]

    Pull Request Checklist

    • [x] Pull request is based on the develop branch
    • [x] Pull request updates CHANGES.rst
    • [x] Pull request includes a sign off
    opened by pixlwave 6
  • The first synchronization is very slow. Is there any optimization strategy?

    The first synchronization is very slow. Is there any optimization strategy?

    I have an account, there are more than 1000 rooms, written after re-installation, initialization synchronization, to perform more than 10 minutes, how to optimize this problem?

    I did a test. When there are 100 rooms, the initialization synchronization is about 5 seconds. When there are 600 rooms, the initialization synchronization is about 30 seconds. When there are 1100 rooms, the initialization synchronization is about 10 minutes. . When the number of rooms increases, the initial synchronization will be exponentially long. Should you consider how to optimize this time?

    support 
    opened by Haley-Wong 6
  • NSE to persist megolm sessions

    NSE to persist megolm sessions

    Pull Request Checklist

    • [ x] Pull request is based on the develop branch
    • [ ] Pull request contains a changelog file in ./changelog.d. See https://github.com/matrix-org/matrix-ios-sdk/blob/develop/CONTRIBUTING.md#changelog
    • [x] Pull request includes a sign off Signed-off-by: Shunmugaraj S [email protected]
    opened by toshanmugaraj 5
  • ๐Ÿ› Protect the `spacesPerId` variable by a barrier

    ๐Ÿ› Protect the `spacesPerId` variable by a barrier

    Fixes Thread 1: EXC_BAD_ACCESS crash that would occur whenever multiple concurrent threads would attempt to mutate spacesPerId at the same time.

    Signed-off-by: Frantisek Hetes [email protected]

    opened by ferologics 5
  • Expose MXEncryptedAttachments in umbrella header

    Expose MXEncryptedAttachments in umbrella header

    This is currently a missing interface and would require any Swift project to create a bridging header with the specific import.

    Signed-off-by: Frantisek Hetes [email protected]

    opened by ferologics 5
  • Render m.poll.end event (PSG-196)

    Render m.poll.end event (PSG-196)

    This PR:

    • Adds a new init for the PollAggregator so that it will be able to aggregate a poll starting from a m.poll.end event
    • Enable replies for a m.poll.end event
    opened by alfogrillo 0
  • Capture decryption errors (PSG-1023)

    Capture decryption errors (PSG-1023)

    Description

    This PR:

    • Adds a new Notification for capturing decryption errors by the MXSession
    • Add a method in the PollAggregator to inject events not decrypted properly

    The final goal is to warn the user when a poll is affected by decryption errors since otherwise the votes count may be different across sessions of the same user or different users in the same room.

    Related PR: https://github.com/vector-im/element-ios/pull/7206

    opened by alfogrillo 0
  • Get all Attachments for a MXRoom

    Get all Attachments for a MXRoom

    The Android SDKs Room has an uploadService wich has a getUploads function where I can recive all attachments of a room paginated. Will this feature be also implemented for the ios SDK? I can't find any function that gets all attachments for a specific room

    opened by fxp83 0
  • CryptoV2 is not tracking users on membership changes, and only querying keys for unknown users if forceDownload is true

    CryptoV2 is not tracking users on membership changes, and only querying keys for unknown users if forceDownload is true

    MXCryptoV2 is not listening to room membership events of encrypted rooms in order to start tracking their devices (ask olmMachine to query keys). That is problematic if computeE2ERoomSummaryTrust is FALSE, as the keys will be downloaded later when sending a message, and that could affect message sending time.

    Also MXCryptoV2.downloadKeys looks like it's not behaving as expected? If forceDownload is false, it will only return keys in cache. It should in this case check what keys are missing from the provided user list, and only querying for them and return the newly downloaded one + the one that are already in cache

    bug 
    opened by BillCarsonFr 0
  • unnecessary forced keys/query in triggerComputeTrust of MXRoomSummary

    unnecessary forced keys/query in triggerComputeTrust of MXRoomSummary

    MXRoomSummary will force download all keys of room members for no reason. Triggerd on init, Can be trigger when member count change and some other triggers.

    There is no real reason for MXRoomSummary to do that, it should compute trust without forcing key downloads. The keys should already be downloaded:

    • When a members join an encrypted, his keys will be tracked
    • When loading members of a lazy loading the member's devices will be tracked
    • when setting encryption.

    Would be probably better to listen to MXDeviceListDidUpdateUsersDevicesNotification and then if one of the member is present in the change list to then compute trust (with force download = false)

    bug 
    opened by BillCarsonFr 0
Releases(v0.24.6)
  • v0.24.6(Dec 13, 2022)

    Changes in 0.24.6 (2022-12-13)

    ๐Ÿ™Œ Improvements

    • Change invites count logic. (#1645)
    • Crypto: Fail launch when unavailable crypto (#1646)
    • Add message id for to-device events (#1652)
    • CryptoV2: Update to latest Verification API (#1654)

    ๐Ÿงฑ Build

    • Update Ruby gems. (#1655)
    Source code(tar.gz)
    Source code(zip)
  • v0.24.5(Nov 29, 2022)

    Changes in 0.24.5 (2022-11-29)

    ๐Ÿ™Œ Improvements

    • CryptoV2: Import progress for room keys (#1637)
    • CryptoV2: Run all tasks with default priority (#1639)
    • CryptoV2: Fix backup performance (#1641)
    • MXSession: Calculate sync progress state (#1643)
    • CryptoV2: Add support to decrypt notifications and receive keys (#1644)
    • Pod: Fix linting on release mode & run fastlane lint on release configuration. (#1648)
    Source code(tar.gz)
    Source code(zip)
  • v0.24.3(Nov 15, 2022)

    Changes in 0.24.3 (2022-11-15)

    โœจ Features

    • Threads: added support to read receipts (MSC3771) (#6663)
    • Threads: added support to notifications count (MSC3773) (#6664)
    • Threads: added support to labs flag for read receipts (#7029)
    • Threads: notification count in main timeline including un participated threads (#7038)

    ๐Ÿ™Œ Improvements

    • CryptoV2: Room event decryption (#1627)
    • CryptoV2: Bugfixes (#1630)
    • CryptoV2: Log decryption errors separately (#1632)
    • Adds the sending of read receipts for poll start/end events (#1633)

    ๐Ÿ› Bugfixes

    • Tests: Fix or disable flakey integration tests (#1628)
    • Threads: removed "unread_thread_notifications" from sync filters for server that doesn't support MSC3773 (#7066)
    • Threads: Display number of unread messages above threads button (#7076)

    ๐Ÿ“„ Documentation

    • Doc: Update the synapse installation section with poetry usage (#1625)
    Source code(tar.gz)
    Source code(zip)
  • v0.24.2(Nov 1, 2022)

    Changes in 0.24.2 (2022-11-01)

    ๐Ÿ™Œ Improvements

    • CryptoV2: Manual key export / import (#1608)
    • CryptoV2: Set local trust and deprecate legacy verification method (#1613)
    • Crypto: Define MXCrypto and MXCrossSigning as protocols (#1614)
    • CryptoV2: Cross-sign self after restoring session (#1616)
    • Crypto: Curate MXCrypto protocol methods (#1618)
    • Crypto: Complete MXCryptoV2 implementation (#1620)

    ๐Ÿšง In development ๐Ÿšง

    • Device Manger: Multi session sign out. (#1619)
    Source code(tar.gz)
    Source code(zip)
  • v0.24.1(Oct 18, 2022)

    Changes in 0.24.1 (2022-10-18)

    ๐Ÿ™Œ Improvements

    • Support additional content in voice message. (#1595)
    • Key verification: Refactor verification manager, requests, transactions (#1599)
    • Crypto: Refactor QR transactions (#1602)
    • CryptoV2: Integrate Mac-compatible MatrixSDKCrypto (#1603)
    • CryptoV2: Unencrypted verification events (#1605)
    • Crypto: Remove megolm decrypt cache build flag (#1606)
    • Device Manager: Exposed method to update client information. (#1609)
    • CryptoV2: Manual device verification (#6781)
    • Add support for m.local_notification_settings. in account_data (#6797)
    • CryptoV2: Incoming verification requests (#6809)
    • CryptoV2: QR code verification (#6859)

    ๐Ÿ› Bugfixes

    • Fix users' display name in messages. (#6850)

    Others

    • Expose rest client method for generating login tokens through MSC3882 (#1601)
    Source code(tar.gz)
    Source code(zip)
  • v0.24.0(Oct 4, 2022)

    Changes in 0.24.0 (2022-10-04)

    ๐Ÿ™Œ Improvements

    • Crypto: Enable group session cache by default (#1575)
    • Crypto: Extract key backup engine (#1578)
    • MXSession: Set client information data if needed on resume. (#1582)
    • MXDevice: Move to dedicated file and implement MSC-3852. (#1583)
    • Add enableNewClientInformationFeature sdk option, disabled by default (PSG-799). (#1588)
    • Remove MXRoom's partialTextMessage support (#6670)
    • CryptoV2: Key backups (#6769)
    • CryptoV2: Key gossiping (#6773)
    • User sessions: Add support for MSC3881 (#6787)

    ๐Ÿงฑ Build

    • Disable codecov/patch. (#1579)

    โš ๏ธ API Changes

    • Upgrade minimum iOS and OSX deployment target to 13.0 and 10.15 respectively (#1574)

    Others

    • Avoid main thread assertion if we can't get the application (#6754)
    Source code(tar.gz)
    Source code(zip)
  • v0.23.19(Sep 28, 2022)

  • v0.23.18(Sep 7, 2022)

    Changes in 0.23.18 (2022-09-07)

    โœจ Features

    • MXKeyBackup: Add support for symmetric key backups. (#1542)
    • CryptoSDK: Outgoing SAS User Verification Flow (#6443)
    • CryptoV2: Self-verification flow (#6589)

    ๐Ÿ™Œ Improvements

    • Allow setting room alias regardless of join rule (#1559)
    • Crypto: Cache inbound group sessions when decrypting (#1566)
    • Crypto: Create lazy in-memory room encryptors (#1570)
    • App Layout: Increased store version to force clear cache (#6616)

    ๐Ÿ› Bugfixes

    • Fix incoming calls sometimes ringing after being answered on another client (#6614)

    ๐Ÿงฑ Build

    • Xcode project(s) updated via Xcode recommended setting (#1543)
    • MXLog: Ensure MXLogLevel.none works if it is set after another log level has already been configured. (#1550)

    ๐Ÿ“„ Documentation

    • README: Update the badge header (#1569)
    • Update README for correct Swift usage. (#1552)

    Others

    • Crypto: User and device identity objects (#1531)
    • Analytics: Log all errors to analytics (#1558)
    • Improve MXLog file formatting and fix log message format (#1564)
    Source code(tar.gz)
    Source code(zip)
  • v0.23.17(Aug 31, 2022)

  • v0.23.16(Aug 24, 2022)

    Changes in 0.23.16 (2022-08-24)

    โœจ Features

    • MXKeyBackup: Add support for symmetric key backups. (#1542)
    • CryptoSDK: Outgoing SAS User Verification Flow (#6443)

    ๐Ÿ™Œ Improvements

    • App Layout: Increased store version to force clear cache (#6616)

    ๐Ÿงฑ Build

    • Xcode project(s) updated via Xcode recommended setting (#1543)
    • MXLog: Ensure MXLogLevel.none works if it is set after another log level has already been configured. (#1550)

    ๐Ÿ“„ Documentation

    • Update README for correct Swift usage. (#1552)

    Others

    • Crypto: User and device identity objects (#1531)
    • Analytics: Log all errors to analytics (#1558)
    Source code(tar.gz)
    Source code(zip)
  • v0.23.15(Aug 10, 2022)

  • v0.23.14(Aug 9, 2022)

    Changes in 0.23.14 (2022-08-09)

    ๐Ÿ™Œ Improvements

    • CI: Enable integration tests on GitHub actions (#1537)
    • App Layout: Added breadcrumbs data fetcher and updated room summary data type to reflect new needs (#6407)
    • App Layout: added MXSpace.minimumPowerLevelForAddingRoom() and MXSpaceService.rootSpaces (#6410)

    ๐Ÿ› Bugfixes

    • MXRestClient: Send an empty dictionary when calling /join to be spec compliant. (#6481)
    • App Layout: exclude room summaries without notifications from unread list (#6511)
    Source code(tar.gz)
    Source code(zip)
  • v0.23.13(Jul 26, 2022)

    Changes in 0.23.13 (2022-07-26)

    ๐Ÿ™Œ Improvements

    • MXRoom: Support reply to beacon info event. (#6423)
    • MXBeaconAggregations: Handle beacon info redaction. (#6470)

    ๐Ÿ› Bugfixes

    • Fix formatted_body content for unformatted events (#6446)

    ๐Ÿงฑ Build

    • Disable nightly tests for now as they're always timing out. (#1523)

    Others

    • Reduce project warnings (#1527)
    • Crypto: Convert verification request and transaction to protocols (#1528)
    Source code(tar.gz)
    Source code(zip)
  • v0.23.12(Jul 13, 2022)

  • v0.23.11(Jul 12, 2022)

    Changes in 0.23.11 (2022-07-12)

    โœจ Features

    • Analytics: Track non-fatal issues if consent provided (#1503)
    • Crypto: Integrate Rust-based OlmMachine to encrypt / decrypt messages (#6357)

    ๐Ÿ™Œ Improvements

    • Include ID server access token when making a 3pid invite (and creating a room). (#6385)

    ๐Ÿ› Bugfixes

    • MXiOSAudioOutputRouter: fixed issue that prevents the system to properly switch from built-in to bluetooth output. (#5368)
    • Fix MXCall answer not being sent to server in some cases (#6359)

    Others

    • Integration tests should wait until the room is ready (#1516)
    • Analytics: Log errors with details in analytics (#1517)
    • Secret Storage: Detect multiple valid SSSS keys (#4569)
    Source code(tar.gz)
    Source code(zip)
  • v0.23.10(Jun 28, 2022)

    Changes in 0.23.10 (2022-06-28)

    โœจ Features

    • Add missing "user_busy" MXCallHangupEvent (#1342)

    ๐Ÿ› Bugfixes

    • Handle empty pagination end token on timeline end reached (#6347)

    โš ๏ธ API Changes

    • Drop support for iOS 10 and 32-bit architectures (#1501)

    ๐Ÿงฑ Build

    • CI: Add concurrency to GitHub Actions. (#5039)
    • Add Codecov for unit tests coverage. (#6306)

    Others

    • Crypto: Subclass MXCrypto to enable work-in-progress Rust sdk (#1496)
    • MXBackgroundSyncService - Expose separate method for fetching a particular room's read marker event without causing extra syncs. (#1500)
    • Crypto: Integrate new Rust-based MatrixSDKCrypto framework for DEBUG builds (#1501)
    Source code(tar.gz)
    Source code(zip)
  • v0.23.9(Jun 14, 2022)

    Changes in 0.23.9 (2022-06-14)

    ๐Ÿ› Bugfixes

    • Fix a crash on start if the user has a very large number of unread events in a room (#1490)
    • Prevent invalid room names on member count underflows. (#6227)
    • Location sharing: Fix geo URI parsing with altitude component. (#6247)

    โš ๏ธ API Changes

    • MXRestClient: Add logoutDevices parameter to changePassword method. (#6175)
    • Mark MXRestClient init as required for mocking. (#6179)
    Source code(tar.gz)
    Source code(zip)
  • v0.23.8(Jun 3, 2022)

    Changes in 0.23.8 (2022-06-03)

    ๐Ÿ› Bugfixes

    • Room state: Reload room state if detected empty on disk (#1483)
    • Remove unwanted parts from replies new_content body/formatted_body (#3517)
    • MXBackgroundStore: Avoid clearing file store if event stream token is missing. (#5924)
    • MXRestClient: limit the query length to 2048 for joinRoom (#6224)
    • Bump realm to 10.27.0 to fix crypto performance issue. (#6239)

    ๐Ÿšง In development ๐Ÿšง

    • Location sharing: Authorize only one live beacon info per member and per room. (#6100)

    Others

    • Crypto: Add more logs when encrypting messages (#1476)
    Source code(tar.gz)
    Source code(zip)
  • v0.23.7(May 31, 2022)

    Changes in 0.23.7 (2022-05-31)

    ๐Ÿ› Bugfixes

    • MXSession: Recreate room summaries when detected missing. (#5924)
    • Fixed crashes on invalid casting of MXUser to MXMyUser causing unrecognized selectors on the mxSession property. (#6187)
    • MXCoreDataRoomSummaryStore: Make removing a room summary synchronous. (#6218)

    โš ๏ธ API Changes

    • MXTools: generateTransactionId no longer returns an optional in Swift. (#1477)

    ๐Ÿšง In development ๐Ÿšง

    • Location sharing: Persist beacon info summaries to disk. (#6199)

    Others

    • MXFileStore: Add extra logs when saving and loading room state (#1478)
    • MXBackgroundSyncServiceTests: Add tests for outdated gappy syncs. (#6142)
    Source code(tar.gz)
    Source code(zip)
  • v0.23.6(May 19, 2022)

  • v0.23.5(May 18, 2022)

    Changes in 0.23.5 (2022-05-18)

    โœจ Features

    • Add io.element.video room type. (#6149)

    ๐Ÿ™Œ Improvements

    • Rooms: support for attributedPartialTextMessage storage (#3526)

    ๐Ÿšง In development ๐Ÿšง

    • MXBeaconInfoSummary: Add room id and support device id update after start location sharing. (#5722)

    Others

    • Update check for server-side threads support to match spec. (#1460)
    Source code(tar.gz)
    Source code(zip)
  • v0.23.4(May 5, 2022)

    Changes in 0.23.4 (2022-05-05)

    ๐Ÿ™Œ Improvements

    • Crypto: Share Megolm session keys when inviting a new user (#4947)
    • Authentication: Add MXUsernameAvailability and isUsernameAvailable method on MXRestClient. (#5648)

    ๐Ÿ› Bugfixes

    • MXSpaceService: added method firstRootAncestorForRoom (#5965)
    • MXRoom: Update room summary after removing/refreshing unsent messages. (#6040)

    ๐Ÿšง In development ๐Ÿšง

    • Location sharing: Handle live location beacon event. Handle beacon info + beacon data aggregation. (#6021)
    • Location sharing: Handle stop live location sharing. (#6070)
    • Location sharing: MXBeaconInfoSummary add isActive property. (#6113)
    Source code(tar.gz)
    Source code(zip)
  • v0.23.3(Apr 20, 2022)

    Changes in 0.23.3 (2022-04-20)

    ๐Ÿ™Œ Improvements

    • Location sharing: Handle live location sharing start event. (#5903)
    • Add a preferred presence property to MXSession (#5995)
    • Pods: Upgrade JitsiMeetSDK to 5.0.2 and re-enable building for ARM64 simulator. (#6018)

    ๐Ÿ› Bugfixes

    • MatrixSDK: Fix some crashes after 1.8.10. (#6023)

    Others

    • Fix some warnings. (#1440)
    Source code(tar.gz)
    Source code(zip)
  • v0.23.2(Apr 5, 2022)

    Changes in 0.23.2 (2022-04-05)

    ๐Ÿ™Œ Improvements

    • Room: Return room identifier and known servers when resolving alias (#4858)
    • MXRestClient: Use the stable hierarchy endpoint from MSC2946 (#5144)
    • MXPublicRoom: added implementation for JSONDictionary (#5953)

    ๐Ÿ› Bugfixes

    • MXEventListener/MXRoomSummary: Fix retain cycles (#5058)
    • Sync Spaces order with web (#5134)
    • VoIP: Recreate CXProvider if a call cannot be hung up (#5189)
    • MXThreadingService: Apply edits on thread root and latest events of a thread list. (#5845)
    • MXThread: Fix redacted events & fix undecrypted events. (#5877)
    • Room: Do not commit to file store after typing a single character (#5906)
    • Move handleRoomKeyEvent logic back to MXSession. (#5938)
    • MXSuggestedRoomListDataFetcher: Spaces shouldn't be displayed as suggested rooms (#5978)

    โš ๏ธ API Changes

    • Location sharing: Add new event asset type for pin drop location sharing (#5858)
    Source code(tar.gz)
    Source code(zip)
  • v0.23.1(Mar 28, 2022)

  • v0.23.0(Mar 22, 2022)

    Changes in 0.23.0 (2022-03-22)

    โœจ Features

    • MXSpace: added canAddRoom() method (#5230)
    • MXRoomAliasAvailabilityChecker: added extractLocalAliasPart() (#5233)

    ๐Ÿ™Œ Improvements

    • Space creation: Added home server capabilities, room alias validator, restricted join rule, refined space related API, and added tests (#5224)
    • Added room upgrade API call and the ability to (un)suggest a room for a space (#5231)
    • MXSpaceService: added spaceSummaries property (#5401)
    • Threads: Fix deleted thread root & decrypt thread list. (#5441)
    • Threads: Replace property for in-thread replies. (#5704)
    • MXRoomEventFilter: Update property names for relation types and senders. (#5705)
    • MXThreadingService: Use versions instead of capabilities to check threads server support. (#5744)
    • MXEventContentRelatesTo: Update reply fallback property name and reverse the logic. (#5790)
    • Threads: Update all properties to stable values. (#5791)
    • Room: API to ignore the sender of a room invite before the room is joined (#5807)
    • MXRoom: Do not try to guess threadId for replies, get that as a parameter. (#5829)
    • MXThreadingService: Fix number of replies & notification/highlight counts for threads. (#5843)

    ๐Ÿ› Bugfixes

    • MXThreadEventTimeline: Decrypt events fetched from server. (#5749)
    • MXRoom: Fix retain cycles, in particular between MXRoomOperation and its block. (#5805)
    • Timeline: Prevent skipping an item between each pagination batch (#5819)
    • Crypto: Distinguish between original and edit message when preventing replay attacks (#5835)
    • MXThreadEventTimeline: Fix processing order of thread events & fix empty thread screen issue. (#5840)
    • Timeline: Paginated events always show the most recent edit (#5848)
    • MXFileStore: Log when filters cannot be saved or loaded (#5873)
    Source code(tar.gz)
    Source code(zip)
  • v0.22.2(Mar 22, 2022)

    Changes in 0.22.2 (2022-02-22)

    ๐Ÿ™Œ Improvements

    • Added support for unstable poll prefixes. (#5114)
    • Exclude all files and directories from iCloud and iTunes backup (#5498)
    • MXSession & MXThreadingService: Implement server capabilities api & implement thread list api according to server capabilities. (#5540)
    • MXThreadEventTimeline: Replace context api with relations api. (#5629)

    ๐Ÿ› Bugfixes

    • Settings: fix phone number validation through custom URL (#3562)
    • MXRoomListData: Consider all properties when comparing room list data. (#5537)

    ๐Ÿงฑ Build

    • Use the --no-rate-limit flag as mentioned in the README (#1352)
    Source code(tar.gz)
    Source code(zip)
  • v0.22.6(Mar 14, 2022)

  • v0.22.5(Mar 8, 2022)

    Changes in 0.22.5 (2022-03-08)

    ๐Ÿ™Œ Improvements

    • Room data filters: strict matches support (#1379)
    • Analytics: Add event composition tracking and isSpace for joined room events. (#5365)
    • MXEvent+Extensions: Do not highlight any event that the current user sent. (#5552)

    ๐Ÿ› Bugfixes

    • Room: fix crash on members count not being always properly set (#4949)
    • MXSuggestedRoomListDataFetcher: hide suggested rooms that a user is already part of (#5276)
    • MXFileStore: Do not reuse room files if the room is marked for deletion (#5717)
    Source code(tar.gz)
    Source code(zip)
  • v0.22.4(Feb 25, 2022)

Owner
matrix.org
A new basis for open, interoperable, decentralised real-time communication
matrix.org
Alter SDK is a cross-platform SDK consisting of a real-time 3D avatar system, facial motion capture, and an Avatar Designer component built from scratch for web3 interoperability and the open metaverse.

Alter SDK is a cross-platform SDK consisting of a real-time 3D avatar system, facial motion capture, and an Avatar Designer component built from scratch for web3 interoperability and the open metaverse.

Alter 45 Nov 29, 2022
Native iOS implementation of RadarCOVID tracing client using DP3T iOS SDK

RadarCOVID iOS App Introduction Native iOS implementation of RadarCOVID tracing client using DP3T iOS SDK Prerequisites These are the tools used to bu

Radar COVID 146 Nov 24, 2022
TelegramStickersImport โ€” Telegram stickers importing SDK for iOS

TelegramStickersImport โ€” Telegram stickers importing SDK for iOS TelegramStickersImport helps your users import third-party programaticaly created sti

null 35 Oct 26, 2022
Muxer used on top of Feed iOS SDK for airplay

FeedAirplayMuxer Muxer used on top of Feed iOS SDK for airplay purposes. Demo Project --> https://github.com/feedfm/AirplayDemo Feed Airplay Muxer is

Feed Media 0 May 6, 2022
Basispay IOS SDK Version 2

BasisPay-IOS-KIT BasisPay IOS Payment Gateway kit for developers INTRODUCTION This document describes the steps for integrating Basispay online paymen

null 0 Oct 21, 2021
Release repo for Gini Bank SDK for iOS

Gini Bank SDK for iOS The Gini Bank SDK provides components for capturing, reviewing and analyzing photos of invoices and remittance slips. By integra

Gini GmbH 1 Dec 6, 2022
Da Xue Zhang Platform Lvb iOS SDK

Cloud_Lvb_SDK iOS API Reference Dxz Meeting iOS SDKๆ˜ฏไธบ iOS ๅนณๅฐ็”จๆˆท้Ÿณ่ง†้ข‘ๆœๅŠก็š„ๅผ€ๆบ SDKใ€‚้€š่ฟ‡ๅคงๅญฆ้•ฟๅผ€ๆ”พๅนณๅฐ่‡ช็ ”RTC๏ผŒRTM็ณป็ปŸ,ไธบๅฎขๆˆทๆไพ›่ดจ้‡ๅฏ้ ็š„้Ÿณ่ง†้ข‘ๆœๅŠกใ€‚ ็ฑป ็ฑปๅ ๆ่ฟฐ CLS_PlatformManager SDK็š„้Ÿณ่ง†้ข‘ไธป่ฆ

null 8 Jan 10, 2022
PayPal iOS SDK

PayPal iOS SDK Welcome to PayPal's iOS SDK. This library will help you accept card, PayPal, Venmo, and alternative payment methods in your iOS app. Su

PayPal 25 Dec 14, 2022
Unofficial Notion API SDK for iOS & macOS

NotionSwift Unofficial Notion SDK for iOS & macOS. This is still work in progress version, the module interface might change. API Documentation This l

Wojciech Chojnacki 59 Jan 8, 2023
150,000+ stickers API & SDK for iOS Apps.

English | ํ•œ๊ตญ์–ด Stipop UI SDK for iOS Stipop SDK provides over 150,000 .png and .gif stickers that can be easily integrated into mobile app chats, comme

Stipop, Inc. 19 Dec 20, 2022
Spotify SDK for iOS

Spotify iOS SDK Overview The Spotify iOS framework allows your application to interact with the Spotify app running in the background on a user's devi

Spotify 522 Jan 6, 2023
Headless iOS/Mac SDK for saving stuff to Pocket.

This SDK is deprecated Howdy all! ?? Thanks for checking out this repo. Your ?? mean a lot to us. ?? Unfortunately, this project is deprecated, and th

Pocket 230 Mar 18, 2022
Evernote Cloud SDK for iOS

Evernote Cloud SDK 3.0 for iOS This is the official Evernote SDK for iOS. To get started, follow the instructions bellow. Additional information can b

Evernote 256 Oct 6, 2022
iOS SDK for the Box Content API

Box iOS SDK Getting Started Docs: https://developer.box.com/guides/mobile/ios/quick-start/ NOTE: The Box iOS SDK in Objective-C (prior to v3.0.0) has

Box 112 Dec 19, 2022
OneDrive SDK for iOS

Get started with the OneDrive SDK for iOS Integrate the OneDrive API into your iOS app! 1. Installation Install via Cocoapods Install Cocoapods - Foll

OneDrive 101 Dec 19, 2022
Stripe iOS SDK

Stripe iOS SDK The Stripe iOS SDK makes it quick and easy to build an excellent payment experience in your iOS app. We provide powerful and customizab

Stripe 1.8k Jan 5, 2023
AWS SDK for iOS. For more information, see our web site:

AWS SDK for iOS The AWS SDK for iOS provides a library and documentation for developers to build connected mobile applications using AWS. Features / A

AWS Amplify 1.6k Dec 26, 2022
Zendesk Mobile SDK for iOS

โš ๏ธ This Repository has been deprecated, please go to here for the Zendesk Support SDK โš ๏ธ Zendesk Mobile SDK for iOS Zendesk SDK for mobile is a quick,

Zendesk 113 Dec 24, 2022
PlayKit: Kaltura Player SDK for iOS

Kaltura Player SDK Demo: Demo repo. If you are a Kaltura customer, please contact your Kaltura Customer Success Manager to help facilitate use of this

Kaltura 77 Jan 3, 2023