forked from mirrors/linphone-iphone
Merge branch 'master' into dev_group_chat
This commit is contained in:
commit
36084211dd
39 changed files with 340 additions and 244 deletions
|
|
@ -14,6 +14,7 @@ Group changes to describe their impact on the project, as follows:
|
|||
|
||||
### Added
|
||||
- Support of IOS 11
|
||||
- new algorithm to adapt audio and video codec bitrates to the available bandwidth (https://wiki.linphone.org/xwiki/wiki/public/view/FAQ/How%20does%20adaptive%20bitrate%20algorithm%20work%20%3F/)
|
||||
|
||||
### Changed
|
||||
- Contact, CNContact implmentation.
|
||||
|
|
|
|||
|
|
@ -449,12 +449,14 @@ static UICompositeViewDescription *compositeDescription = nil;
|
|||
BOOL show_logo = [LinphoneManager.instance lpConfigBoolForKey:@"show_assistant_logo_in_choice_view_preference"];
|
||||
BOOL show_extern = ![LinphoneManager.instance lpConfigBoolForKey:@"hide_assistant_custom_account"];
|
||||
BOOL show_new = ![LinphoneManager.instance lpConfigBoolForKey:@"hide_assistant_create_account"];
|
||||
|
||||
BOOL show_fetch_remote = ![LinphoneManager.instance lpConfigBoolForKey:@"show_remote_provisioning_in_assistant"];
|
||||
|
||||
if (!placement_done) {
|
||||
// visibility
|
||||
_welcomeLogoImage.hidden = !show_logo;
|
||||
_gotoLoginButton.hidden = !show_extern;
|
||||
_gotoCreateAccountButton.hidden = !show_new;
|
||||
_gotoRemoteProvisioningButton.hidden = !show_fetch_remote;
|
||||
|
||||
// placement
|
||||
if (show_logo && show_new && !show_extern) {
|
||||
|
|
|
|||
|
|
@ -30,8 +30,8 @@
|
|||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
</view>
|
||||
<view contentMode="scaleToFill" id="6sv-JD-j8Z" userLabel="statusBarBG">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="20"/>
|
||||
<view contentMode="scaleToFill" misplaced="YES" id="6sv-JD-j8Z" userLabel="statusBarBG">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="35"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
|
||||
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
</view>
|
||||
|
|
|
|||
|
|
@ -179,8 +179,8 @@ static UICompositeViewDescription *compositeDescription = nil;
|
|||
[super viewDidAppear:animated];
|
||||
|
||||
[[UIApplication sharedApplication] setIdleTimerDisabled:YES];
|
||||
UIDevice.currentDevice.proximityMonitoringEnabled = !_speakerButton.enabled;
|
||||
|
||||
[[UIDevice currentDevice] setProximityMonitoringEnabled:TRUE];
|
||||
|
||||
[PhoneMainView.instance setVolumeHidden:TRUE];
|
||||
hiddenVolume = TRUE;
|
||||
|
||||
|
|
@ -192,7 +192,7 @@ static UICompositeViewDescription *compositeDescription = nil;
|
|||
|
||||
- (void)viewWillDisappear:(BOOL)animated {
|
||||
[super viewWillDisappear:animated];
|
||||
|
||||
[[UIDevice currentDevice] setProximityMonitoringEnabled:FALSE];
|
||||
[self disableVideoDisplay:TRUE animated:NO];
|
||||
|
||||
if (hideControlsTimer != nil) {
|
||||
|
|
@ -219,7 +219,7 @@ static UICompositeViewDescription *compositeDescription = nil;
|
|||
[super viewDidDisappear:animated];
|
||||
|
||||
[[UIApplication sharedApplication] setIdleTimerDisabled:false];
|
||||
UIDevice.currentDevice.proximityMonitoringEnabled = NO;
|
||||
[[UIDevice currentDevice] setProximityMonitoringEnabled:FALSE];
|
||||
|
||||
[PhoneMainView.instance fullScreen:false];
|
||||
// Disable tap
|
||||
|
|
@ -357,7 +357,9 @@ static void hideSpinner(LinphoneCall *call, void *user_data) {
|
|||
hideControlsTimer = nil;
|
||||
}
|
||||
|
||||
[PhoneMainView.instance fullScreen:!disabled];
|
||||
if(![PhoneMainView.instance isIphoneXDevice]){
|
||||
[PhoneMainView.instance fullScreen:!disabled];
|
||||
}
|
||||
[PhoneMainView.instance hideTabBar:!disabled];
|
||||
|
||||
if (!disabled) {
|
||||
|
|
|
|||
|
|
@ -154,7 +154,6 @@
|
|||
- (void)newContact:(NSString *)address {
|
||||
CNContact *contact = [[CNContact alloc] init];
|
||||
Contact *mContact = [[Contact alloc] initWithCNContact:contact];
|
||||
[mContact setSipAddress:address atIndex:0];
|
||||
[self selectContact:mContact andReload:NO];
|
||||
[self addCurrentContactContactField:address];
|
||||
// force to restart server subscription to add new contact into the list
|
||||
|
|
@ -475,13 +474,19 @@ static UICompositeViewDescription *compositeDescription = nil;
|
|||
|
||||
- (IBAction)onEditClick:(id)event {
|
||||
if (_tableController.isEditing) {
|
||||
[self setEditing:FALSE];
|
||||
[self saveData];
|
||||
_isAdding = FALSE;
|
||||
self.tmpContact = NULL;
|
||||
_avatarImage.hidden = FALSE;
|
||||
_deleteButton.hidden = FALSE;
|
||||
_editButton.hidden = FALSE;
|
||||
[LinphoneManager.instance setContactsUpdated:TRUE];
|
||||
if(![self hasDuplicateContactOf:_contact]){
|
||||
[self setEditing:FALSE];
|
||||
[self saveData];
|
||||
_isAdding = FALSE;
|
||||
self.tmpContact = NULL;
|
||||
_avatarImage.hidden = FALSE;
|
||||
_deleteButton.hidden = FALSE;
|
||||
_editButton.hidden = FALSE;
|
||||
}else{
|
||||
LOGE(@"====>>>> Duplicated Contacts detected !!!");
|
||||
[[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Contact error", nil) message:NSLocalizedString(@"Contact duplicate", nil) delegate:nil cancelButtonTitle:nil otherButtonTitles:@"Continue", nil] show];
|
||||
}
|
||||
} else {
|
||||
[self modifyTmpContact:_contact];
|
||||
[self setEditing:TRUE];
|
||||
|
|
@ -519,6 +524,30 @@ static UICompositeViewDescription *compositeDescription = nil;
|
|||
}
|
||||
}
|
||||
|
||||
- (BOOL) hasDuplicateContactOf:(Contact*) contactToCheck{
|
||||
CNContactStore *store = [[CNContactStore alloc] init];
|
||||
NSArray *keysToFetch = @[
|
||||
CNContactEmailAddressesKey, CNContactPhoneNumbersKey,
|
||||
CNContactInstantMessageAddressesKey, CNInstantMessageAddressUsernameKey,
|
||||
CNContactFamilyNameKey, CNContactGivenNameKey, CNContactPostalAddressesKey,
|
||||
CNContactIdentifierKey, CNContactImageDataKey, CNContactNicknameKey
|
||||
];
|
||||
CNMutableContact *mCNContact =
|
||||
[[store unifiedContactWithIdentifier:contactToCheck.identifier keysToFetch:keysToFetch error:nil] mutableCopy];
|
||||
if(mCNContact == NULL){
|
||||
for(NSString *address in contactToCheck.sipAddresses){
|
||||
NSString *name = [FastAddressBook normalizeSipURI:address];
|
||||
if([LinphoneManager.instance.fastAddressBook.addressBookMap objectForKey:name]){
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}else{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#pragma mark - Image picker delegate
|
||||
|
||||
- (void)imagePickerDelegateImage:(UIImage *)image info:(NSDictionary *)info {
|
||||
|
|
|
|||
|
|
@ -157,7 +157,8 @@ static int ms_strcmpfuz(const char *fuzzy_word, const char *sentence) {
|
|||
if ([ContactSelection getSipFilter] ||
|
||||
[ContactSelection emailFilterEnabled]) {
|
||||
add = false;
|
||||
}else if ([FastAddressBook contactHasValidSipDomain:contact]) {
|
||||
}
|
||||
if ([FastAddressBook contactHasValidSipDomain:contact]) {
|
||||
add = true;
|
||||
}else if (contact.friend &&
|
||||
linphone_presence_model_get_basic_status(
|
||||
|
|
@ -191,10 +192,7 @@ static int ms_strcmpfuz(const char *fuzzy_word, const char *sentence) {
|
|||
[subAr insertObject:contact atIndex:idx];
|
||||
}
|
||||
}
|
||||
//}
|
||||
}
|
||||
[super loadData];
|
||||
|
||||
// since we refresh the tableview, we must perform this on main
|
||||
// thread
|
||||
dispatch_async(dispatch_get_main_queue(), ^(void) {
|
||||
|
|
@ -208,6 +206,7 @@ static int ms_strcmpfuz(const char *fuzzy_word, const char *sentence) {
|
|||
}
|
||||
[LinphoneManager.instance setLinphoneManagerAddressBookMap:addressBookMap];
|
||||
}
|
||||
[super loadData];
|
||||
_ongoing = FALSE;
|
||||
}
|
||||
|
||||
|
|
@ -405,23 +404,15 @@ static int ms_strcmpfuz(const char *fuzzy_word, const char *sentence) {
|
|||
}
|
||||
UIContactCell* cell = [self.tableView cellForRowAtIndexPath:indexPath];
|
||||
[cell setContact:NULL];
|
||||
[[LinphoneManager.instance fastAddressBook]
|
||||
deleteContact:contact];
|
||||
[tableView
|
||||
deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
|
||||
withRowAnimation:UITableViewRowAnimationFade];
|
||||
[tableView endUpdates];
|
||||
[[LinphoneManager.instance fastAddressBook] deleteContact:contact];
|
||||
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
|
||||
[tableView endUpdates];
|
||||
|
||||
[NSNotificationCenter.defaultCenter
|
||||
addObserver:self
|
||||
selector:@selector(onAddressBookUpdate:)
|
||||
[NSNotificationCenter.defaultCenter addObserver:self selector:@selector(onAddressBookUpdate:)
|
||||
name:kLinphoneAddressBookUpdate
|
||||
object:nil];
|
||||
dispatch_async(dispatch_get_main_queue(),
|
||||
^{
|
||||
[self loadData];
|
||||
});
|
||||
}
|
||||
[self loadData];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)removeSelectionUsing:(void (^)(NSIndexPath *))remover {
|
||||
|
|
@ -437,10 +428,9 @@ static int ms_strcmpfuz(const char *fuzzy_word, const char *sentence) {
|
|||
}
|
||||
UIContactCell* cell = [self.tableView cellForRowAtIndexPath:indexPath];
|
||||
[cell setContact:NULL];
|
||||
[[LinphoneManager.instance fastAddressBook] deleteContact:contact];
|
||||
[[LinphoneManager.instance fastAddressBook] deleteContact:contact];
|
||||
|
||||
[NSNotificationCenter.defaultCenter
|
||||
addObserver:self
|
||||
[NSNotificationCenter.defaultCenter addObserver:self
|
||||
selector:@selector(onAddressBookUpdate:)
|
||||
name:kLinphoneAddressBookUpdate
|
||||
object:nil];
|
||||
|
|
|
|||
|
|
@ -157,6 +157,7 @@ static UICompositeViewDescription *compositeDescription = nil;
|
|||
- (void)changeView:(ContactsCategory)view {
|
||||
CGRect frame = _selectedButtonImage.frame;
|
||||
if (view == ContactsAll && !allButton.selected) {
|
||||
//REQUIRED TO RELOAD WITH FILTER
|
||||
[LinphoneManager.instance setContactsUpdated:TRUE];
|
||||
frame.origin.x = allButton.frame.origin.x;
|
||||
[ContactSelection setSipFilter:nil];
|
||||
|
|
@ -165,6 +166,7 @@ static UICompositeViewDescription *compositeDescription = nil;
|
|||
linphoneButton.selected = FALSE;
|
||||
[tableController loadData];
|
||||
} else if (view == ContactsLinphone && !linphoneButton.selected) {
|
||||
//REQUIRED TO RELOAD WITH FILTER
|
||||
[LinphoneManager.instance setContactsUpdated:TRUE];
|
||||
frame.origin.x = linphoneButton.frame.origin.x;
|
||||
[ContactSelection setSipFilter:LinphoneManager.instance.contactFilter];
|
||||
|
|
@ -204,6 +206,7 @@ static UICompositeViewDescription *compositeDescription = nil;
|
|||
|
||||
- (IBAction)onDeleteClick:(id)sender {
|
||||
NSString *msg = [NSString stringWithFormat:NSLocalizedString(@"Do you want to delete selected contacts?", nil)];
|
||||
[LinphoneManager.instance setContactsUpdated:TRUE];
|
||||
[UIConfirmationDialog ShowWithMessage:msg
|
||||
cancelMessage:nil
|
||||
confirmMessage:nil
|
||||
|
|
@ -218,13 +221,13 @@ static UICompositeViewDescription *compositeDescription = nil;
|
|||
}
|
||||
|
||||
- (IBAction)onEditionChangeClick:(id)sender {
|
||||
allButton.hidden = linphoneButton.hidden = _selectedButtonImage.hidden = addButton.hidden =
|
||||
self.tableController.isEditing;
|
||||
allButton.hidden = linphoneButton.hidden = _selectedButtonImage.hidden = addButton.hidden = self.tableController.isEditing;
|
||||
}
|
||||
|
||||
- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar {
|
||||
searchBar.text = @"";
|
||||
[self searchBar:searchBar textDidChange:@""];
|
||||
[LinphoneManager.instance setContactsUpdated:TRUE];
|
||||
[tableController loadData];
|
||||
[searchBar resignFirstResponder];
|
||||
}
|
||||
|
|
@ -242,6 +245,7 @@ static UICompositeViewDescription *compositeDescription = nil;
|
|||
// searchBar.text = [searchText uppercaseString];
|
||||
[ContactSelection setNameOrEmailFilter:searchText];
|
||||
if (searchText.length == 0) {
|
||||
[LinphoneManager.instance setContactsUpdated:TRUE];
|
||||
[tableController loadData];
|
||||
} else {
|
||||
[tableController loadSearchedData];
|
||||
|
|
|
|||
|
|
@ -18,7 +18,9 @@
|
|||
*/
|
||||
|
||||
#import <MobileCoreServices/UTCoreTypes.h>
|
||||
|
||||
#import <AVFoundation/AVCaptureDevice.h>
|
||||
#import <AVFoundation/AVFoundation.h>
|
||||
#import <Photos/Photos.h>
|
||||
#import "ImagePickerView.h"
|
||||
#import "PhoneMainView.h"
|
||||
|
||||
|
|
@ -226,13 +228,25 @@ static UICompositeViewDescription *compositeDescription = nil;
|
|||
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
|
||||
[sheet addButtonWithTitle:NSLocalizedString(@"Camera", nil)
|
||||
block:^() {
|
||||
block(UIImagePickerControllerSourceTypeCamera);
|
||||
if([AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo] == AVAuthorizationStatusAuthorized ){
|
||||
if([PHPhotoLibrary authorizationStatus] != PHAuthorizationStatusDenied ){
|
||||
block(UIImagePickerControllerSourceTypeCamera);
|
||||
}else{
|
||||
[[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Photo's permission", nil) message:NSLocalizedString(@"Photo not authorized", nil) delegate:nil cancelButtonTitle:nil otherButtonTitles:@"Continue", nil] show];
|
||||
}
|
||||
}else {
|
||||
[[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Camera's permission", nil) message:NSLocalizedString(@"Camera not authorized", nil) delegate:nil cancelButtonTitle:nil otherButtonTitles:@"Continue", nil] show];
|
||||
}
|
||||
}];
|
||||
}
|
||||
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {
|
||||
[sheet addButtonWithTitle:NSLocalizedString(@"Photo library", nil)
|
||||
block:^() {
|
||||
block(UIImagePickerControllerSourceTypePhotoLibrary);
|
||||
if([PHPhotoLibrary authorizationStatus] != PHAuthorizationStatusDenied ){
|
||||
block(UIImagePickerControllerSourceTypePhotoLibrary);
|
||||
}else{
|
||||
[[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Photo's permission", nil) message:NSLocalizedString(@"Photo not authorized", nil) delegate:nil cancelButtonTitle:nil otherButtonTitles:@"Continue", nil] show];
|
||||
}
|
||||
}];
|
||||
}
|
||||
[sheet addCancelButtonWithTitle:NSLocalizedString(@"Cancel", nil) block:nil];
|
||||
|
|
|
|||
|
|
@ -84,7 +84,7 @@
|
|||
}
|
||||
LinphoneManager *instance = LinphoneManager.instance;
|
||||
[instance becomeActive];
|
||||
|
||||
|
||||
if (instance.fastAddressBook.needToUpdate) {
|
||||
//Update address book for external changes
|
||||
if (PhoneMainView.instance.currentView == ContactsListView.compositeViewDescription || PhoneMainView.instance.currentView == ContactDetailsView.compositeViewDescription) {
|
||||
|
|
@ -193,7 +193,7 @@
|
|||
answer.activationMode = UIUserNotificationActivationModeForeground;
|
||||
answer.destructive = NO;
|
||||
answer.authenticationRequired = YES;
|
||||
|
||||
|
||||
UIMutableUserNotificationAction *decline = [[UIMutableUserNotificationAction alloc] init];
|
||||
decline.identifier = @"decline";
|
||||
decline.title = NSLocalizedString(@"Decline", nil);
|
||||
|
|
@ -212,7 +212,7 @@
|
|||
}
|
||||
|
||||
- (UIUserNotificationCategory *)getAccountExpiryNotificationCategory {
|
||||
|
||||
|
||||
UIMutableUserNotificationCategory *expiryNotification = [[UIMutableUserNotificationCategory alloc] init];
|
||||
expiryNotification.identifier = @"expiry_notification";
|
||||
return expiryNotification;
|
||||
|
|
@ -333,20 +333,20 @@
|
|||
[RootViewManager setupWithPortrait:(PhoneMainView *)self.window.rootViewController];
|
||||
[PhoneMainView.instance startUp];
|
||||
[PhoneMainView.instance updateStatusBar:nil];
|
||||
|
||||
|
||||
if (bgStartId != UIBackgroundTaskInvalid)
|
||||
[[UIApplication sharedApplication] endBackgroundTask:bgStartId];
|
||||
|
||||
|
||||
//Enable all notification type. VoIP Notifications don't present a UI but we will use this to show local nofications later
|
||||
UIUserNotificationSettings *notificationSettings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert| UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
|
||||
|
||||
|
||||
//register the notification settings
|
||||
[application registerUserNotificationSettings:notificationSettings];
|
||||
|
||||
|
||||
//output what state the app is in. This will be used to see when the app is started in the background
|
||||
LOGI(@"app launched with state : %li", (long)application.applicationState);
|
||||
LOGI(@"FINISH LAUNCHING WITH OPTION : %@", launchOptions.description);
|
||||
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
|
|
@ -384,18 +384,18 @@
|
|||
UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Remote configuration", nil)
|
||||
message:NSLocalizedString(@"This operation will load a remote configuration. Continue ?", nil)
|
||||
preferredStyle:UIAlertControllerStyleAlert];
|
||||
|
||||
|
||||
UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"No", nil)
|
||||
style:UIAlertActionStyleDefault
|
||||
handler:^(UIAlertAction * action) {}];
|
||||
|
||||
|
||||
UIAlertAction* yesAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Yes", nil)
|
||||
style:UIAlertActionStyleDefault
|
||||
handler:^(UIAlertAction * action) {
|
||||
[self showWaitingIndicator];
|
||||
[self attemptRemoteConfiguration];
|
||||
}];
|
||||
|
||||
|
||||
[errView addAction:defaultAction];
|
||||
[errView addAction:yesAction];
|
||||
|
||||
|
|
@ -422,79 +422,64 @@
|
|||
}
|
||||
|
||||
- (void)processRemoteNotification:(NSDictionary *)userInfo {
|
||||
if (linphone_core_get_calls(LC)) // if there are calls, obviously our TCP socket shall be working
|
||||
return;
|
||||
|
||||
NSDictionary *aps = [userInfo objectForKey:@"aps"];
|
||||
if (!aps)
|
||||
return;
|
||||
|
||||
if (aps != nil) {
|
||||
NSDictionary *alert = [aps objectForKey:@"alert"];
|
||||
NSString *loc_key = [aps objectForKey:@"loc-key"];
|
||||
NSString *callId = [aps objectForKey:@"call-id"];
|
||||
if (alert != nil) {
|
||||
loc_key = [alert objectForKey:@"loc-key"];
|
||||
/*if we receive a remote notification, it is probably because our TCP background socket was no more working.
|
||||
As a result, break it and refresh registers in order to make sure to receive incoming INVITE or MESSAGE*/
|
||||
if (linphone_core_get_calls(LC) == NULL) { // if there are calls, obviously our TCP socket shall be working
|
||||
//linphone_core_set_network_reachable(LC, FALSE);
|
||||
if (!linphone_core_is_network_reachable(LC)) {
|
||||
LinphoneManager.instance.connectivity = none; //Force connectivity to be discovered again
|
||||
[LinphoneManager.instance setupNetworkReachabilityCallback];
|
||||
}
|
||||
if (loc_key != nil) {
|
||||
NSString *loc_key = [aps objectForKey:@"loc-key"];
|
||||
NSString *callId = [aps objectForKey:@"call-id"] ?: @"";
|
||||
if (!loc_key)
|
||||
return;
|
||||
|
||||
callId = [userInfo objectForKey:@"call-id"];
|
||||
if (callId != nil) {
|
||||
if ([callId isEqualToString:@""]){
|
||||
//Present apn pusher notifications for info
|
||||
if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_9_x_Max) {
|
||||
UNMutableNotificationContent* content = [[UNMutableNotificationContent alloc] init];
|
||||
content.title = @"APN Pusher";
|
||||
content.body = @"Push notification received !";
|
||||
|
||||
UNNotificationRequest *req = [UNNotificationRequest requestWithIdentifier:@"call_request" content:content trigger:NULL];
|
||||
[[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:req withCompletionHandler:^(NSError * _Nullable error) {
|
||||
// Enable or disable features based on authorization.
|
||||
if (error) {
|
||||
LOGD(@"Error while adding notification request :");
|
||||
LOGD(error.description);
|
||||
}
|
||||
}];
|
||||
} else {
|
||||
UILocalNotification *notification = [[UILocalNotification alloc] init];
|
||||
notification.repeatInterval = 0;
|
||||
notification.alertBody = @"Push notification received !";
|
||||
notification.alertTitle = @"APN Pusher";
|
||||
[[UIApplication sharedApplication] presentLocalNotificationNow:notification];
|
||||
}
|
||||
} else {
|
||||
[LinphoneManager.instance addPushCallId:callId];
|
||||
}
|
||||
} else if ([callId isEqual: @""]) {
|
||||
LOGE(@"PushNotification: does not have call-id yet, fix it !");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (callId && [self addLongTaskIDforCallID:callId]) {
|
||||
if ([UIApplication sharedApplication].applicationState != UIApplicationStateActive && loc_key &&
|
||||
index > 0) {
|
||||
if ([loc_key isEqualToString:@"IC_MSG"]) {
|
||||
[LinphoneManager.instance startPushLongRunningTask:FALSE callId:callId];
|
||||
[self fixRing];
|
||||
} else if ([loc_key isEqualToString:@"IM_MSG"]) {
|
||||
[LinphoneManager.instance startPushLongRunningTask:TRUE callId:callId];
|
||||
}
|
||||
}
|
||||
}
|
||||
if ([self addLongTaskIDforCallID:callId] && [UIApplication sharedApplication].applicationState != UIApplicationStateActive) {
|
||||
if ([loc_key isEqualToString:@"IC_MSG"])
|
||||
[LinphoneManager.instance startPushLongRunningTask:FALSE callId:callId];
|
||||
else if ([loc_key isEqualToString:@"IM_MSG"])
|
||||
[LinphoneManager.instance startPushLongRunningTask:TRUE callId:callId];
|
||||
}
|
||||
|
||||
// if we receive a remote notification, it is probably because our TCP background socket was no more working.
|
||||
// As a result, break it and refresh registers in order to make sure to receive incoming INVITE or MESSAGE
|
||||
if (!linphone_core_is_network_reachable(LC)) {
|
||||
LinphoneManager.instance.connectivity = none; //Force connectivity to be discovered again
|
||||
[LinphoneManager.instance setupNetworkReachabilityCallback];
|
||||
}
|
||||
|
||||
if ([callId isEqualToString:@""]) {
|
||||
//Present apn pusher notifications for info
|
||||
if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_9_x_Max) {
|
||||
UNMutableNotificationContent* content = [[UNMutableNotificationContent alloc] init];
|
||||
content.title = @"APN Pusher";
|
||||
content.body = @"Push notification received !";
|
||||
|
||||
UNNotificationRequest *req = [UNNotificationRequest requestWithIdentifier:@"call_request" content:content trigger:NULL];
|
||||
[[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:req withCompletionHandler:^(NSError * _Nullable error) {
|
||||
// Enable or disable features based on authorization.
|
||||
if (error) {
|
||||
LOGD(@"Error while adding notification request :");
|
||||
LOGD(error.description);
|
||||
}
|
||||
}];
|
||||
} else {
|
||||
UILocalNotification *notification = [[UILocalNotification alloc] init];
|
||||
notification.repeatInterval = 0;
|
||||
notification.alertBody = @"Push notification received !";
|
||||
notification.alertTitle = @"APN Pusher";
|
||||
[[UIApplication sharedApplication] presentLocalNotificationNow:notification];
|
||||
}
|
||||
} else
|
||||
[LinphoneManager.instance addPushCallId:callId];
|
||||
|
||||
LOGI(@"Notification %@ processed", userInfo.description);
|
||||
}
|
||||
|
||||
- (BOOL)addLongTaskIDforCallID:(NSString *)callId {
|
||||
NSDictionary *dict = LinphoneManager.instance.pushDict;
|
||||
if ([[dict allKeys] indexOfObject:callId] != NSNotFound) {
|
||||
if ([[dict allKeys] indexOfObject:callId] != NSNotFound)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
LOGI(@"Adding long running task for call id : %@ with index : 1", callId);
|
||||
[dict setValue:[NSNumber numberWithInt:1] forKey:callId];
|
||||
|
|
@ -503,7 +488,6 @@
|
|||
|
||||
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
|
||||
LOGI(@"%@ : %@", NSStringFromSelector(_cmd), userInfo);
|
||||
|
||||
[self processRemoteNotification:userInfo];
|
||||
}
|
||||
|
||||
|
|
@ -513,9 +497,9 @@
|
|||
while (rooms) {
|
||||
const LinphoneAddress *room_from_address = linphone_chat_room_get_peer_address((LinphoneChatRoom *)rooms->data);
|
||||
char *room_from = linphone_address_as_string_uri_only(room_from_address);
|
||||
if (room_from && strcmp(from, room_from) == 0) {
|
||||
if (room_from && strcmp(from, room_from) == 0)
|
||||
return rooms->data;
|
||||
}
|
||||
|
||||
rooms = rooms->next;
|
||||
}
|
||||
return NULL;
|
||||
|
|
@ -536,31 +520,31 @@
|
|||
|
||||
#pragma mark - PushKit Functions
|
||||
|
||||
- (void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials:(PKPushCredentials *)credentials forType:(PKPushType)type {
|
||||
LOGI(@"PushKit credentials updated");
|
||||
LOGI(@"voip token: %@", (credentials.token));
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
[LinphoneManager.instance setPushNotificationToken:credentials.token];
|
||||
});
|
||||
}
|
||||
|
||||
- (void)pushRegistry:(PKPushRegistry *)registry
|
||||
didInvalidatePushTokenForType:(NSString *)type {
|
||||
LOGI(@"PushKit Token invalidated");
|
||||
dispatch_async(dispatch_get_main_queue(), ^{[LinphoneManager.instance setPushNotificationToken:nil];});
|
||||
}
|
||||
|
||||
- (void)pushRegistry:(PKPushRegistry *)registry
|
||||
didReceiveIncomingPushWithPayload:(PKPushPayload *)payload
|
||||
forType:(NSString *)type {
|
||||
|
||||
LOGI(@"PushKit : incoming voip notfication: %@", payload.dictionaryPayload);
|
||||
#ifdef __IPHONE_11_0
|
||||
- (void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(PKPushType)type withCompletionHandler:(void (^)(void))completion {
|
||||
#else
|
||||
- (void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(NSString *)type {
|
||||
#endif
|
||||
[LinphoneManager.instance setupNetworkReachabilityCallback];
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
[self processRemoteNotification:payload.dictionaryPayload];
|
||||
});
|
||||
}
|
||||
|
||||
- (void)pushRegistry:(PKPushRegistry *)registry
|
||||
didUpdatePushCredentials:(PKPushCredentials *)credentials
|
||||
forType:(PKPushType)type {
|
||||
LOGI(@"PushKit credentials updated");
|
||||
LOGI(@"voip token: %@", (credentials.token));
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
[LinphoneManager.instance setPushNotificationToken:credentials.token];
|
||||
});
|
||||
//to avoid IOS to suspend the app before being able to launch long running task
|
||||
[self processRemoteNotification:payload.dictionaryPayload];
|
||||
#ifdef __IPHONE_11_0
|
||||
dispatch_async(dispatch_get_main_queue(), ^{completion();});
|
||||
#endif
|
||||
}
|
||||
|
||||
#pragma mark - UNUserNotifications Framework
|
||||
|
|
@ -864,11 +848,11 @@ didInvalidatePushTokenForType:(NSString *)type {
|
|||
UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Success", nil)
|
||||
message:NSLocalizedString(@"Remote configuration successfully fetched and applied.", nil)
|
||||
preferredStyle:UIAlertControllerStyleAlert];
|
||||
|
||||
|
||||
UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil)
|
||||
style:UIAlertActionStyleDefault
|
||||
handler:^(UIAlertAction * action) {}];
|
||||
|
||||
|
||||
[errView addAction:defaultAction];
|
||||
[PhoneMainView.instance presentViewController:errView animated:YES completion:nil];
|
||||
|
||||
|
|
@ -880,11 +864,11 @@ didInvalidatePushTokenForType:(NSString *)type {
|
|||
UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Failure", nil)
|
||||
message:NSLocalizedString(@"Failed configuring from the specified URL.", nil)
|
||||
preferredStyle:UIAlertControllerStyleAlert];
|
||||
|
||||
|
||||
UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil)
|
||||
style:UIAlertActionStyleDefault
|
||||
handler:^(UIAlertAction * action) {}];
|
||||
|
||||
|
||||
[errView addAction:defaultAction];
|
||||
[PhoneMainView.instance presentViewController:errView animated:YES completion:nil];
|
||||
}
|
||||
|
|
@ -894,13 +878,13 @@ didInvalidatePushTokenForType:(NSString *)type {
|
|||
_waitingIndicator = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Fetching remote configuration...", nil)
|
||||
message:@""
|
||||
preferredStyle:UIAlertControllerStyleAlert];
|
||||
|
||||
|
||||
UIActivityIndicatorView *progress = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(125, 60, 30, 30)];
|
||||
progress.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge;
|
||||
|
||||
|
||||
[_waitingIndicator setValue:progress forKey:@"accessoryView"];
|
||||
[progress setColor:[UIColor blackColor]];
|
||||
|
||||
|
||||
[progress startAnimating];
|
||||
[PhoneMainView.instance presentViewController:_waitingIndicator animated:YES completion:nil];
|
||||
}
|
||||
|
|
|
|||
|
|
@ -808,14 +808,14 @@
|
|||
|
||||
if ([turn_username length] > 0) {
|
||||
const LinphoneAuthInfo *turnAuthInfo = nil;
|
||||
if ([turn_password length] > 0)
|
||||
if ([turn_password length] > 0){
|
||||
turnAuthInfo = linphone_auth_info_new([turn_username UTF8String], NULL,
|
||||
[turn_password UTF8String], NULL, NULL, NULL);
|
||||
else
|
||||
turnAuthInfo = linphone_core_find_auth_info(LC, NULL, [turn_username UTF8String], NULL);
|
||||
if (turnAuthInfo != NULL)
|
||||
linphone_core_add_auth_info(LC, turnAuthInfo);
|
||||
linphone_nat_policy_set_stun_server_username(LNP, linphone_auth_info_get_username(turnAuthInfo));
|
||||
}else{
|
||||
turnAuthInfo = linphone_core_find_auth_info(LC, NULL, [turn_username UTF8String], NULL);
|
||||
}
|
||||
linphone_nat_policy_set_stun_server_username(LNP, [turn_username UTF8String]);
|
||||
}
|
||||
} else {
|
||||
linphone_nat_policy_enable_stun(LNP, FALSE);
|
||||
|
|
|
|||
|
|
@ -858,6 +858,8 @@ static void linphone_iphone_display_status(struct _LinphoneCore *lc, const char
|
|||
if (state == LinphoneCallConnected && !mCallCenter) {
|
||||
/*only register CT call center CB for connected call*/
|
||||
[self setupGSMInteraction];
|
||||
if (!_bluetoothEnabled)
|
||||
[self setSpeakerEnabled:FALSE];
|
||||
}
|
||||
|
||||
// Post event
|
||||
|
|
@ -1627,7 +1629,7 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach
|
|||
linphone_proxy_config_expires(proxy, 0);
|
||||
}
|
||||
linphone_core_set_network_reachable(theLinphoneCore, true);
|
||||
linphone_core_iterate(theLinphoneCore);
|
||||
[LinphoneManager.instance iterate];
|
||||
LOGI(@"Network connectivity changed to type [%s]", (newConnectivity == wifi ? "wifi" : "wwan"));
|
||||
lm.connectivity = newConnectivity;
|
||||
}
|
||||
|
|
@ -1717,7 +1719,14 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach
|
|||
|
||||
// scheduling loop
|
||||
- (void)iterate {
|
||||
UIBackgroundTaskIdentifier coreIterateTaskId = 0;
|
||||
coreIterateTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
|
||||
LOGW(@"Background task for core iteration launching expired.");
|
||||
[[UIApplication sharedApplication] endBackgroundTask:coreIterateTaskId];
|
||||
}];
|
||||
linphone_core_iterate(theLinphoneCore);
|
||||
if (coreIterateTaskId != UIBackgroundTaskInvalid)
|
||||
[[UIApplication sharedApplication] endBackgroundTask:coreIterateTaskId];
|
||||
}
|
||||
|
||||
- (void)audioSessionInterrupted:(NSNotification *)notification {
|
||||
|
|
@ -1731,6 +1740,9 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach
|
|||
|
||||
/** Should be called once per linphone_core_new() */
|
||||
- (void)finishCoreConfiguration {
|
||||
|
||||
//Force keep alive to workaround push notif on chat message
|
||||
linphone_core_enable_keep_alive(theLinphoneCore, true);
|
||||
|
||||
// get default config from bundle
|
||||
NSString *zrtpSecretsFileName = [LinphoneManager documentFile:@"zrtp_secrets"];
|
||||
|
|
@ -2003,7 +2015,7 @@ void popup_link_account_cb(LinphoneAccountCreator *creator, LinphoneAccountCreat
|
|||
|
||||
/*call iterate once immediately in order to initiate background connections with sip server or remote provisioning
|
||||
* grab, if any */
|
||||
linphone_core_iterate(theLinphoneCore);
|
||||
[self iterate];
|
||||
// start scheduler
|
||||
mIterateTimer =
|
||||
[NSTimer scheduledTimerWithTimeInterval:0.02 target:self selector:@selector(iterate) userInfo:nil repeats:YES];
|
||||
|
|
@ -2236,7 +2248,7 @@ static int comp_call_state_paused(const LinphoneCall *call, const void *param) {
|
|||
proxies = proxies->next;
|
||||
}
|
||||
// force registration update first, then update friend list subscription
|
||||
linphone_core_iterate(theLinphoneCore);
|
||||
[self iterate];
|
||||
}
|
||||
|
||||
const MSList *lists = linphone_core_get_friends_lists(LC);
|
||||
|
|
@ -2266,28 +2278,6 @@ static int comp_call_state_paused(const LinphoneCall *call, const void *param) {
|
|||
}
|
||||
|
||||
if ([LinphoneManager.instance lpConfigBoolForKey:@"backgroundmode_preference"]) {
|
||||
// register keepalive
|
||||
if ([[UIApplication sharedApplication]
|
||||
setKeepAliveTimeout:600 /*(NSTimeInterval)linphone_proxy_config_get_expires(proxyCfg)*/
|
||||
handler:^{
|
||||
LOGW(@"keepalive handler");
|
||||
mLastKeepAliveDate = [NSDate date];
|
||||
if (theLinphoneCore == nil) {
|
||||
LOGW(@"It seems that Linphone BG mode was deactivated, just skipping");
|
||||
return;
|
||||
}
|
||||
[_iapManager check];
|
||||
if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max) {
|
||||
// For registration register
|
||||
[self refreshRegisters];
|
||||
}
|
||||
linphone_core_iterate(theLinphoneCore);
|
||||
}]) {
|
||||
|
||||
LOGI(@"keepalive handler succesfully registered");
|
||||
} else {
|
||||
LOGI(@"keepalive handler cannot be registered");
|
||||
}
|
||||
shouldEnterBgMode = TRUE;
|
||||
}
|
||||
}
|
||||
|
|
@ -2306,7 +2296,7 @@ static int comp_call_state_paused(const LinphoneCall *call, const void *param) {
|
|||
/*stop the video preview*/
|
||||
if (theLinphoneCore) {
|
||||
linphone_core_enable_video_preview(theLinphoneCore, FALSE);
|
||||
linphone_core_iterate(theLinphoneCore);
|
||||
[self iterate];
|
||||
}
|
||||
linphone_core_stop_dtmf_stream(theLinphoneCore);
|
||||
|
||||
|
|
|
|||
|
|
@ -1,9 +1,13 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="9531" systemVersion="15D21" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none">
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useSafeAreas="YES" colorMatched="YES">
|
||||
<device id="retina4_7" orientation="portrait">
|
||||
<adaptation id="fullscreen"/>
|
||||
</device>
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<development version="6000" identifier="xcode"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9529"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/>
|
||||
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="UICompositeView">
|
||||
|
|
@ -23,73 +27,72 @@
|
|||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
|
||||
<subviews>
|
||||
<view autoresizesSubviews="NO" tag="5" contentMode="scaleToFill" id="UhA-h1-Cu8" userLabel="detailsView">
|
||||
<view autoresizesSubviews="NO" tag="5" contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="UhA-h1-Cu8" userLabel="detailsView">
|
||||
<rect key="frame" x="187" y="42" width="187" height="559"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<gestureRecognizers/>
|
||||
</view>
|
||||
<view autoresizesSubviews="NO" tag="1" contentMode="scaleToFill" id="15" userLabel="mainView">
|
||||
<view autoresizesSubviews="NO" tag="1" contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="15" userLabel="mainView">
|
||||
<rect key="frame" x="0.0" y="42" width="188" height="559"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<gestureRecognizers/>
|
||||
<connections>
|
||||
<outletCollection property="gestureRecognizers" destination="40" appends="YES" id="41"/>
|
||||
</connections>
|
||||
</view>
|
||||
<view autoresizesSubviews="NO" tag="3" contentMode="scaleToFill" id="16" userLabel="tabBar">
|
||||
<view autoresizesSubviews="NO" tag="3" contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="16" userLabel="tabBar">
|
||||
<rect key="frame" x="0.0" y="601" width="375" height="66"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
</view>
|
||||
<view clearsContextBeforeDrawing="NO" tag="4" contentMode="scaleToFill" id="26" userLabel="sideMenuView">
|
||||
<view clearsContextBeforeDrawing="NO" tag="4" contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="26" userLabel="sideMenuView">
|
||||
<rect key="frame" x="-375" y="42" width="375" height="625"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES" heightSizable="YES"/>
|
||||
</view>
|
||||
<view autoresizesSubviews="NO" tag="2" contentMode="scaleToFill" id="14" userLabel="statusBar">
|
||||
<view autoresizesSubviews="NO" tag="2" contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="14" userLabel="statusBar">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="42"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
</view>
|
||||
</subviews>
|
||||
<nil key="simulatedStatusBarMetrics"/>
|
||||
<simulatedScreenMetrics key="simulatedDestinationMetrics" type="retina47"/>
|
||||
<viewLayoutGuide key="safeArea" id="JWS-o5-QR7"/>
|
||||
<point key="canvasLocation" x="-96.5" y="-25.5"/>
|
||||
</view>
|
||||
<view contentMode="scaleToFill" id="20" userLabel="Landscape View">
|
||||
<rect key="frame" x="0.0" y="0.0" width="667" height="375"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
|
||||
<subviews>
|
||||
<view autoresizesSubviews="NO" tag="5" contentMode="scaleToFill" id="Vgs-Nv-m9Q" userLabel="detailsView">
|
||||
<view autoresizesSubviews="NO" tag="5" contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Vgs-Nv-m9Q" userLabel="detailsView">
|
||||
<rect key="frame" x="379" y="42" width="288" height="333"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxX="YES" heightSizable="YES" flexibleMaxY="YES"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
</view>
|
||||
<view autoresizesSubviews="NO" tag="1" contentMode="scaleToFill" id="23" userLabel="mainView">
|
||||
<view autoresizesSubviews="NO" tag="1" contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="23" userLabel="mainView">
|
||||
<rect key="frame" x="90" y="42" width="289" height="333"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxX="YES" heightSizable="YES" flexibleMaxY="YES"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
</view>
|
||||
<view autoresizesSubviews="NO" tag="3" contentMode="scaleToFill" id="21" userLabel="tabBar">
|
||||
<view autoresizesSubviews="NO" tag="3" contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="21" userLabel="tabBar">
|
||||
<rect key="frame" x="0.0" y="42" width="90" height="333"/>
|
||||
<autoresizingMask key="autoresizingMask" heightSizable="YES" flexibleMaxY="YES"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
</view>
|
||||
<view clearsContextBeforeDrawing="NO" tag="4" contentMode="scaleToFill" id="JXU-o0-1po" userLabel="sideMenuView">
|
||||
<view clearsContextBeforeDrawing="NO" tag="4" contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="JXU-o0-1po" userLabel="sideMenuView">
|
||||
<rect key="frame" x="0.0" y="42" width="667" height="333"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES" flexibleMaxY="YES"/>
|
||||
</view>
|
||||
<view autoresizesSubviews="NO" tag="2" contentMode="scaleToFill" id="22" userLabel="statusBar">
|
||||
<view autoresizesSubviews="NO" tag="2" contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="22" userLabel="statusBar">
|
||||
<rect key="frame" x="0.0" y="0.0" width="667" height="42"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
</view>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<nil key="simulatedStatusBarMetrics"/>
|
||||
<simulatedOrientationMetrics key="simulatedOrientationMetrics" orientation="landscapeRight"/>
|
||||
<simulatedScreenMetrics key="simulatedDestinationMetrics" type="retina47"/>
|
||||
<viewLayoutGuide key="safeArea" id="M2K-Ww-Tkq"/>
|
||||
<point key="canvasLocation" x="452.5" y="-106.5"/>
|
||||
</view>
|
||||
<swipeGestureRecognizer direction="right" id="40">
|
||||
|
|
|
|||
|
|
@ -387,7 +387,9 @@
|
|||
return UIInterfaceOrientationPortrait;
|
||||
}
|
||||
|
||||
#define IPHONE_STATUSBAR_HEIGHT 20
|
||||
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
|
||||
#define IS_IPHONE_X (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 812.0)
|
||||
#define IPHONE_STATUSBAR_HEIGHT (IS_IPHONE_X ? 35 : 20)
|
||||
|
||||
- (void)update:(UICompositeViewDescription *)description
|
||||
tabBar:(NSNumber *)tabBar
|
||||
|
|
@ -571,6 +573,7 @@
|
|||
// Compute frame for each elements
|
||||
CGRect viewFrame = self.view.frame;
|
||||
int origin = currentViewDescription.fullscreen ? 0 : IPHONE_STATUSBAR_HEIGHT;
|
||||
|
||||
|
||||
// 1. status bar - fixed size on top
|
||||
CGRect statusBarFrame = self.statusBarView.frame;
|
||||
|
|
|
|||
|
|
@ -58,7 +58,7 @@ INIT_WITH_COMMON_CF {
|
|||
|
||||
if (!linphone_core_video_display_enabled(LC))
|
||||
return;
|
||||
|
||||
[LinphoneManager.instance setSpeakerEnabled:FALSE];
|
||||
[self setEnabled:FALSE];
|
||||
[waitView startAnimating];
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,12 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="7706" systemVersion="14F1021" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none" initialViewController="eUP-Pz-8te">
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none" colorMatched="YES" initialViewController="eUP-Pz-8te">
|
||||
<device id="ipad9_7" orientation="portrait">
|
||||
<adaptation id="fullscreen"/>
|
||||
</device>
|
||||
<dependencies>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7703"/>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<scenes>
|
||||
<!--Phone Main View-->
|
||||
|
|
@ -15,15 +20,15 @@
|
|||
<view tag="1" contentMode="scaleToFill" id="rUw-rG-KgP" userLabel="background">
|
||||
<rect key="frame" x="0.0" y="0.0" width="768" height="1024"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
</view>
|
||||
<view contentMode="scaleToFill" id="rlH-Ra-JOu" userLabel="statusBarBG">
|
||||
<rect key="frame" x="0.0" y="0.0" width="768" height="20"/>
|
||||
<view contentMode="scaleToFill" misplaced="YES" id="rlH-Ra-JOu" userLabel="statusBarBG">
|
||||
<rect key="frame" x="0.0" y="0.0" width="768" height="35"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
|
||||
<color key="backgroundColor" cocoaTouchSystemColor="darkTextColor"/>
|
||||
</view>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
</view>
|
||||
<connections>
|
||||
<outlet property="mainViewController" destination="emC-P9-oZj" id="goX-7a-wOn"/>
|
||||
|
|
@ -39,9 +44,4 @@
|
|||
<point key="canvasLocation" x="342" y="73"/>
|
||||
</scene>
|
||||
</scenes>
|
||||
<simulatedMetricsContainer key="defaultSimulatedMetrics">
|
||||
<simulatedStatusBarMetrics key="statusBar"/>
|
||||
<simulatedOrientationMetrics key="orientation"/>
|
||||
<simulatedScreenMetrics key="destination"/>
|
||||
</simulatedMetricsContainer>
|
||||
</document>
|
||||
|
|
|
|||
|
|
@ -111,6 +111,8 @@
|
|||
- (void)createChatRoomWithSubject:(const char *)subject addresses:(bctbx_list_t *)addresses andWaitView:(UIView *)waitView;
|
||||
+ (PhoneMainView*) instance;
|
||||
|
||||
- (BOOL)isIphoneXDevice;
|
||||
|
||||
@end
|
||||
|
||||
void main_view_chat_room_state_changed(LinphoneChatRoom *cr, LinphoneChatRoomState newState);
|
||||
|
|
|
|||
|
|
@ -202,11 +202,33 @@ static RootViewManager *rootViewManagerInstance = nil;
|
|||
- (void)viewWillDisappear:(BOOL)animated {
|
||||
[super viewWillDisappear:animated];
|
||||
[NSNotificationCenter.defaultCenter removeObserver:self];
|
||||
[NSNotificationCenter.defaultCenter removeObserver:self name:UIDeviceBatteryLevelDidChangeNotification object:nil];
|
||||
[[UIDevice currentDevice] setBatteryMonitoringEnabled:NO];
|
||||
}
|
||||
|
||||
/* IPHONE X specific : hide the HomeIndcator when not used */
|
||||
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
|
||||
#define IS_IPHONE_X (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 812.0)
|
||||
#define IPHONE_STATUSBAR_HEIGHT (IS_IPHONE_X ? 35 : 20)
|
||||
|
||||
- (BOOL)isIphoneXDevice{
|
||||
return IS_IPHONE_X;
|
||||
}
|
||||
|
||||
- (void)viewDidAppear:(BOOL)animated {
|
||||
[super viewDidAppear:animated];
|
||||
if([self isIphoneXDevice]){
|
||||
if(@available(iOS 11.0, *)) {
|
||||
[self childViewControllerForHomeIndicatorAutoHidden];
|
||||
[self prefersHomeIndicatorAutoHidden];
|
||||
[self setNeedsUpdateOfHomeIndicatorAutoHidden];
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
- (BOOL)prefersHomeIndicatorAutoHidden{
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (void)setVolumeHidden:(BOOL)hidden {
|
||||
|
|
@ -486,7 +508,7 @@ static RootViewManager *rootViewManagerInstance = nil;
|
|||
- (void)startUp {
|
||||
@try {
|
||||
LinphoneManager *lm = LinphoneManager.instance;
|
||||
LOGE(@"%s", linphone_global_state_to_string(
|
||||
LOGI(@"%s", linphone_global_state_to_string(
|
||||
linphone_core_get_global_state(LC)));
|
||||
if (linphone_core_get_global_state(LC) != LinphoneGlobalOn) {
|
||||
[self changeCurrentView:DialerView.compositeViewDescription];
|
||||
|
|
|
|||
|
|
@ -89,12 +89,11 @@
|
|||
completion:^(NSError *error) {
|
||||
if (error) {
|
||||
LOGE(@"CallKit: cannot complete incoming call from [%@] caused by [%@]",handle,[error localizedDescription]);
|
||||
if ( [error code] == CXErrorCodeIncomingCallErrorFilteredByDoNotDisturb
|
||||
|| [error code] == CXErrorCodeIncomingCallErrorFilteredByBlockList) {
|
||||
if ([error code] == CXErrorCodeIncomingCallErrorFilteredByDoNotDisturb ||
|
||||
[error code] == CXErrorCodeIncomingCallErrorFilteredByBlockList)
|
||||
linphone_call_decline(call,LinphoneReasonBusy); /*to give a chance for other devices to answer*/
|
||||
} else {
|
||||
else
|
||||
linphone_call_decline(call,LinphoneReasonUnknown);
|
||||
}
|
||||
}
|
||||
linphone_call_unref(call);
|
||||
}];
|
||||
|
|
|
|||
|
|
@ -129,7 +129,8 @@
|
|||
}
|
||||
|
||||
- (void) fetchContactsInBackGroundThread{
|
||||
|
||||
[_addressBookMap removeAllObjects];
|
||||
_addressBookMap = [NSMutableDictionary dictionary];
|
||||
CNEntityType entityType = CNEntityTypeContacts;
|
||||
[store requestAccessForEntityType:entityType completionHandler:^(BOOL granted, NSError *_Nullable error) {
|
||||
BOOL success = FALSE;
|
||||
|
|
@ -204,9 +205,7 @@
|
|||
}else{
|
||||
// Dosomte
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
if (normalizedPhone)
|
||||
ms_free(normalizedPhone);
|
||||
|
|
@ -293,9 +292,6 @@
|
|||
return ret;
|
||||
}
|
||||
|
||||
- (BOOL)deleteContact:(Contact *)contact {
|
||||
return [self deleteCNContact:contact.person];
|
||||
}
|
||||
|
||||
- (CNContact *)getCNContactFromContact:(Contact *)acontact {
|
||||
NSArray *keysToFetch = @[
|
||||
|
|
@ -312,20 +308,47 @@
|
|||
}
|
||||
|
||||
- (BOOL)deleteCNContact:(CNContact *)contact {
|
||||
return TRUE;//[self deleteContact:] ;
|
||||
}
|
||||
|
||||
- (BOOL)deleteContact:(Contact *)contact {
|
||||
CNSaveRequest *saveRequest = [[CNSaveRequest alloc] init];
|
||||
[saveRequest deleteContact:[contact mutableCopy]];
|
||||
@try {
|
||||
BOOL success = [store executeSaveRequest:saveRequest error:nil];
|
||||
NSLog(@"Success %d", success);
|
||||
if(success)
|
||||
[self fetchContactsInBackGroundThread];
|
||||
} @catch (NSException *exception) {
|
||||
NSLog(@"description = %@", [exception description]);
|
||||
return FALSE;
|
||||
NSArray *keysToFetch = @[
|
||||
CNContactEmailAddressesKey, CNContactPhoneNumbersKey,
|
||||
CNContactInstantMessageAddressesKey, CNInstantMessageAddressUsernameKey,
|
||||
CNContactFamilyNameKey, CNContactGivenNameKey, CNContactPostalAddressesKey,
|
||||
CNContactIdentifierKey, CNContactImageDataKey, CNContactNicknameKey
|
||||
];
|
||||
CNMutableContact *mCNContact =
|
||||
[[store unifiedContactWithIdentifier:contact.identifier
|
||||
keysToFetch:keysToFetch
|
||||
error:nil] mutableCopy];
|
||||
if(mCNContact != nil){
|
||||
[saveRequest deleteContact:mCNContact];
|
||||
@try {
|
||||
BOOL success = [store executeSaveRequest:saveRequest error:nil];
|
||||
NSLog(@"Success %d", success);
|
||||
[self removeFriend:contact ];
|
||||
[LinphoneManager.instance setContactsUpdated:TRUE];
|
||||
if([contact.sipAddresses count] > 0){
|
||||
for (NSString *sip in contact.sipAddresses) {
|
||||
[_addressBookMap removeObjectForKey:([FastAddressBook normalizeSipURI:sip] ?: sip)];
|
||||
}
|
||||
}
|
||||
if([contact.phones count] > 0){
|
||||
for (NSString *phone in contact.phones) {
|
||||
[_addressBookMap removeObjectForKey:([FastAddressBook normalizeSipURI:phone] ?: phone)];
|
||||
}
|
||||
}
|
||||
} @catch (NSException *exception) {
|
||||
NSLog(@"description = %@", [exception description]);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
- (BOOL)deleteAllContacts {
|
||||
NSArray *keys = @[ CNContactPhoneNumbersKey ];
|
||||
NSString *containerId = store.defaultContainerIdentifier;
|
||||
|
|
@ -416,4 +439,16 @@
|
|||
lists = lists->next;
|
||||
}
|
||||
}
|
||||
|
||||
-(void)removeFriend:(Contact*) contact{
|
||||
BOOL enabled = [LinphoneManager.instance lpConfigBoolForKey:@"use_rls_presence"];
|
||||
const MSList *lists = linphone_core_get_friends_lists(LC);
|
||||
while (lists) {
|
||||
linphone_friend_list_remove_friend(lists->data, contact.friend);
|
||||
linphone_friend_list_enable_subscriptions(lists->data, FALSE);
|
||||
linphone_friend_list_enable_subscriptions(lists->data, enabled);
|
||||
linphone_friend_list_update_subscriptions(lists->data);
|
||||
lists = lists->next;
|
||||
}
|
||||
}
|
||||
@end
|
||||
|
|
|
|||
|
|
@ -234,6 +234,7 @@ CGRect IASKCGRectSwap(CGRect rect);
|
|||
|
||||
- (void)viewDidDisappear:(BOOL)animated {
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationWillTerminateNotification object:[UIApplication sharedApplication]];
|
||||
|
||||
// hide the keyboard
|
||||
[self.currentFirstResponder resignFirstResponder];
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -8,6 +8,11 @@ hide_assistant_custom_account=0
|
|||
#Hide in the assistant the button to create a new SIP account
|
||||
hide_assistant_create_account=0
|
||||
|
||||
#Hide in the assistant the logo
|
||||
show_assistant_logo_in_choice_view_preference=0
|
||||
|
||||
#Hide in the assistant the button to fetch a remote configuration
|
||||
show_remote_provisioning_in_assistant=0
|
||||
|
||||
#contact_display_username_only=1
|
||||
#contact_filter_on_default_domain=1
|
||||
|
|
@ -31,6 +36,8 @@ sip_random_port=0
|
|||
store_ha1_passwd=0
|
||||
deliver_imdn=1
|
||||
linphone_specs=groupchat
|
||||
#to avoid app to not detect broken sockets when in long running task.
|
||||
tcp_tls_keepalive=30000
|
||||
|
||||
[misc]
|
||||
#by default it is set to 30 by liblinphone
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -24,7 +24,7 @@
|
|||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>3.16.5</string>
|
||||
<string>3.16.6</string>
|
||||
<key>CFBundleURLTypes</key>
|
||||
<array>
|
||||
<dict>
|
||||
|
|
@ -53,7 +53,7 @@
|
|||
</dict>
|
||||
</array>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>9</string>
|
||||
<string>0</string>
|
||||
<key>ITSAppUsesNonExemptEncryption</key>
|
||||
<true/>
|
||||
<key>ITSEncryptionExportComplianceCode</key>
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@
|
|||
244523B01E8266CC0037A187 /* chat_error.png in Resources */ = {isa = PBXBuildFile; fileRef = 244523AD1E8266CC0037A187 /* chat_error.png */; };
|
||||
244523B11E8266CC0037A187 /* chat_read.png in Resources */ = {isa = PBXBuildFile; fileRef = 244523AE1E8266CC0037A187 /* chat_read.png */; };
|
||||
244523BE1E8D3A6C0037A187 /* chat_unsecure.png in Resources */ = {isa = PBXBuildFile; fileRef = 244523BC1E8D3A6C0037A187 /* chat_unsecure.png */; };
|
||||
249660951FD6A35F001D55AA /* Photos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 249660941FD6A359001D55AA /* Photos.framework */; };
|
||||
24A3459E1D95797700881A5C /* UIShopTableCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 24A3459D1D95797700881A5C /* UIShopTableCell.xib */; };
|
||||
24A345A61D95798A00881A5C /* UIShopTableCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 24A345A51D95798A00881A5C /* UIShopTableCell.m */; };
|
||||
24E1C7C01F9A235600D3F981 /* Contacts.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24E1C7B91F9A235500D3F981 /* Contacts.framework */; };
|
||||
|
|
@ -983,6 +984,7 @@
|
|||
244523AD1E8266CC0037A187 /* chat_error.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_error.png; sourceTree = "<group>"; };
|
||||
244523AE1E8266CC0037A187 /* chat_read.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_read.png; sourceTree = "<group>"; };
|
||||
244523BC1E8D3A6C0037A187 /* chat_unsecure.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_unsecure.png; sourceTree = "<group>"; };
|
||||
249660941FD6A359001D55AA /* Photos.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Photos.framework; path = System/Library/Frameworks/Photos.framework; sourceTree = SDKROOT; };
|
||||
24A3459D1D95797700881A5C /* UIShopTableCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = UIShopTableCell.xib; sourceTree = "<group>"; };
|
||||
24A345A51D95798A00881A5C /* UIShopTableCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIShopTableCell.m; sourceTree = "<group>"; };
|
||||
24A345A71D95799900881A5C /* UIShopTableCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIShopTableCell.h; sourceTree = "<group>"; };
|
||||
|
|
@ -1920,6 +1922,7 @@
|
|||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
249660951FD6A35F001D55AA /* Photos.framework in Frameworks */,
|
||||
24E1C7C01F9A235600D3F981 /* Contacts.framework in Frameworks */,
|
||||
8C5BCED61EB3859300A9AAEF /* mediastreamer_voip.framework in Frameworks */,
|
||||
8C2595DF1DEDCC8E007A6424 /* CallKit.framework in Frameworks */,
|
||||
|
|
@ -2298,6 +2301,7 @@
|
|||
8C1A1F7C1FA331D40064BE00 /* libsoci_sqlite3.a */,
|
||||
8CD0B3C81FA2357B008FEB16 /* libsqlite3.a */,
|
||||
8CD0B3BE1FA22CBA008FEB16 /* libsoci_core.a */,
|
||||
249660941FD6A359001D55AA /* Photos.framework */,
|
||||
24E1C7B91F9A235500D3F981 /* Contacts.framework */,
|
||||
8C3EAA191EB8D9C300B732B6 /* linphonetester.framework */,
|
||||
8C5BCEC61EB3859200A9AAEF /* bctoolbox-tester.framework */,
|
||||
|
|
@ -4656,6 +4660,7 @@
|
|||
"$(SRCROOT)/Classes/Utils/XMLRPC/",
|
||||
);
|
||||
INFOPLIST_FILE = "linphone-Info.plist";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||
LIBRARY_SEARCH_PATHS = "$(BUILT_PRODUCTS_DIR)";
|
||||
LINK_WITH_STANDARD_LIBRARIES = YES;
|
||||
|
|
@ -4754,6 +4759,7 @@
|
|||
"$(SRCROOT)/Classes/Utils/XMLRPC/",
|
||||
);
|
||||
INFOPLIST_FILE = "linphone-Info.plist";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||
LIBRARY_SEARCH_PATHS = "$(BUILT_PRODUCTS_DIR)";
|
||||
LINK_WITH_STANDARD_LIBRARIES = YES;
|
||||
|
|
@ -4852,6 +4858,7 @@
|
|||
"$(SRCROOT)/Classes/Utils/XMLRPC/",
|
||||
);
|
||||
INFOPLIST_FILE = "linphone-Info.plist";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||
LIBRARY_SEARCH_PATHS = "$(BUILT_PRODUCTS_DIR)";
|
||||
LINK_WITH_STANDARD_LIBRARIES = YES;
|
||||
|
|
@ -4950,6 +4957,7 @@
|
|||
"$(SRCROOT)/Classes/Utils/XMLRPC/",
|
||||
);
|
||||
INFOPLIST_FILE = "linphone-Info.plist";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||
LIBRARY_SEARCH_PATHS = "$(BUILT_PRODUCTS_DIR)";
|
||||
LINK_WITH_STANDARD_LIBRARIES = YES;
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
Subproject commit 8bf53c5cd816c37e008bcceb67cab9527505a9b9
|
||||
Subproject commit 8a1d19db312444b0288db7dd62119c982d8beb1e
|
||||
|
|
@ -1 +1 @@
|
|||
Subproject commit cf1aaa36c5738c25e59c8fafbade388a0081cd53
|
||||
Subproject commit d8d2f4b40209e06b400f893cce58e4c6ba73341d
|
||||
|
|
@ -1 +1 @@
|
|||
Subproject commit 7524da1a0548af6ee11ea910858af322161207c4
|
||||
Subproject commit b9e1951be4575c62e326d761a7f7c79c5cce9cb9
|
||||
|
|
@ -1 +1 @@
|
|||
Subproject commit fdce52526089e88c98f19b0d36483cc3d31ef9bd
|
||||
Subproject commit 9364d69fb16b058066a129f993558d764a6836cf
|
||||
|
|
@ -1 +1 @@
|
|||
Subproject commit 49a0bb2c0237237fc1b4213918dc9032817b25f1
|
||||
Subproject commit 37adaa0536432149a51332d8eb04973a3ba6bac9
|
||||
|
|
@ -1 +1 @@
|
|||
Subproject commit 96d053faca4a35bfd27eef64a081c0a193c97735
|
||||
Subproject commit 5bbb321ae4cf522086220efd54bff31f8742f1d1
|
||||
|
|
@ -1 +1 @@
|
|||
Subproject commit 918b217f9907cccab2d5be39649b3dab5b02ed38
|
||||
Subproject commit 7c9d810eeb8ddb024be426c00e10c71f13329f43
|
||||
|
|
@ -1 +1 @@
|
|||
Subproject commit f82450663f3d89aa6aa4dc4bae7d060b3a5be495
|
||||
Subproject commit 3555dbbdd2119d083166ca65ef7360b0c894268d
|
||||
Loading…
Add table
Reference in a new issue