Compare commits

...

27 Commits

Author SHA1 Message Date
Andrea Busi bdfcb7a5c4 release: Increase version for release 2023-09-14 17:02:58 +02:00
Andrea Busi 40fcb4707f fix: Be sure to download updated data when country is changed 2023-09-14 17:02:17 +02:00
Andrea Busi 37f9a856b1 feat: Filter modify notification settings by default 2023-09-14 17:02:17 +02:00
Andrea Busi f42b9f1b53 refactor: Migrate some UserDefaults constants 2023-09-14 17:02:17 +02:00
Andrea Busi 4fd9966435 release: Update changelog 2023-09-14 17:02:17 +02:00
Andrea Busi df2c0a94a4 refactor: Remove unused import 2023-09-14 17:02:17 +02:00
Andrea Busi cdd1a8d875 refactor: Remove deprecated method, useless with new BGTask implementation 2023-09-14 17:02:17 +02:00
Andrea Busi 31f1cb5f35 refactor: Can enable/disable background position debug 2023-09-14 17:02:17 +02:00
Andrea Busi d426f15c8e refactor: Remove deprecated code 2023-09-14 17:02:17 +02:00
Andrea Busi 037a74061d feat: Perform WS request to upload user position 2023-09-14 17:02:17 +02:00
Andrea Busi ea6172226d feat: Add a debug screen for saved background positions 2023-09-11 15:52:27 +02:00
Andrea Busi ec94db29b9 feat: Add background task to get user location 2023-09-11 15:52:27 +02:00
Andrea Busi 91a9bce03c release: Update changelog 2023-08-16 12:03:09 +02:00
Andrea Busi f54f4a2312 refactor: Remove no longer needed available checks 2023-08-16 12:02:32 +02:00
Andrea Busi a959df7cd9 dependency: Update Pods & SPM 2023-08-16 12:02:18 +02:00
Andrea Busi e95a93ff2c feat: Increase target to iOS 13 2023-08-16 11:57:49 +02:00
Andrea Busi b7c1f7379d refactor: Migrate some user default constants 2023-08-16 11:54:52 +02:00
Andrea Busi 0f71e0fea9 refactor: Disable monitoring background logic 2023-08-14 16:33:54 +02:00
Andrea Busi 92de4c534c release: Increase version for release 2023-08-10 16:50:50 +02:00
Andrea Busi 3c237c5b18 docs: Add push payload for AR 2023-08-10 16:17:38 +02:00
Andrea Busi 16dc2410bc fix: Get user location if manager one is null 2023-08-10 15:58:59 +02:00
Andrea Busi 3c83cb97cb release: Increase version for release 2023-08-04 16:20:13 +02:00
Andrea Busi 4796e3d5a7 fix: Update AR string 2023-08-04 16:09:08 +02:00
Andrea Busi 56f53550da release: Increase version for release 2023-07-31 07:19:45 +02:00
Andrea Busi d52b980959 release: Increase version for release 2023-07-27 17:35:16 +02:00
Andrea Busi b9f87c130d fix: Add missing AR strings 2023-07-27 17:35:16 +02:00
Andrea Busi b7acbc70df feat: Add arabic language 2023-07-27 17:35:09 +02:00
31 changed files with 1160 additions and 282 deletions
+8 -2
View File
@@ -1,5 +1,13 @@
# Changelog
## Versione 5.7
- Aumentato target ad iOS 13
- Disattivata logica calibrazione/monitoraggio
- Aggiunto invio posizione in background
## Versione 5.6
- Aggiunta lingua araba
## Versione 5.5
- Aggiornata integrazione Firebase
@@ -13,8 +21,6 @@
- Rivista gestione notifiche push allerte
- Migrate costanti in nuova struttura Swift
## Versione 5.4
- Aggiunto SDK Facebook
@@ -0,0 +1,34 @@
{
"Simulator Target Bundle": "com.finazzi.distquake",
"aps": {
"alert": {
"loc-args": [
"14 km Al Qunfudhah"
],
"loc-key": "Rilevato sisma forte a",
"title-loc-key": "Allerta sismica in tempo reale"
},
"category": "notifica_con_mappa",
"content-available": 1,
"mutable-content": 1,
"sound": "alert_star_trek.wav"
},
"counter": 10,
"datetime": "2023-08-10 15:57:00",
"delay": 4,
"detection_latitude": "18.65",
"detection_longitude": "42.76",
"gcm.message_id": "1614708857742608",
"google.c.a.e": 1,
"google.c.sender.id": "899482329945",
"intensity": 2,
"latitude": "18.65",
"location": "14 km Al Qunfudhah",
"longitude": "42.76",
"peak": "1.2",
"randcode": 100,
"test": 0,
"type": "eqn",
"wave_speed": "4.7",
"critical": true
}
@@ -10,11 +10,12 @@
6502470D2A612E4A001AC512 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6502470C2A612E4A001AC512 /* Constants.swift */; };
6502470E2A6136F0001AC512 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6502470C2A612E4A001AC512 /* Constants.swift */; };
6502470F2A613AD7001AC512 /* EQNUserData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65CB83422915720400EE1E35 /* EQNUserData.swift */; };
650247122A61832F001AC512 /* EQNDebugHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 650247112A61832F001AC512 /* EQNDebugHelper.swift */; };
650247122A61832F001AC512 /* EQNBackgroundPositionDebugHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 650247112A61832F001AC512 /* EQNBackgroundPositionDebugHelper.swift */; };
650247152A618D7F001AC512 /* Foundation+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 650247142A618D7F001AC512 /* Foundation+Extensions.swift */; };
650B23AB2632CCD3007AE752 /* UIView+EQNExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 650B23AA2632CCD3007AE752 /* UIView+EQNExtensions.swift */; };
651901B925F5358700CAFF20 /* EQNMapAnnotationSeismic.swift in Sources */ = {isa = PBXBuildFile; fileRef = 651901B825F5358700CAFF20 /* EQNMapAnnotationSeismic.swift */; };
6525A82625E13FD4008FE0D0 /* SeismicNetworkAdvertiseTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6525A82525E13FD4008FE0D0 /* SeismicNetworkAdvertiseTableViewCell.swift */; };
652A3C6B2A8A757800719796 /* EQNBackgrounPositionDebugViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 652A3C6A2A8A757800719796 /* EQNBackgrounPositionDebugViewController.swift */; };
652C37BD26092B3C0068EC3B /* FiltersViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 652C37BC26092B3C0068EC3B /* FiltersViewModel.swift */; };
65355FFF25F38D3300BB57D2 /* SegnalazioniMapViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65355FFE25F38D3300BB57D2 /* SegnalazioniMapViewController.swift */; };
653604E9262348FA00B2B651 /* EQNBaseMapFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 653604E8262348FA00B2B651 /* EQNBaseMapFilter.swift */; };
@@ -28,11 +29,13 @@
654D18D625F9420500BB6DB0 /* EQNMapAnnotationPastquake.swift in Sources */ = {isa = PBXBuildFile; fileRef = 654D18C825F93CD700BB6DB0 /* EQNMapAnnotationPastquake.swift */; };
654D18DA25F9424700BB6DB0 /* EQNUtility+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCF0188E252F09C500C783F0 /* EQNUtility+Extensions.swift */; };
654D18DE25F943E200BB6DB0 /* EQNMapAnnotationUserReport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 653C67FB25F3D63500FE52AC /* EQNMapAnnotationUserReport.swift */; };
65506C052A8F950000AB6448 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 65506C042A8F94FF00AB6448 /* CoreLocation.framework */; };
6552C13829262119008E723C /* Shogun in Frameworks */ = {isa = PBXBuildFile; productRef = 6552C13729262119008E723C /* Shogun */; };
6552C13A2926261D008E723C /* Shogun in Frameworks */ = {isa = PBXBuildFile; productRef = 6552C1392926261D008E723C /* Shogun */; };
6552C1462926DBA1008E723C /* AppPreferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6552C1452926DBA1008E723C /* AppPreferences.swift */; };
65583A05261B83BE00ECA9F9 /* UIKit+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65583A04261B83BE00ECA9F9 /* UIKit+Extensions.swift */; };
6562C80725FFA6B100C85273 /* SeismicNetworkViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6562C80625FFA6B100C85273 /* SeismicNetworkViewModel.swift */; };
6563DAA42AAF515F0072D309 /* BackgroundTaskIdentifiable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6563DAA32AAF515F0072D309 /* BackgroundTaskIdentifiable.swift */; };
656EB9362A15FD16009DADF3 /* Localizable.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = 656EB9382A15FD16009DADF3 /* Localizable.stringsdict */; };
656EB9412A16288A009DADF3 /* Localizable.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = 656EB9382A15FD16009DADF3 /* Localizable.stringsdict */; };
6586971125F44C26009C0182 /* EQNBlurredCloseButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6586971025F44C26009C0182 /* EQNBlurredCloseButton.swift */; };
@@ -43,6 +46,8 @@
65BBB22C26064BE6005D6CDF /* SegnalazioniLast24HoursCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65BBB22B26064BE6005D6CDF /* SegnalazioniLast24HoursCell.swift */; };
65CB83432915720400EE1E35 /* EQNUserData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65CB83422915720400EE1E35 /* EQNUserData.swift */; };
65D409942619BA34008CF356 /* SegnalazioniSendReportCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65D409932619BA34008CF356 /* SegnalazioniSendReportCell.swift */; };
65D507DB2A852274005BDC57 /* EQNUserData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65CB83422915720400EE1E35 /* EQNUserData.swift */; };
65D507DC2A85227F005BDC57 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6502470C2A612E4A001AC512 /* Constants.swift */; };
65D9938A29219DEC00F2B0EB /* UIKit+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65583A04261B83BE00ECA9F9 /* UIKit+Extensions.swift */; };
65D9938C2922647800F2B0EB /* AppTheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC52B8A424FCCD6900ABEBA6 /* AppTheme.swift */; };
65DBFB4B25E29DD60041CBA6 /* SeismicNetworksMapDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65DBFB4A25E29DD60041CBA6 /* SeismicNetworksMapDetailViewController.swift */; };
@@ -51,6 +56,9 @@
65DBFB7625E2BBF20041CBA6 /* GADTTemplateView.m in Sources */ = {isa = PBXBuildFile; fileRef = 65DBFB7225E2BBF20041CBA6 /* GADTTemplateView.m */; };
65EA58802A60269C0038EE9D /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 8C10B0BD2281FE7F00125C9F /* Localizable.strings */; };
65EA58822A60360D0038EE9D /* EQNRealtimePushNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65EA58812A60360D0038EE9D /* EQNRealtimePushNotification.swift */; };
65F9B49C2A8CA22800F13260 /* BackgroundTaskManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65F9B49B2A8CA22800F13260 /* BackgroundTaskManager.swift */; };
65F9B49E2A8CA2AC00F13260 /* EQNBackgroundPosition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65F9B49D2A8CA2AC00F13260 /* EQNBackgroundPosition.swift */; };
65F9B4A02A8CC58200F13260 /* UpdateUserLocationTask.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65F9B49F2A8CC58200F13260 /* UpdateUserLocationTask.swift */; };
65FFDC95292F672B00EA821B /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65FFDC94292F672B00EA821B /* NotificationService.swift */; };
65FFDC99292F672B00EA821B /* EQNNotificationService.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 65FFDC92292F672B00EA821B /* EQNNotificationService.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
65FFDC9E292F682600EA821B /* Shogun in Frameworks */ = {isa = PBXBuildFile; productRef = 65FFDC9D292F682600EA821B /* Shogun */; };
@@ -294,11 +302,12 @@
25A8BFFE29D46740E8A8A7A3 /* Pods_Earthquake_Network.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Earthquake_Network.framework; sourceTree = BUILT_PRODUCTS_DIR; };
40CD2E5581CF2FA3D52F392D /* Pods-Earthquake Network.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Earthquake Network.release.xcconfig"; path = "Pods/Target Support Files/Pods-Earthquake Network/Pods-Earthquake Network.release.xcconfig"; sourceTree = "<group>"; };
6502470C2A612E4A001AC512 /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = "<group>"; };
650247112A61832F001AC512 /* EQNDebugHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EQNDebugHelper.swift; sourceTree = "<group>"; };
650247112A61832F001AC512 /* EQNBackgroundPositionDebugHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EQNBackgroundPositionDebugHelper.swift; sourceTree = "<group>"; };
650247142A618D7F001AC512 /* Foundation+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Foundation+Extensions.swift"; sourceTree = "<group>"; };
650B23AA2632CCD3007AE752 /* UIView+EQNExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+EQNExtensions.swift"; sourceTree = "<group>"; };
651901B825F5358700CAFF20 /* EQNMapAnnotationSeismic.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EQNMapAnnotationSeismic.swift; sourceTree = "<group>"; };
6525A82525E13FD4008FE0D0 /* SeismicNetworkAdvertiseTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SeismicNetworkAdvertiseTableViewCell.swift; sourceTree = "<group>"; };
652A3C6A2A8A757800719796 /* EQNBackgrounPositionDebugViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EQNBackgrounPositionDebugViewController.swift; sourceTree = "<group>"; };
652C37BC26092B3C0068EC3B /* FiltersViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FiltersViewModel.swift; sourceTree = "<group>"; };
65355FFE25F38D3300BB57D2 /* SegnalazioniMapViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SegnalazioniMapViewController.swift; sourceTree = "<group>"; };
653604E8262348FA00B2B651 /* EQNBaseMapFilter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EQNBaseMapFilter.swift; sourceTree = "<group>"; };
@@ -309,11 +318,14 @@
6544416A25E9599000C41714 /* EQNDebugViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EQNDebugViewController.swift; sourceTree = "<group>"; };
654D18C325F93C0600BB6DB0 /* PasquakesMapViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasquakesMapViewController.swift; sourceTree = "<group>"; };
654D18C825F93CD700BB6DB0 /* EQNMapAnnotationPastquake.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EQNMapAnnotationPastquake.swift; sourceTree = "<group>"; };
65506C042A8F94FF00AB6448 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; };
6552C1452926DBA1008E723C /* AppPreferences.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppPreferences.swift; sourceTree = "<group>"; };
6557CBBC26078A1700962757 /* EQNNotificationContent.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = EQNNotificationContent.entitlements; sourceTree = "<group>"; };
65583A04261B83BE00ECA9F9 /* UIKit+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIKit+Extensions.swift"; sourceTree = "<group>"; };
6562C80625FFA6B100C85273 /* SeismicNetworkViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SeismicNetworkViewModel.swift; sourceTree = "<group>"; };
6563DAA32AAF515F0072D309 /* BackgroundTaskIdentifiable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackgroundTaskIdentifiable.swift; sourceTree = "<group>"; };
656EB9372A15FD16009DADF3 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = en; path = en.lproj/Localizable.stringsdict; sourceTree = "<group>"; };
656EB9392A15FD19009DADF3 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = ar; path = ar.lproj/Localizable.stringsdict; sourceTree = "<group>"; };
656EB93A2A15FD1B009DADF3 /* hr-HR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "hr-HR"; path = "hr-HR.lproj/Localizable.stringsdict"; sourceTree = "<group>"; };
656EB93B2A15FD1B009DADF3 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = fr; path = fr.lproj/Localizable.stringsdict; sourceTree = "<group>"; };
656EB93C2A15FD1D009DADF3 /* el-GR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "el-GR"; path = "el-GR.lproj/Localizable.stringsdict"; sourceTree = "<group>"; };
@@ -325,6 +337,8 @@
658BAB7A25FE67930015C454 /* EQNBaseMapRepresentable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EQNBaseMapRepresentable.swift; sourceTree = "<group>"; };
658BC0282859A456009EECAA /* RealtimeAlertViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RealtimeAlertViewController.swift; sourceTree = "<group>"; };
658BC02A2859A4D3009EECAA /* RealtimeAlertView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RealtimeAlertView.swift; sourceTree = "<group>"; };
658F19692A0D1F8F00BECC05 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/InfoPlist.strings; sourceTree = "<group>"; };
658F196A2A0D1F8F00BECC05 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/Localizable.strings; sourceTree = "<group>"; };
65A4D5AA26280A24003918E0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/InfoPlist.strings; sourceTree = "<group>"; };
65A4D5AB26280A24003918E0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = "<group>"; };
65A4D5AC26280A56003918E0 /* el-GR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "el-GR"; path = "el-GR.lproj/InfoPlist.strings"; sourceTree = "<group>"; };
@@ -346,6 +360,9 @@
65DBFB7225E2BBF20041CBA6 /* GADTTemplateView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GADTTemplateView.m; sourceTree = "<group>"; };
65DBFB7325E2BBF20041CBA6 /* GADTMediumTemplateView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GADTMediumTemplateView.h; sourceTree = "<group>"; };
65EA58812A60360D0038EE9D /* EQNRealtimePushNotification.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EQNRealtimePushNotification.swift; sourceTree = "<group>"; };
65F9B49B2A8CA22800F13260 /* BackgroundTaskManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackgroundTaskManager.swift; sourceTree = "<group>"; };
65F9B49D2A8CA2AC00F13260 /* EQNBackgroundPosition.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EQNBackgroundPosition.swift; sourceTree = "<group>"; };
65F9B49F2A8CC58200F13260 /* UpdateUserLocationTask.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateUserLocationTask.swift; sourceTree = "<group>"; };
65FFDC92292F672B00EA821B /* EQNNotificationService.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = EQNNotificationService.appex; sourceTree = BUILT_PRODUCTS_DIR; };
65FFDC94292F672B00EA821B /* NotificationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationService.swift; sourceTree = "<group>"; };
65FFDC96292F672B00EA821B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
@@ -602,6 +619,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
65506C052A8F950000AB6448 /* CoreLocation.framework in Frameworks */,
6552C13829262119008E723C /* Shogun in Frameworks */,
8C5EA22D21763103002DC156 /* MapKit.framework in Frameworks */,
8CC2B44F214AC7F8002ED1B2 /* CoreMotion.framework in Frameworks */,
@@ -630,6 +648,7 @@
6544416A25E9599000C41714 /* EQNDebugViewController.swift */,
8CADAA9221B2627D0044E256 /* EQNLogViewController.h */,
8CADAA9321B2627D0044E256 /* EQNLogViewController.m */,
652A3C6A2A8A757800719796 /* EQNBackgrounPositionDebugViewController.swift */,
);
path = Debug;
sourceTree = "<group>";
@@ -674,6 +693,18 @@
path = Filters;
sourceTree = "<group>";
};
65F9B49A2A8CA21800F13260 /* Background */ = {
isa = PBXGroup;
children = (
6563DAA32AAF515F0072D309 /* BackgroundTaskIdentifiable.swift */,
65F9B49B2A8CA22800F13260 /* BackgroundTaskManager.swift */,
65F9B49F2A8CC58200F13260 /* UpdateUserLocationTask.swift */,
65F9B49D2A8CA2AC00F13260 /* EQNBackgroundPosition.swift */,
650247112A61832F001AC512 /* EQNBackgroundPositionDebugHelper.swift */,
);
path = Background;
sourceTree = "<group>";
};
65FFDC93292F672B00EA821B /* EQNNotificationService */ = {
isa = PBXGroup;
children = (
@@ -846,6 +877,7 @@
8CC2B44D214AC7F8002ED1B2 /* Frameworks */ = {
isa = PBXGroup;
children = (
65506C042A8F94FF00AB6448 /* CoreLocation.framework */,
8C483CAD21FDA53B00259FD2 /* StoreKit.framework */,
8C465D9721F6539700F04673 /* Earthquake Network.xcodeproj */,
8C5EA22C21763102002DC156 /* MapKit.framework */,
@@ -1066,6 +1098,7 @@
children = (
8C4E343D215012FA008B0D2A /* EQNManager.h */,
8C4E343E215012FA008B0D2A /* EQNManager.m */,
65F9B49A2A8CA21800F13260 /* Background */,
DC3640DF257E19A00037A4B7 /* Monitoring */,
DCF9E15024F6EA0B002B6B1D /* Networks */,
DC99A50124E66DFB0071BC9F /* Commands */,
@@ -1095,7 +1128,6 @@
8CF4F4DA216D44930057110B /* EQNPastquakes.m */,
65EA58812A60360D0038EE9D /* EQNRealtimePushNotification.swift */,
6552C1452926DBA1008E723C /* AppPreferences.swift */,
650247112A61832F001AC512 /* EQNDebugHelper.swift */,
);
path = Models;
sourceTree = "<group>";
@@ -1319,6 +1351,7 @@
"hr-HR",
"tr-TR",
"id-ID",
ar,
);
mainGroup = 8CBD3DB92149B9AD0070C963;
packageReferences = (
@@ -1605,6 +1638,7 @@
DCBB267E24D1EA2000F04559 /* SubscriptionProductTableViewCell.swift in Sources */,
65EA58822A60360D0038EE9D /* EQNRealtimePushNotification.swift in Sources */,
6525A82625E13FD4008FE0D0 /* SeismicNetworkAdvertiseTableViewCell.swift in Sources */,
65F9B49E2A8CA2AC00F13260 /* EQNBackgroundPosition.swift in Sources */,
DC99A50524E66E430071BC9F /* EQNAppearanceCommand.swift in Sources */,
65DBFB7525E2BBF20041CBA6 /* GADTMediumTemplateView.m in Sources */,
DC03BEAB250BC0A60084769B /* EQNRoundedButton.swift in Sources */,
@@ -1616,7 +1650,7 @@
652C37BD26092B3C0068EC3B /* FiltersViewModel.swift in Sources */,
DCF9E14F24F6EA07002B6B1D /* EQNSeismicNetwork.swift in Sources */,
DC2814302519C24400C1AFF7 /* SeismicNetworkTableViewCell.swift in Sources */,
650247122A61832F001AC512 /* EQNDebugHelper.swift in Sources */,
650247122A61832F001AC512 /* EQNBackgroundPositionDebugHelper.swift in Sources */,
65CB83432915720400EE1E35 /* EQNUserData.swift in Sources */,
654D18C425F93C0600BB6DB0 /* PasquakesMapViewController.swift in Sources */,
8C14113721EE502800A59729 /* EQNAllertaSismica.m in Sources */,
@@ -1641,9 +1675,11 @@
DCF10DCD24D2C935009F34C3 /* EQNPurchaseAvailability.swift in Sources */,
6552C1462926DBA1008E723C /* AppPreferences.swift in Sources */,
DC08803F24F5A89000186D97 /* SettingEnableTableViewCell.swift in Sources */,
652A3C6B2A8A757800719796 /* EQNBackgrounPositionDebugViewController.swift in Sources */,
6586971125F44C26009C0182 /* EQNBlurredCloseButton.swift in Sources */,
8CAFD7C521825E4A00F8BD29 /* EQNSisma.m in Sources */,
DCC23DEC24D281CE003A2404 /* SubscriptionsActiveTableViewCell.swift in Sources */,
6563DAA42AAF515F0072D309 /* BackgroundTaskIdentifiable.swift in Sources */,
8CF6604F214C0E58009F4314 /* EQNCalibrazione.m in Sources */,
65355FFF25F38D3300BB57D2 /* SegnalazioniMapViewController.swift in Sources */,
DCBB84F0252CFC4600F12633 /* AlertsNoLocationTableViewCell.swift in Sources */,
@@ -1665,6 +1701,7 @@
658BC0292859A456009EECAA /* RealtimeAlertViewController.swift in Sources */,
8CBD3DD82149B9AD0070C963 /* main.m in Sources */,
8CF05B57218C93BA0055012B /* EQNUtility.m in Sources */,
65F9B4A02A8CC58200F13260 /* UpdateUserLocationTask.swift in Sources */,
8C4E34422152B5E8008B0D2A /* EQNRilevamento.m in Sources */,
8C7A3B66225A5EA40045B266 /* NSDictionary+EQNExtensions.m in Sources */,
8CF66053214C12DC009F4314 /* EQNMath.m in Sources */,
@@ -1679,6 +1716,7 @@
8CF4F4D8216D3A110057110B /* EQNAreaCheck.m in Sources */,
8C4E34452152B707008B0D2A /* EQNAccelerometroManager.m in Sources */,
65D409942619BA34008CF356 /* SegnalazioniSendReportCell.swift in Sources */,
65F9B49C2A8CA22800F13260 /* BackgroundTaskManager.swift in Sources */,
8CBD3DC72149B9AD0070C963 /* AppDelegate.m in Sources */,
DC974AFF251748B300A139EC /* SeismicFiltersViewController.swift in Sources */,
DCB28CEE24FB8400001F557E /* SettingsViewController.swift in Sources */,
@@ -1705,7 +1743,9 @@
DC0AE1B92538204100111307 /* EQNSegnalazione.m in Sources */,
654D18DE25F943E200BB6DB0 /* EQNMapAnnotationUserReport.swift in Sources */,
654D18D625F9420500BB6DB0 /* EQNMapAnnotationPastquake.swift in Sources */,
65D507DB2A852274005BDC57 /* EQNUserData.swift in Sources */,
DC0AE1B52538202300111307 /* EQNUtility.m in Sources */,
65D507DC2A85227F005BDC57 /* Constants.swift in Sources */,
653C67E625F3CC8400FE52AC /* EQNCustomAnnotationView.swift in Sources */,
654D18DA25F9424700BB6DB0 /* EQNUtility+Extensions.swift in Sources */,
DC0AE1BA2538204100111307 /* EQNPastquakes.m in Sources */,
@@ -1734,6 +1774,7 @@
isa = PBXVariantGroup;
children = (
656EB9372A15FD16009DADF3 /* en */,
656EB9392A15FD19009DADF3 /* ar */,
656EB93A2A15FD1B009DADF3 /* hr-HR */,
656EB93B2A15FD1B009DADF3 /* fr */,
656EB93C2A15FD1D009DADF3 /* el-GR */,
@@ -1756,6 +1797,7 @@
65A4D5AF26280AAD003918E0 /* hr-HR */,
65A4D5B126280B61003918E0 /* tr-TR */,
65A4D5B626281126003918E0 /* id-ID */,
658F196A2A0D1F8F00BECC05 /* ar */,
);
name = Localizable.strings;
sourceTree = "<group>";
@@ -1771,6 +1813,7 @@
65A4D5AE26280AAD003918E0 /* hr-HR */,
65A4D5B026280B61003918E0 /* tr-TR */,
65A4D5B526281126003918E0 /* id-ID */,
658F19692A0D1F8F00BECC05 /* ar */,
);
name = InfoPlist.strings;
sourceTree = "<group>";
@@ -1811,7 +1854,7 @@
CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 113;
CURRENT_PROJECT_VERSION = 121;
DEVELOPMENT_TEAM = "";
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = WJA4MR4CPC;
GCC_PREPROCESSOR_DEFINITIONS = (
@@ -1822,13 +1865,13 @@
INFOPLIST_FILE = EQNNotificationService/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = EQNNotificationService;
INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2022 Earthquake Network. All rights reserved.";
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 5.5;
MARKETING_VERSION = 5.7;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.finazzi.distquake.notificationservice;
@@ -1853,20 +1896,20 @@
CODE_SIGN_IDENTITY = "Apple Distribution";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 113;
CURRENT_PROJECT_VERSION = 121;
DEVELOPMENT_TEAM = "";
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = WJA4MR4CPC;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = EQNNotificationService/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = EQNNotificationService;
INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2022 Earthquake Network. All rights reserved.";
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 5.5;
MARKETING_VERSION = 5.7;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.finazzi.distquake.notificationservice;
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -1935,7 +1978,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
@@ -1991,7 +2034,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
@@ -2009,7 +2052,7 @@
CODE_SIGN_ENTITLEMENTS = "Earthquake Network/Earthquake Network.entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 113;
CURRENT_PROJECT_VERSION = 121;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = WJA4MR4CPC;
@@ -2019,7 +2062,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 5.5;
MARKETING_VERSION = 5.7;
OTHER_LDFLAGS = (
"$(inherited)",
"-ObjC",
@@ -2118,7 +2161,7 @@
CODE_SIGN_ENTITLEMENTS = "Earthquake Network/Earthquake Network.entitlements";
CODE_SIGN_IDENTITY = "Apple Distribution";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 113;
CURRENT_PROJECT_VERSION = 121;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = WJA4MR4CPC;
GCC_PREFIX_HEADER = "Earthquake Network/Earthquake Network-Prefix.pch";
@@ -2127,7 +2170,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 5.5;
MARKETING_VERSION = 5.7;
OTHER_LDFLAGS = (
"$(inherited)",
"-ObjC",
@@ -2222,16 +2265,22 @@
CODE_SIGN_ENTITLEMENTS = EQNNotificationContent/EQNNotificationContent.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 113;
CURRENT_PROJECT_VERSION = 121;
DEVELOPMENT_TEAM = WJA4MR4CPC;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
"ADS_ENABLED=0",
"NOTIFICATION_CONTENT=1",
);
INFOPLIST_FILE = EQNNotificationContent/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 5.5;
MARKETING_VERSION = 5.7;
PRODUCT_BUNDLE_IDENTIFIER = com.finazzi.distquake.notificationcontent;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "EQNetwork Extension Content - Development";
@@ -2250,16 +2299,20 @@
CODE_SIGN_ENTITLEMENTS = EQNNotificationContent/EQNNotificationContent.entitlements;
CODE_SIGN_IDENTITY = "Apple Distribution";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 113;
CURRENT_PROJECT_VERSION = 121;
DEVELOPMENT_TEAM = WJA4MR4CPC;
GCC_PREPROCESSOR_DEFINITIONS = (
"ADS_ENABLED=0",
"NOTIFICATION_CONTENT=1",
);
INFOPLIST_FILE = EQNNotificationContent/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 5.5;
MARKETING_VERSION = 5.7;
PRODUCT_BUNDLE_IDENTIFIER = com.finazzi.distquake.notificationcontent;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "EQNetwork Extension Content - AppStore";
@@ -5,8 +5,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/andreabusi-it/Shogun",
"state" : {
"revision" : "3ffa7cfbdcbfb9868c853900f63d7e3248db797e",
"version" : "1.1.1"
"revision" : "c164595fdd5d0771a6a24cbff85a7582f0f07311",
"version" : "1.3.0"
}
}
],
+7 -16
View File
@@ -8,12 +8,9 @@
#import "AppDelegate.h"
#import "Costanti.h"
#import "ServerRequest.h"
#import "EQNGeneratoreURLServer.h"
#import "EQNUser.h"
#import "EQNAccelerometroManager.h"
#import "EQNManager.h"
#import "EQNUtility.h"
#import "EQNAllertaSismica.h"
#import "EQNNotificheSegnalazioniUtente.h"
#import "EQNNotificheReteSismiche.h"
@@ -56,6 +53,9 @@
[EQNManager defaultManager];
[self configureFirebase];
[self configureFacebookSDKWithApplication:application andOptions:launchOptions];
// schedule background tasks
[BackgroundTaskManager.shared registerTasks];
[BackgroundTaskManager.shared scheduleUpdateServerPosition];
// add some generic logs for Crashlytics
NSString *language = [[NSLocale preferredLanguages] firstObject];
@@ -63,7 +63,6 @@
[self configurePushNotifications];
[application setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
[application registerForRemoteNotifications];
return YES;
@@ -84,8 +83,10 @@
- (void)applicationDidEnterBackground:(UIApplication *)application {
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
[[EQNManager defaultManager] avviaManager];
[[EQNAccelerometroManager sharedInstance] startUpdatingLocationBackground];
// disabilitiamo logica calibrazione/monitoraggio perchè attualmente non utilizzata dal server
//[[EQNManager defaultManager] avviaManager];
//[[EQNAccelerometroManager sharedInstance] startUpdatingLocationBackground];
NSUInteger counter = [[NSUserDefaults standardUserDefaults] integerForKey:NSUserDefaults.UserDataProDiscountOpenCounter];
counter += 1;
@@ -166,16 +167,6 @@
completionHandler();
}
- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
NSURL *url = [EQNGeneratoreURLServer urlPosizione];
[[ServerRequest defaultServerConnectionSingleton] inviaInformazioniAlServerWithURL:url richiesta:EQNTipoChiamataPosizione success:^(id result) {
completionHandler(UIBackgroundFetchResultNewData);
} failure:^(NSError *error) {
completionHandler(UIBackgroundFetchResultFailed);
}];
}
#pragma mark - Private
- (void)handlePushNotificationWithNotificationContent:(UNNotificationContent *)content
@@ -59,6 +59,10 @@ extension UserDefaults {
static let UserDataProDiscountOpenCounter = "CONTEGGIO_APERTURE_PER_SCONTO"
/// Prezzo scontato per la versione pro scaduto
static let UserDataProDiscountExpired = "PREZZO_SCONTATO_SCADUTO"
/// Se `true` visualizza il tempo nelle annotazioni della mappa segnalazioni utente
static let UserReportExpandedView = "EQNData.UserReportExpandedView"
/// Se `true` visualizza le opzioni nella singole card in reti sismiche
static let AlertsShowCardOptions = "EQNetwork.AlertsShowAllCards"
// Migrazioni
static let AppMigrationV5_3 = "EQNUserDefaultMigrationV5_3"
@@ -67,4 +71,28 @@ extension UserDefaults {
// Notifica allerta salvata
static let RealTimeAlertPayload = "EQNData.RealtimePushNotificationPayload"
static let RealTimeAlertDate = "EQNData.RealtimeAlertDate"
// Filtri sezioni reti sismiche
static let SeismicMagnitudoMinima = "EQN_MAGNITUDO_MINIMA"
static let SeismicDistanzaMassima = "EQN_DISTANZA_MASSIMA"
static let SeismicEtaMassima = "EQN_ETA_MASSIMA"
static let SeismicSismiFortiAbilitati = "EQN_SISMI_FORTI_ABILITATI"
static let SeismicSismiForti = "EQN_SISMI_FORTI"
static let SeismicSismiQualsiasiMagnitudo = "EQN_SISMI_QUALSIASI_MAGNITUDO"
static let SeismicModificaImpostazioni = "EQN_SISMI_MODIFICA_IMPOSTAZIONI"
}
extension UserDefaults {
/// Get a generic stored values
/// - Parameters:
/// - key: A key in the current users defaults database.
/// - defaultValue: Default value to return if the key is not found
/// - Returns: The object associated with the specified key, or `defaultValue` if the key was not found.
func object<T>(forKey key: String, or defaultValue: T) -> T {
if let value = UserDefaults.standard.object(forKey: key) as? T {
return value
}
return defaultValue
}
}
@@ -104,6 +104,10 @@ typedef NS_ENUM(NSInteger, AllerteTableRow) {
self.title = [NSLocalizedString(@"tab_network", nil) capitalizedString];
self.tableView.estimatedRowHeight = 200.0;
self.tableView.rowHeight = UITableViewAutomaticDimension;
if (EQNBackgroundPositionDebugHelper.shared.isEnabled) {
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemBookmarks target:self action:@selector(backgroundPositionDebugTapped:)];
}
}
- (void)refreshUI
@@ -122,9 +126,7 @@ typedef NS_ENUM(NSInteger, AllerteTableRow) {
// mostriamo la schermata solo se il countdown non è a zero
if (![notification isCountdownExpired]) {
RealtimeAlertViewController *controller = [[RealtimeAlertViewController alloc] initWithNotification:notification];
if (@available(iOS 13.0, *)) {
controller.modalInPresentation = YES;
}
controller.modalInPresentation = YES;
[self presentViewController:controller animated:YES completion:nil];
}
} else {
@@ -177,6 +179,13 @@ typedef NS_ENUM(NSInteger, AllerteTableRow) {
[self refreshUI];
}
- (IBAction)backgroundPositionDebugTapped:(id)sender
{
EQNBackgroundPositionDebugViewController *controller = [[EQNBackgroundPositionDebugViewController alloc] init];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:controller];
[self presentViewController:navController animated:YES completion:nil];
}
- (void)actionCloseNotification
{
[self resetRealtimeAlert];
@@ -0,0 +1,84 @@
//
// EQNBackgrounPositionDebugViewController.swift
// Earthquake Network
//
// Created by Andrea Busi on 14/08/23.
// Copyright © 2023 Earthquake Network. All rights reserved.
//
import UIKit
import CoreLocation
class EQNBackgroundPositionDebugViewController: UITableViewController {
private var positions = [EQNBackgroundPosition]()
private let formatter: DateFormatter = {
let formatter = DateFormatter()
formatter.timeStyle = .medium
formatter.dateStyle = .medium
return formatter
}()
private let helper = EQNBackgroundPositionDebugHelper()
// MARK: - Init
convenience init() {
self.init(style: .insetGrouped)
}
// MARK: - View Lifecycle
override func viewDidLoad() {
super.viewDidLoad()
configureUI()
loadData()
}
private func configureUI() {
tableView.rowHeight = UITableView.automaticDimension
tableView.estimatedRowHeight = 60.0
navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .trash, target: self, action: #selector(onTapDeleteButton(_:)))
}
private func loadData() {
positions = helper.loadPosition()
tableView.reloadData()
}
// MARK: - Table view data source
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
positions.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let position = positions[indexPath.row]
let cell = UITableViewCell(style: .subtitle, reuseIdentifier: "PositionCell")
cell.textLabel?.text = formatter.string(from: position.date)
cell.detailTextLabel?.text = String(format: "Lat: %.4f - Lon: %.4f", position.coordinate.latitude, position.coordinate.longitude)
var imageView: UIImageView?
switch position.request {
case .none:
imageView = nil
case .some(true):
imageView = .init(image: .init(systemName: "checkmark.circle.fill"))
imageView?.tintColor = AppTheme.Colors.green
case .some(false):
imageView = .init(image: .init(systemName: "x.circle.fill"))
imageView?.tintColor = AppTheme.Colors.red
}
cell.accessoryView = imageView
return cell
}
// MARK: - Actions
@objc private func onTapDeleteButton(_ sender: UIBarButtonItem) {
helper.resetPositions()
loadData()
}
}
@@ -92,12 +92,9 @@
}
// Determine the view width to use for the ad width.
CGRect frame = self.view.frame;
// Here safe area is taken into account, hence the view frame is used after
// the view has been laid out.
if (@available(iOS 11.0, *)) {
frame = UIEdgeInsetsInsetRect(self.view.frame, self.view.safeAreaInsets);
}
CGRect frame = UIEdgeInsetsInsetRect(self.view.frame, self.view.safeAreaInsets);
CGFloat viewWidth = frame.size.width;
// Step 3 - Get Adaptive GADAdSize and set the ad view.
@@ -377,7 +377,8 @@ extension SeismicNetworksViewController: SeismicFiltersViewControllerDelegate {
extension SeismicNetworksViewController: SeismicSettingsViewControllerDelegate {
func seismicSettingsControllerDidComplete(_ controller: SeismicSettingsViewController) {
refreshUI()
// riscarichiamo i dati, le reti selezionate potrebbero essere cambiate
loadData(forced: true)
}
func seismicSettingsControllerWillOpenProviders(_ controller: SeismicSettingsViewController) {
@@ -387,7 +388,8 @@ extension SeismicNetworksViewController: SeismicSettingsViewControllerDelegate {
extension SeismicNetworksViewController: SeismicSettingsNetworksViewControllerDelegate {
func seismicSettingsNetworksControllerDidComplete(_ controller: SeismicSettingsNetworksViewController) {
refreshUI()
// riscarichiamo i dati, le reti selezionate potrebbero essere cambiate
loadData(forced: true)
}
}
-12
View File
@@ -64,11 +64,9 @@ static NSString * const EQNServerUrlAlertSimulator = @"https://srv.earthquakenet
#pragma mark - UserDefaults Keys
static NSString * const EQNUserDefaultKeyAlertsShowAllCards = @"EQNetwork.AlertsShowAllCards";
static NSString * const EQNUserDefaultKeySesmicInformations = @"EQNetwork.SeismicInformations";
static NSString * const EQNUserDefaultKeyOneShotShowCountry = @"EQNetwork.OneShot.CountrySelection";
static NSString * const EQNUserDefaultSeismicNetworkCards = @"EQNData.RetiSismiche";
static NSString * const EQNUserDefaultUserReportExpandedView = @"EQNData.UserReportExpandedView";
#pragma mark - NSNotification
@@ -173,14 +171,4 @@ typedef enum : NSInteger {
// Sigla della rete sismica selezionata
#define IMPOSTAZIONE_NAZIONE_RETI_SISMICHE @"IMPOSTAIONE_NAZIONE_RETI_SISMICHE"
// FILTRO ENTI
#define EQN_MAGNITUDO_MINIMA @"EQN_MAGNITUDO_MINIMA"
#define EQN_DISTANZA_MASSIMA @"EQN_DISTANZA_MASSIMA"
#define EQN_ETA_MASSIMA @"EQN_ETA_MASSIMA"
#define EQN_SISMI_FORTI_ABILITATI @"EQN_SISMI_FORTI_ABILITATI"
#define EQN_SISMI_FORTI @"EQN_SISMI_FORTI"
#define EQN_SISMI_QUALSIASI_MAGNITUDO @"EQN_SISMI_QUALSIASI_MAGNITUDO"
#define EQN_SISMI_MODIFICA_IMPOSTAZIONI @"EQN_SISMI_MODIFICA_IMPOSTAZIONI"
#endif /* Costanti_h */
+28 -28
View File
@@ -2,6 +2,10 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>BGTaskSchedulerPermittedIdentifiers</key>
<array>
<string>com.finazzi.distquake.update_server_position</string>
</array>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
@@ -18,16 +22,35 @@
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>$(MARKETING_VERSION)</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>fb1444404982546319</string>
</array>
</dict>
</array>
<key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string>
<key>FacebookAdvertiserIDCollectionEnabled</key>
<true/>
<key>FacebookAppID</key>
<string>1444404982546319</string>
<key>FacebookAutoLogAppEventsEnabled</key>
<true/>
<key>FacebookClientToken</key>
<string>46c7a338b2bbd2186b2f1c12865b4004</string>
<key>FacebookDisplayName</key>
<string>Earthquake Network</string>
<key>GADApplicationIdentifier</key>
<string>ca-app-pub-0053870219990922~2021960172</string>
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>googlechromes</string>
<string>comgooglemaps</string>
<string>fbapi</string>
<string>fb-messenger-share-api</string>
</array>
<key>LSRequiresIPhoneOS</key>
<true/>
@@ -43,6 +66,8 @@
<string> Ci occorre la tua posizione per inviare messaggi precisi in caso di terremoto</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>L'accesso alla libreria è richiesto per poter salvare le immagini generate dall'app</string>
<key>NSUserTrackingUsageDescription</key>
<string>Il tracciamento serve a capire se la pubblicità dell'app è efficace</string>
<key>SKAdNetworkItems</key>
<array>
<dict>
@@ -55,6 +80,7 @@
<string>audio</string>
<string>fetch</string>
<string>location</string>
<string>processing</string>
<string>remote-notification</string>
</array>
<key>UILaunchStoryboardName</key>
@@ -78,31 +104,5 @@
</array>
<key>UIUserInterfaceStyle</key>
<string>Light</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>fb1444404982546319</string>
</array>
</dict>
</array>
<key>FacebookAppID</key>
<string>1444404982546319</string>
<key>FacebookClientToken</key>
<string>46c7a338b2bbd2186b2f1c12865b4004</string>
<key>FacebookDisplayName</key>
<string>Earthquake Network</string>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>fbapi</string>
<string>fb-messenger-share-api</string>
</array>
<key>FacebookAutoLogAppEventsEnabled</key>
<true/>
<key>FacebookAdvertiserIDCollectionEnabled</key>
<true/>
<key>NSUserTrackingUsageDescription</key>
<string>Il tracciamento serve a capire se la pubblicità dell'app è efficace</string>
</dict>
</plist>
@@ -19,13 +19,14 @@ class AppPreferences: NSObject {
/// Defines if time has to be shown on map annotations in User Reports
var userReportExpandedView: Bool {
get { UserDefaults.standard.bool(forKey: EQNUserDefaultUserReportExpandedView) }
set { UserDefaults.standard.set(newValue, forKey: EQNUserDefaultUserReportExpandedView) }
get { UserDefaults.standard.bool(forKey: UserDefaults.UserReportExpandedView) }
set { UserDefaults.standard.set(newValue, forKey: UserDefaults.UserReportExpandedView) }
}
/// Defines if options has to be shown on seismic cards
@objc
var alertsShowAllCards: Bool {
get { UserDefaults.standard.bool(forKey: EQNUserDefaultKeyAlertsShowAllCards) }
set { UserDefaults.standard.set(newValue, forKey: EQNUserDefaultKeyAlertsShowAllCards) }
get { UserDefaults.standard.bool(forKey: UserDefaults.AlertsShowCardOptions) }
set { UserDefaults.standard.set(newValue, forKey: UserDefaults.AlertsShowCardOptions) }
}
}
@@ -0,0 +1,27 @@
//
// BackgroundTaskIdentifiable.swift
// Earthquake Network
//
// Created by Andrea Busi on 11/09/23.
// Copyright © 2023 Earthquake Network. All rights reserved.
//
import Foundation
import BackgroundTasks
protocol BackgroundTaskIdentifiable {
typealias TaskCompletion = (_ success: Bool) -> Void
static var identifier: String { get }
static var interval: TimeInterval { get }
init()
func handle(_ task: BGTask, completion: @escaping TaskCompletion)
func exipration()
}
extension BackgroundTaskIdentifiable {
func exipration() { }
}
@@ -0,0 +1,81 @@
//
// BackgroundTaskManager.swift
// Earthquake Network
//
// Created by Andrea Busi on 16/08/23.
// Copyright © 2023 Earthquake Network. All rights reserved.
//
import Foundation
import BackgroundTasks
@objc
class BackgroundTaskManager: NSObject {
@objc
static let shared = BackgroundTaskManager()
private let identifiers: [BackgroundTaskIdentifiable.Type] = [UpdateUserLocationTask.self]
// MARK: - Public
@objc
func registerTasks() {
identifiers
.forEach { taskIdentifiable in
BGTaskScheduler.shared.register(forTaskWithIdentifier: taskIdentifiable.identifier, using: DispatchQueue.global()) { [weak self] task in
guard let appTask = task as? BGAppRefreshTask else { return }
self?.handleTask(appTask, with: taskIdentifiable)
self?.scheduleTaskRequest(for: taskIdentifiable)
}
}
}
// MARK: - Public
@objc
func scheduleUpdateServerPosition() {
scheduleTaskRequest(for: UpdateUserLocationTask.self)
}
// MARK: - Private
private func scheduleTaskRequest(
for taskIdentifiable: BackgroundTaskIdentifiable.Type
) {
let request = BGAppRefreshTaskRequest(identifier: taskIdentifiable.identifier)
// Fetch no earlier than X minutes from now
request.earliestBeginDate = Date(timeIntervalSinceNow: taskIdentifiable.interval)
//request.requiresNetworkConnectivity = true
do {
try BGTaskScheduler.shared.submit(request)
print("[BackgroundTaskManager] Background task scheduler submitted")
} catch {
print("[BackgroundTaskManager] Could not schedule background taksk. Error: \(error)")
}
}
private func handleTask(
_ appTask: BGAppRefreshTask,
with taskIdentifiable: BackgroundTaskIdentifiable.Type
) {
// create a task
let task = taskIdentifiable.init()
// Provide the background task with an expiration handler that cancels the operation.
appTask.expirationHandler = {
task.exipration()
}
// Handle workload
task.handle(appTask) { success in
// Inform the system that the background task is complete
// when the operation completes.
appTask.setTaskCompleted(success: success)
}
}
}
@@ -0,0 +1,32 @@
//
// EQNBackgroundPosition.swift
// Earthquake Network
//
// Created by Andrea Busi on 16/08/23.
// Copyright © 2023 Earthquake Network. All rights reserved.
//
import Foundation
import CoreLocation
struct EQNBackgroundPosition: Codable {
let date: Date
private let latitude: Double
private let longitude: Double
var coordinate: CLLocationCoordinate2D {
.init(latitude: latitude, longitude: longitude)
}
let request: Bool?
init(
date: Date,
coordinate: CLLocationCoordinate2D,
request: Bool?
) {
self.date = date
self.latitude = coordinate.latitude
self.longitude = coordinate.longitude
self.request = request
}
}
@@ -0,0 +1,66 @@
//
// EQNDebugHelper.swift
// Earthquake Network
//
// Created by Andrea Busi on 14/07/23.
// Copyright © 2023 Earthquake Network. All rights reserved.
//
import Foundation
@objc
class EQNBackgroundPositionDebugHelper: NSObject {
@objc
static let shared = EQNBackgroundPositionDebugHelper()
private var timers: [String: Timer] = [:]
@objc
var isEnabled: Bool { false }
// MARK: - Public
@objc
func printPositions(
interval: TimeInterval = 2.0,
repeats: Bool = true
) {
let timer = Timer.scheduledTimer(withTimeInterval: interval, repeats: true) { timer in
let current = EQNUserData.shared.lastLocation?.coordinate
print("[EQNDebugHelper] Current | lat: \(current?.latitude ?? 0) - lon: \(current?.longitude ?? 0)")
let saved = EQNUser.default().lastPosition?.coordinate
print("[EQNDebugHelper] Saved | lat: \(saved?.latitude ?? 0) - lon: \(saved?.longitude ?? 0)")
}
timers["positions"] = timer
}
// MARK: - Class
func savePosition(
coordinate: CLLocationCoordinate2D,
requestSuccess: Bool
) {
var positions = loadPosition()
positions.append(.init(date: Date(), coordinate: coordinate, request: requestSuccess))
if let data = try? JSONEncoder().encode(positions) {
UserDefaults.standard.set(data, forKey: "BackgroundPositions")
}
}
func resetPositions() {
UserDefaults.standard.removeObject(forKey: "BackgroundPositions")
}
func loadPosition() -> [EQNBackgroundPosition] {
guard let data = UserDefaults.standard.object(forKey: "BackgroundPositions") as? Data else {
return []
}
let positions = try? JSONDecoder().decode([EQNBackgroundPosition].self, from: data)
return positions ?? []
}
}
@@ -0,0 +1,95 @@
//
// UpdateUserLocationTask.swift
// Earthquake Network
//
// Created by Andrea Busi on 16/08/23.
// Copyright © 2023 Earthquake Network. All rights reserved.
//
import Foundation
import BackgroundTasks
import CoreLocation
final class UpdateUserLocationTask: NSObject, BackgroundTaskIdentifiable {
static var identifier: String {
"com.finazzi.distquake.update_server_position"
}
static var interval: TimeInterval {
5 * 60
}
static let shared = UpdateUserLocationTask()
private let debugHelper = EQNBackgroundPositionDebugHelper()
// MARK: - Internal
private lazy var locationManager: CLLocationManager = {
let manager = CLLocationManager()
manager.delegate = self
manager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
manager.allowsBackgroundLocationUpdates = true
manager.pausesLocationUpdatesAutomatically = false
return manager
}()
var appTaskCompletion: BackgroundTaskIdentifiable.TaskCompletion?
func handle(_ task: BGTask, completion: @escaping (_ success: Bool) -> Void) {
self.appTaskCompletion = completion
// ricaviamo la posizione corrente dell'utente
if let location = locationManager.location {
complete(with: location)
} else {
locationManager.requestLocation()
}
}
func exipration() {
locationManager.stopUpdatingLocation()
failed()
}
// MARK: - Private
private func complete(with location: CLLocation) {
// send position to cloud
let url = EQNGeneratoreURLServer.urlPosizione(withLocation: location.coordinate)
ServerRequest.default().inviaInformazioniAlServer(with: url, richiesta: .posizione) { result in
if self.debugHelper.isEnabled {
self.debugHelper.savePosition(coordinate: location.coordinate, requestSuccess: true)
}
self.appTaskCompletion?(true)
} failure: { error in
if self.debugHelper.isEnabled {
self.debugHelper.savePosition(coordinate: location.coordinate, requestSuccess: false)
}
self.appTaskCompletion?(false)
}
}
private func failed() {
appTaskCompletion?(false)
}
}
extension UpdateUserLocationTask: CLLocationManagerDelegate {
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
if let location = locations.first {
complete(with: location)
} else {
failed()
}
}
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
print("[UpdateUserLocationTask] Location manager failed. Error: \(error.localizedDescription)")
// nope, but mandatory
failed()
}
}
@@ -24,30 +24,21 @@ public class EQNAppearanceCommand: EQNCommandProtocol {
private func applyAppearance() {
// UINavigationBar
let proxyNavBar = UINavigationBar.appearance(whenContainedInInstancesOf: [UINavigationController.self])
if #available(iOS 13.0, *) {
let navAppearance = UINavigationBarAppearance()
navAppearance.configureWithOpaqueBackground()
navAppearance.titleTextAttributes = [
NSAttributedString.Key.foregroundColor: AppTheme.Colors.darkGray
]
navAppearance.largeTitleTextAttributes = [
NSAttributedString.Key.foregroundColor: AppTheme.Colors.darkGray
]
navAppearance.backgroundColor = AppTheme.Colors.primary
navAppearance.shadowColor = UIColor.clear
let navAppearance = UINavigationBarAppearance()
navAppearance.configureWithOpaqueBackground()
navAppearance.titleTextAttributes = [
NSAttributedString.Key.foregroundColor: AppTheme.Colors.darkGray
]
navAppearance.largeTitleTextAttributes = [
NSAttributedString.Key.foregroundColor: AppTheme.Colors.darkGray
]
navAppearance.backgroundColor = AppTheme.Colors.primary
navAppearance.shadowColor = UIColor.clear
proxyNavBar.isTranslucent = false
proxyNavBar.tintColor = AppTheme.Colors.darkGray
proxyNavBar.standardAppearance = navAppearance
proxyNavBar.scrollEdgeAppearance = navAppearance
} else {
proxyNavBar.tintColor = AppTheme.Colors.darkGray
proxyNavBar.isTranslucent = false
proxyNavBar.barTintColor = AppTheme.Colors.primary
proxyNavBar.titleTextAttributes = [
NSAttributedString.Key.foregroundColor: UIColor.white
]
}
proxyNavBar.isTranslucent = false
proxyNavBar.tintColor = AppTheme.Colors.darkGray
proxyNavBar.standardAppearance = navAppearance
proxyNavBar.scrollEdgeAppearance = navAppearance
let proxyTabBar = UITabBar.appearance()
proxyTabBar.tintColor = AppTheme.Colors.red
@@ -1,36 +0,0 @@
//
// EQNDebugHelper.swift
// Earthquake Network
//
// Created by Andrea Busi on 14/07/23.
// Copyright © 2023 Earthquake Network. All rights reserved.
//
import Foundation
@objc
class EQNDebugHelper: NSObject {
@objc
static let shared = EQNDebugHelper()
private var timers: [String: Timer] = [:]
// MARK: - Public
@objc
func printPositions(
interval: TimeInterval = 2.0,
repeats: Bool = true
) {
let timer = Timer.scheduledTimer(withTimeInterval: interval, repeats: true) { timer in
let current = EQNUserData.shared.lastLocation?.coordinate
print("[EQNDebugHelper] Current | lat: \(current?.latitude ?? 0) - lon: \(current?.longitude ?? 0)")
let saved = EQNUser.default().lastPosition?.coordinate
print("[EQNDebugHelper] Saved | lat: \(saved?.latitude ?? 0) - lon: \(saved?.longitude ?? 0)")
}
timers["positions"] = timer
}
}
@@ -27,14 +27,15 @@ import Foundation
override init() {
Self.migrateOldDistanza()
Self.migrateOldPeriodo()
magnitudoMinima = Self.userDefaults(for: EQN_MAGNITUDO_MINIMA, or: EQNData.DefaultMagitudoDebole.value)
distanzaMassima = Self.userDefaults(for: EQN_DISTANZA_MASSIMA, or: EQNData.DefaultRaggioSisma.value)
periodoTemporale = Self.userDefaults(for: EQN_ETA_MASSIMA, or: EQNData.DefaultPeriodoTemporale.value)
sismiFortiAbilitati = Self.userDefaults(for: EQN_SISMI_FORTI_ABILITATI, or: false)
sismiFortiMagnitudo = Self.userDefaults(for: EQN_SISMI_FORTI, or: EQNData.DefaultMagitudoForte.value)
sismiQualsiasiAbilitati = Self.userDefaults(for: EQN_SISMI_QUALSIASI_MAGNITUDO, or: false)
modificaImpostazioniAbilitato = Self.userDefaults(for: EQN_SISMI_MODIFICA_IMPOSTAZIONI, or: false)
let defaults = UserDefaults.standard
magnitudoMinima = defaults.object(forKey: UserDefaults.SeismicMagnitudoMinima, or: EQNData.DefaultMagitudoDebole.value)
distanzaMassima = defaults.object(forKey: UserDefaults.SeismicDistanzaMassima, or: EQNData.DefaultRaggioSisma.value)
periodoTemporale = defaults.object(forKey: UserDefaults.SeismicEtaMassima, or: EQNData.DefaultPeriodoTemporale.value)
sismiFortiAbilitati = defaults.object(forKey: UserDefaults.SeismicSismiFortiAbilitati, or: false)
sismiFortiMagnitudo = defaults.object(forKey: UserDefaults.SeismicSismiForti, or: EQNData.DefaultMagitudoForte.value)
sismiQualsiasiAbilitati = defaults.object(forKey: UserDefaults.SeismicSismiQualsiasiMagnitudo, or: false)
modificaImpostazioniAbilitato = defaults.object(forKey: UserDefaults.SeismicModificaImpostazioni, or: true)
super.init()
}
@@ -43,33 +44,26 @@ import Foundation
// MARK: - Public
public func saveFilters() {
UserDefaults.standard.set(magnitudoMinima, forKey:EQN_MAGNITUDO_MINIMA)
UserDefaults.standard.set(distanzaMassima, forKey:EQN_DISTANZA_MASSIMA)
UserDefaults.standard.set(periodoTemporale, forKey:EQN_ETA_MASSIMA)
UserDefaults.standard.set(sismiFortiMagnitudo, forKey:EQN_SISMI_FORTI)
UserDefaults.standard.set(sismiFortiAbilitati, forKey:EQN_SISMI_FORTI_ABILITATI)
UserDefaults.standard.set(sismiQualsiasiAbilitati, forKey:EQN_SISMI_QUALSIASI_MAGNITUDO)
UserDefaults.standard.set(modificaImpostazioniAbilitato, forKey:EQN_SISMI_MODIFICA_IMPOSTAZIONI)
UserDefaults.standard.set(magnitudoMinima, forKey: UserDefaults.SeismicMagnitudoMinima)
UserDefaults.standard.set(distanzaMassima, forKey: UserDefaults.SeismicDistanzaMassima)
UserDefaults.standard.set(periodoTemporale, forKey: UserDefaults.SeismicEtaMassima)
UserDefaults.standard.set(sismiFortiMagnitudo, forKey: UserDefaults.SeismicSismiForti)
UserDefaults.standard.set(sismiFortiAbilitati, forKey: UserDefaults.SeismicSismiFortiAbilitati)
UserDefaults.standard.set(sismiQualsiasiAbilitati, forKey: UserDefaults.SeismicSismiQualsiasiMagnitudo)
UserDefaults.standard.set(modificaImpostazioniAbilitato, forKey: UserDefaults.SeismicModificaImpostazioni)
}
// MARK: - Private
private static func userDefaults<T>(for key: String, or defaultValue: T) -> T {
if let value = UserDefaults.standard.object(forKey: key) as? T {
return value
}
return defaultValue
}
private static func migrateOldDistanza() {
guard let savedValue = UserDefaults.standard.object(forKey: EQN_DISTANZA_MASSIMA) as? String else {
guard let savedValue = UserDefaults.standard.object(forKey: UserDefaults.SeismicDistanzaMassima) as? String else {
print("[EQNSeismic] Distanza massima: nessun valore da convertire")
return
}
if savedValue.lowercased() == NSLocalizedString("radius_any_distance", comment: "").lowercased() {
print("[EQNSeismic] Distanza massima: trovato qualsiasi distanza, salvo valore")
UserDefaults.standard.set("100000", forKey: EQN_DISTANZA_MASSIMA)
UserDefaults.standard.set("100000", forKey: UserDefaults.SeismicDistanzaMassima)
} else {
print("[EQNSeismic] Distanza massima: valore da non convertire (value: \(savedValue))")
@@ -77,7 +71,7 @@ import Foundation
}
private static func migrateOldPeriodo() {
guard let savedValue = UserDefaults.standard.object(forKey: EQN_ETA_MASSIMA) as? String else {
guard let savedValue = UserDefaults.standard.object(forKey: UserDefaults.SeismicEtaMassima) as? String else {
print("[EQNSeismic] Età massima: nessun valore da convertire");
return
}
@@ -99,7 +93,7 @@ import Foundation
if let convertedValue = convertedValue {
print("[EQNSeismic] Età massima: salvo valore convertito (old: \(savedValue) - new: \(convertedValue)")
UserDefaults.standard.set(convertedValue, forKey: EQN_ETA_MASSIMA)
UserDefaults.standard.set(convertedValue, forKey: UserDefaults.SeismicEtaMassima)
} else {
print("[EQNSeismic] Età massima: valore già convertito")
}
@@ -10,6 +10,9 @@
#import "EQNSegnalazione.h"
#import "EQNPastquakes.h"
#import "EQNSisma.h"
#if NOTIFICATION_CONTENT
#import "EQNNotificationContent-Swift.h"
#endif
@implementation EQNUtility
@@ -105,6 +108,9 @@
// ultima posizione nota dell'utente
CLLocationManager *manager = [[CLLocationManager alloc] init];
CLLocation *lastUserLocation = manager.location;
if (lastUserLocation == nil) {
lastUserLocation = EQNUserData.sharedData.lastLocation;
}
if (!lastUserLocation) {
return nil;
}
@@ -7,6 +7,7 @@
//
#import <Foundation/Foundation.h>
@import CoreLocation;
#import "EQNCalibrazione.h"
#import "EQNRilevamento.h"
@@ -17,6 +18,7 @@ NS_ASSUME_NONNULL_BEGIN
+ (NSURL *)urlDownloadDati;
+ (NSURL *)urlRegistrazioneFirebaseToken:(NSString *)firebaseToken existingUserId:(NSString *)existingUserId;
+ (NSURL *)urlPosizione;
+ (NSURL *)urlPosizioneWithLocation:(CLLocationCoordinate2D)location;
+ (NSURL *)urlMessagioStatoSmartPhone:(EQNCalibrazione *)calibrazione rilevamento:(EQNRilevamento *)rilevamento;
+ (NSURL *)urlInvioMessagioTerremoto:(NSInteger )magnitudo withAdress:(NSString *)address;
+ (NSURL *)urlInvioCommentoTerremoto:(NSString *)commento codeMessage:(NSString *)code;
@@ -38,7 +38,12 @@
+ (NSURL *)urlPosizione
{
NSString *stringUrl = [NSString stringWithFormat:@"%@?u_id=%@&lat=%f&lon=%f", EQNServerUrlUserLocation, [EQNUser defaultUser].user_ID, [EQNUser defaultUser].lastPosition.coordinate.latitude, [EQNUser defaultUser].lastPosition.coordinate.longitude];
return [self urlPosizioneWithLocation:[EQNUser defaultUser].lastPosition.coordinate];
}
+ (NSURL *)urlPosizioneWithLocation:(CLLocationCoordinate2D)location
{
NSString *stringUrl = [NSString stringWithFormat:@"%@?u_id=%@&lat=%f&lon=%f", EQNServerUrlUserLocation, [EQNUser defaultUser].user_ID, location.latitude, location.longitude];
return [NSURL URLWithString:stringUrl];
}
@@ -87,10 +87,6 @@
NSMutableURLRequest * urlRequest = [NSMutableURLRequest requestWithURL:url];
[urlRequest setHTTPMethod:@"GET"];
dispatch_async(dispatch_get_main_queue(), ^{
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
});
NSURLSessionDataTask *dataTask = [self.session dataTaskWithRequest:urlRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSHTTPURLResponse *httpResp = (NSHTTPURLResponse *)response;
if (error) {
@@ -119,9 +115,6 @@
onSuccess(JSON);
break;
}
dispatch_async(dispatch_get_main_queue(), ^{
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
});
}
} else {
NSString *newStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
@@ -152,9 +145,6 @@
NSError *error = [NSError errorWithDomain:NSMachErrorDomain code:0 userInfo:@{MESSAGGIO : NSLocalizedString(@"manual_error", @"messaggio errore inserimento credenziali")}];
onFailure(error);
dispatch_async(dispatch_get_main_queue(), ^{
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
});
}
}
}];
@@ -363,7 +363,7 @@
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="O7j-TF-VIR">
<rect key="frame" x="0.0" y="0.0" width="398" height="50.5"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="II - Appena percepito" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="dPZ-e0-ohw">
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="II - Appena percepito" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="dPZ-e0-ohw">
<rect key="frame" x="10" y="15" width="378" height="20.5"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
@@ -393,7 +393,7 @@
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Lsw-Ip-ccP">
<rect key="frame" x="0.0" y="50.5" width="398" height="50.5"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="III - Vibrazioni simili al passaggio di un camion" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="xCi-QY-fyE">
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="III - Vibrazioni simili al passaggio di un camion" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="xCi-QY-fyE">
<rect key="frame" x="10" y="15" width="378" height="20.5"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
@@ -423,7 +423,7 @@
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="CD3-eg-ef5">
<rect key="frame" x="0.0" y="101" width="398" height="71"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="IV - Vibrazione di infissi e vetri, leggere oscillazioni di oggetti appesi" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="c87-9a-K63">
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="IV - Vibrazione di infissi e vetri, leggere oscillazioni di oggetti appesi" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="c87-9a-K63">
<rect key="frame" x="10" y="15" width="378" height="41"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
@@ -453,7 +453,7 @@
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="LPi-9Y-7eu">
<rect key="frame" x="0.0" y="172" width="398" height="50.5"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="V - Caduta di oggetti degli scaffali" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="NhP-9P-tfI">
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="V - Caduta di oggetti degli scaffali" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="NhP-9P-tfI">
<rect key="frame" x="10" y="15" width="378" height="20.5"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
@@ -483,7 +483,7 @@
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="YOF-48-hY6">
<rect key="frame" x="0.0" y="222.5" width="398" height="71"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="VI - Piccole lesioni negli edifici e finestre in frantumi" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="dOe-Qd-wa7">
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="VI - Piccole lesioni negli edifici e finestre in frantumi" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="dOe-Qd-wa7">
<rect key="frame" x="10" y="15" width="378" height="41"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
@@ -513,7 +513,7 @@
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="gQt-gY-9IE">
<rect key="frame" x="0.0" y="293.5" width="398" height="71"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="VII - Lesioni negli edifici, difficoltà a rimanere in piedi" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="bzl-Jn-NSc">
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="VII - Lesioni negli edifici, difficoltà a rimanere in piedi" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="bzl-Jn-NSc">
<rect key="frame" x="10" y="15" width="378" height="41"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
@@ -543,7 +543,7 @@
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ABw-eL-FJU">
<rect key="frame" x="0.0" y="364.5" width="398" height="50.5"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="VIII - Lesioni evidenti negli edifici e crolli parziali" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="mLj-zR-i4N">
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="VIII - Lesioni evidenti negli edifici e crolli parziali" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="mLj-zR-i4N">
<rect key="frame" x="10" y="15" width="378" height="20.5"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
@@ -573,7 +573,7 @@
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="h01-lv-LJ2">
<rect key="frame" x="0.0" y="415" width="398" height="71"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="IX - Crolli consistenti negli edifici, persone gettate a terra" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="zNl-zP-BSK">
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="IX - Crolli consistenti negli edifici, persone gettate a terra" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="zNl-zP-BSK">
<rect key="frame" x="10" y="15" width="378" height="41"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
@@ -603,7 +603,7 @@
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="0iy-XC-bYQ">
<rect key="frame" x="0.0" y="486" width="398" height="50.5"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="X - Interi edifici crollati" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="gfo-a3-0tU">
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="X - Interi edifici crollati" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="gfo-a3-0tU">
<rect key="frame" x="10" y="15" width="378" height="20.5"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
@@ -633,7 +633,7 @@
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Ijw-VB-xsj">
<rect key="frame" x="0.0" y="536.5" width="398" height="71"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="XI - Distruzione di interi centri urbani, moltissime vitti,e crepacci nel suolo e frane" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="aSj-Rw-iMc">
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="XI - Distruzione di interi centri urbani, moltissime vitti,e crepacci nel suolo e frane" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="aSj-Rw-iMc">
<rect key="frame" x="10" y="15" width="378" height="41"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
@@ -663,7 +663,7 @@
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="kuE-9i-4vk">
<rect key="frame" x="0.0" y="607.5" width="398" height="71"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="XII - Sconvolgimento del suolo, dislocamento della crosta terrestre" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="d3V-sB-aiq">
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="XII - Sconvolgimento del suolo, dislocamento della crosta terrestre" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="d3V-sB-aiq">
<rect key="frame" x="10" y="15" width="378" height="41"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
@@ -1990,16 +1990,16 @@ Sisma rilevato da 10 smartphone</string>
</connections>
</tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="none" indentationWidth="10" reuseIdentifier="PastEarthquakesCell" rowHeight="160" id="R3G-Bh-LLr" customClass="AlertsPastEartquakesTableViewCell" customModule="Earthquake_Network" customModuleProvider="target">
<rect key="frame" x="0.0" y="952" width="414" height="160"/>
<rect key="frame" x="0.0" y="1098" width="414" height="160"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="R3G-Bh-LLr" id="UH4-vm-Tld">
<rect key="frame" x="0.0" y="0.0" width="414" height="160"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="8aY-un-i0P">
<view contentMode="scaleToFill" ambiguous="YES" translatesAutoresizingMaskIntoConstraints="NO" id="8aY-un-i0P">
<rect key="frame" x="8" y="8" width="398" height="144"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Past seismic alerts" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="13" translatesAutoresizingMaskIntoConstraints="NO" id="qss-8q-f70" customClass="EQNEdgeInsetLabel" customModule="Earthquake_Network" customModuleProvider="target">
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Past seismic alerts" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="13" translatesAutoresizingMaskIntoConstraints="NO" id="qss-8q-f70" customClass="EQNEdgeInsetLabel" customModule="Earthquake_Network" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="146" height="26"/>
<color key="backgroundColor" red="0.50766238939999997" green="0.75272958739999996" blue="0.98132258650000004" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
@@ -2009,16 +2009,16 @@ Sisma rilevato da 10 smartphone</string>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" distribution="fillEqually" alignment="center" spacing="4" translatesAutoresizingMaskIntoConstraints="NO" id="Wn0-ni-ud8">
<stackView opaque="NO" contentMode="scaleToFill" ambiguous="YES" axis="vertical" distribution="fillEqually" alignment="center" spacing="4" translatesAutoresizingMaskIntoConstraints="NO" id="Wn0-ni-ud8">
<rect key="frame" x="134" y="34" width="130.5" height="54"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Last 24h: 0" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="hbH-vC-Yma">
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Last 24h: 0" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="hbH-vC-Yma">
<rect key="frame" x="11.5" y="0.0" width="107.5" height="25"/>
<fontDescription key="fontDescription" type="system" pointSize="22"/>
<color key="textColor" name="Gray (dark)"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Since 2013: 0" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="l5q-I9-iOb">
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Since 2013: 0" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="l5q-I9-iOb">
<rect key="frame" x="0.0" y="29" width="130.5" height="25"/>
<fontDescription key="fontDescription" type="system" pointSize="22"/>
<color key="textColor" name="Gray (dark)"/>
@@ -2026,7 +2026,7 @@ Sisma rilevato da 10 smartphone</string>
</label>
</subviews>
</stackView>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="o3D-zn-NCG" customClass="EQNRoundedButton" customModule="Earthquake_Network" customModuleProvider="target">
<button opaque="NO" contentMode="scaleToFill" ambiguous="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="o3D-zn-NCG" customClass="EQNRoundedButton" customModule="Earthquake_Network" customModuleProvider="target">
<rect key="frame" x="8" y="96" width="382" height="40"/>
<constraints>
<constraint firstAttribute="height" constant="40" id="I5V-bX-rod"/>
@@ -2069,16 +2069,16 @@ Sisma rilevato da 10 smartphone</string>
</connections>
</tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="none" indentationWidth="10" reuseIdentifier="SmartphoneNetworkCell" rowHeight="170" id="YUf-dd-IFz" customClass="AlertsSmartphoneNetworkTableViewCell" customModule="Earthquake_Network" customModuleProvider="target">
<rect key="frame" x="0.0" y="1112" width="414" height="170"/>
<rect key="frame" x="0.0" y="1258" width="414" height="170"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="YUf-dd-IFz" id="BkM-63-VOb">
<rect key="frame" x="0.0" y="0.0" width="414" height="170"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ahE-3v-miX">
<view contentMode="scaleToFill" ambiguous="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ahE-3v-miX">
<rect key="frame" x="8" y="8" width="398" height="154"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Smartphone network" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Ngu-Uw-4wO" customClass="EQNEdgeInsetLabel" customModule="Earthquake_Network" customModuleProvider="target">
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Smartphone network" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Ngu-Uw-4wO" customClass="EQNEdgeInsetLabel" customModule="Earthquake_Network" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="164" height="26"/>
<color key="backgroundColor" red="0.50766238939999997" green="0.75272958739999996" blue="0.98132258650000004" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
@@ -2088,16 +2088,16 @@ Sisma rilevato da 10 smartphone</string>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" distribution="equalSpacing" translatesAutoresizingMaskIntoConstraints="NO" id="niE-pg-jos">
<stackView opaque="NO" contentMode="scaleToFill" ambiguous="YES" axis="vertical" distribution="equalSpacing" translatesAutoresizingMaskIntoConstraints="NO" id="niE-pg-jos">
<rect key="frame" x="8" y="30" width="382" height="72"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" tag="10" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" verticalCompressionResistancePriority="749" text="0" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="r3y-EB-oyz">
<label opaque="NO" userInteractionEnabled="NO" tag="10" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" verticalCompressionResistancePriority="749" ambiguous="YES" text="0" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="r3y-EB-oyz">
<rect key="frame" x="0.0" y="0.0" width="382" height="26.5"/>
<fontDescription key="fontDescription" type="system" pointSize="40"/>
<color key="textColor" red="0.0039215686274509803" green="0.70588235294117641" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="smartphones are monitoring for earthquakes" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="dnR-12-9yN">
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="smartphones are monitoring for earthquakes" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="dnR-12-9yN">
<rect key="frame" x="0.0" y="26.5" width="382" height="45.5"/>
<fontDescription key="fontDescription" type="system" pointSize="19"/>
<color key="textColor" name="Gray (dark)"/>
@@ -2105,7 +2105,7 @@ Sisma rilevato da 10 smartphone</string>
</label>
</subviews>
</stackView>
<button opaque="NO" tag="200" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Pkb-ih-spD" customClass="EQNRoundedButton" customModule="Earthquake_Network" customModuleProvider="target">
<button opaque="NO" tag="200" contentMode="scaleToFill" ambiguous="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Pkb-ih-spD" customClass="EQNRoundedButton" customModule="Earthquake_Network" customModuleProvider="target">
<rect key="frame" x="8" y="106" width="382" height="40"/>
<constraints>
<constraint firstAttribute="height" constant="40" id="QAZ-gl-lSE"/>
@@ -2151,16 +2151,16 @@ Sisma rilevato da 10 smartphone</string>
</connections>
</tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" reuseIdentifier="PriorityCell" rowHeight="170" id="gXs-mo-UQM" customClass="AlertsPriorityServiceTableViewCell" customModule="Earthquake_Network" customModuleProvider="target">
<rect key="frame" x="0.0" y="1282" width="414" height="170"/>
<rect key="frame" x="0.0" y="1428" width="414" height="170"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="gXs-mo-UQM" id="ViI-oT-s00">
<rect key="frame" x="0.0" y="0.0" width="414" height="170"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="GF8-ah-qqT">
<view contentMode="scaleToFill" ambiguous="YES" translatesAutoresizingMaskIntoConstraints="NO" id="GF8-ah-qqT">
<rect key="frame" x="8" y="8" width="398" height="154"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Priority service" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="JeR-MS-yEq" customClass="EQNEdgeInsetLabel" customModule="Earthquake_Network" customModuleProvider="target">
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Priority service" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="JeR-MS-yEq" customClass="EQNEdgeInsetLabel" customModule="Earthquake_Network" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="117.5" height="26"/>
<color key="backgroundColor" red="0.50766238939999997" green="0.75272958739999996" blue="0.98132258650000004" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
@@ -2170,16 +2170,16 @@ Sisma rilevato da 10 smartphone</string>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<stackView opaque="NO" contentMode="scaleToFill" verticalHuggingPriority="251" verticalCompressionResistancePriority="751" axis="vertical" distribution="equalSpacing" translatesAutoresizingMaskIntoConstraints="NO" id="zHS-h1-Tdo">
<stackView opaque="NO" contentMode="scaleToFill" verticalHuggingPriority="251" verticalCompressionResistancePriority="751" ambiguous="YES" axis="vertical" distribution="equalSpacing" translatesAutoresizingMaskIntoConstraints="NO" id="zHS-h1-Tdo">
<rect key="frame" x="8" y="34" width="284" height="112"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Be the first to be alerted when a quake is detected real time." textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="1mF-xh-GVj">
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Be the first to be alerted when a quake is detected real time." textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="1mF-xh-GVj">
<rect key="frame" x="0.0" y="0.0" width="284" height="42.5"/>
<fontDescription key="fontDescription" style="UICTFontTextStyleBody"/>
<color key="textColor" name="Gray (dark)"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="A user has subscribed to the service only %d minute ago!" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="3dQ-Eh-0Iw">
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="A user has subscribed to the service only %d minute ago!" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="3dQ-Eh-0Iw">
<rect key="frame" x="0.0" y="69.5" width="284" height="42.5"/>
<fontDescription key="fontDescription" style="UICTFontTextStyleBody"/>
<color key="textColor" red="0.84313725490196079" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
@@ -2187,14 +2187,14 @@ Sisma rilevato da 10 smartphone</string>
</label>
</subviews>
</stackView>
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="priority" translatesAutoresizingMaskIntoConstraints="NO" id="3Hs-fb-4gz">
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" image="priority" translatesAutoresizingMaskIntoConstraints="NO" id="3Hs-fb-4gz">
<rect key="frame" x="296" y="8" width="98" height="95"/>
<constraints>
<constraint firstAttribute="width" constant="98" id="e82-JS-FuC"/>
<constraint firstAttribute="height" constant="95" id="jV5-l5-FhY"/>
</constraints>
</imageView>
<button opaque="NO" tag="10" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Fko-1v-doJ">
<button opaque="NO" tag="10" contentMode="scaleToFill" ambiguous="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Fko-1v-doJ">
<rect key="frame" x="296" y="29.5" width="94" height="95"/>
<constraints>
<constraint firstAttribute="width" constant="94" id="f5j-RJ-bnc"/>
@@ -2234,16 +2234,16 @@ Sisma rilevato da 10 smartphone</string>
</connections>
</tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="none" indentationWidth="10" reuseIdentifier="PositionDataCell" rowHeight="180" id="j9i-Sk-o3g" customClass="AlertsPositionDataTableViewCell" customModule="Earthquake_Network" customModuleProvider="target">
<rect key="frame" x="0.0" y="1452" width="414" height="180"/>
<rect key="frame" x="0.0" y="1598" width="414" height="180"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="j9i-Sk-o3g" id="sTW-Bj-7Bz">
<rect key="frame" x="0.0" y="0.0" width="414" height="180"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="6ZO-bn-4Ts">
<view contentMode="scaleToFill" ambiguous="YES" translatesAutoresizingMaskIntoConstraints="NO" id="6ZO-bn-4Ts">
<rect key="frame" x="8" y="8" width="398" height="164"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Location data" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Fad-hA-QMI" customClass="EQNEdgeInsetLabel" customModule="Earthquake_Network" customModuleProvider="target">
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Location data" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Fad-hA-QMI" customClass="EQNEdgeInsetLabel" customModule="Earthquake_Network" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="106" height="26"/>
<color key="backgroundColor" red="0.50766238939999997" green="0.75272958739999996" blue="0.98132258650000004" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
@@ -2253,20 +2253,20 @@ Sisma rilevato da 10 smartphone</string>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" distribution="equalSpacing" spacing="8" translatesAutoresizingMaskIntoConstraints="NO" id="Da7-5h-Ygg">
<stackView opaque="NO" contentMode="scaleToFill" ambiguous="YES" axis="vertical" distribution="equalSpacing" spacing="8" translatesAutoresizingMaskIntoConstraints="NO" id="Da7-5h-Ygg">
<rect key="frame" x="8" y="34" width="382" height="122"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" spacing="10" translatesAutoresizingMaskIntoConstraints="NO" id="FuC-We-4gX">
<stackView opaque="NO" contentMode="scaleToFill" ambiguous="YES" spacing="10" translatesAutoresizingMaskIntoConstraints="NO" id="FuC-We-4gX">
<rect key="frame" x="0.0" y="0.0" width="382" height="30"/>
<subviews>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="world_old" translatesAutoresizingMaskIntoConstraints="NO" id="bzL-JH-hKh">
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" image="world_old" translatesAutoresizingMaskIntoConstraints="NO" id="bzL-JH-hKh">
<rect key="frame" x="0.0" y="0.0" width="30" height="30"/>
<constraints>
<constraint firstAttribute="height" constant="30" id="jOu-FA-Gwf"/>
<constraint firstAttribute="width" constant="30" id="xV8-FI-pld"/>
</constraints>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="RJa-D0-IZ3">
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="RJa-D0-IZ3">
<rect key="frame" x="40" y="0.0" width="342" height="30"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
@@ -2274,17 +2274,17 @@ Sisma rilevato da 10 smartphone</string>
</label>
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" spacing="10" translatesAutoresizingMaskIntoConstraints="NO" id="jet-Ib-N0B">
<stackView opaque="NO" contentMode="scaleToFill" ambiguous="YES" spacing="10" translatesAutoresizingMaskIntoConstraints="NO" id="jet-Ib-N0B">
<rect key="frame" x="0.0" y="46" width="382" height="30"/>
<subviews>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="sunrise" translatesAutoresizingMaskIntoConstraints="NO" id="AvA-JA-qjr">
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" image="sunrise" translatesAutoresizingMaskIntoConstraints="NO" id="AvA-JA-qjr">
<rect key="frame" x="0.0" y="0.0" width="30" height="30"/>
<constraints>
<constraint firstAttribute="height" constant="30" id="4cB-mI-Zwn"/>
<constraint firstAttribute="width" constant="30" id="9dN-Zk-aJ6"/>
</constraints>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="AHy-jM-xYy">
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="AHy-jM-xYy">
<rect key="frame" x="40" y="0.0" width="342" height="30"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
@@ -2292,17 +2292,17 @@ Sisma rilevato da 10 smartphone</string>
</label>
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" spacing="10" translatesAutoresizingMaskIntoConstraints="NO" id="Fw9-DV-pub">
<stackView opaque="NO" contentMode="scaleToFill" ambiguous="YES" spacing="10" translatesAutoresizingMaskIntoConstraints="NO" id="Fw9-DV-pub">
<rect key="frame" x="0.0" y="92" width="382" height="30"/>
<subviews>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="sunset" translatesAutoresizingMaskIntoConstraints="NO" id="JSz-gM-Yu0">
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" image="sunset" translatesAutoresizingMaskIntoConstraints="NO" id="JSz-gM-Yu0">
<rect key="frame" x="0.0" y="0.0" width="30" height="30"/>
<constraints>
<constraint firstAttribute="width" constant="30" id="Kph-Tq-6Ab"/>
<constraint firstAttribute="height" constant="30" id="NQA-Ro-Xoc"/>
</constraints>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="40V-zE-37M">
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="40V-zE-37M">
<rect key="frame" x="40" y="0.0" width="342" height="30"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
@@ -2418,7 +2418,7 @@ Sisma rilevato da 10 smartphone</string>
<color red="0.10999999940395355" green="0.13300000131130219" blue="0.14900000393390656" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</namedColor>
<namedColor name="Green">
<color red="0.0" green="0.56470588235294117" blue="0.31764705882352939" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<color red="0.0" green="0.56499999761581421" blue="0.31799998879432678" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</namedColor>
<namedColor name="Green (card background)">
<color red="0.58039215686274515" green="0.83137254901960789" blue="0.50980392156862742" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
@@ -0,0 +1,8 @@
"NSLocationAlwaysAndWhenInUseUsageDescription" = "Change to 'Always allow' so we can alert you in real time when an earthquake occurs nearby.";
"NSLocationAlwaysUsageDescription" = "Change to 'Always allow' so we can alert you in real time when an earthquake occurs nearby.";
"NSLocationWhenInUseUsageDescription" = "The app needs to access your location to send you real time seismic alerts.";
"NSPhotoLibraryAddUsageDescription" = "Access to the library is required in order to save the images generated by the app";
"NSCalendarsUsageDescription" = "Access to the calendar is required in order to save the information of the earthquakes of interest";
"NSContactsUsageDescription" = "Access to contacts is required in order to add people to the created events";
"NSUserTrackingUsageDescription" = "Tracking is used to understand if the advertising of the app is effective";
"CFBundleDisplayName" = "منبه الزلازل";
@@ -0,0 +1,224 @@
// notifications
"Allerta sismica in tempo reale" = "تنبيه الزلازل في الوقت الحقيقي";
"Segnalazione utente" = "تقرير المستخدم";
"Segnalazione da rete sismica" = "تقرير الشبكة الزلزالية";
"Rilevato sisma debole a" = "رصد زلزال خفيف في ميلانو %@";
"Rilevato sisma forte a" = "رصد زلزال قوي في ميلانو %@";
"Rilevato sisma a" = "رصد زلزال في ميلانو %@";
"Sisma segnalato da utente a" = "أبلغ المستخدم عن الزلزال في %@";
"Sisma lieve segnalato da utente a" = "Mild quake reported by user at %@"; // replaced by alert_intensity_mild
"Sisma forte segnalato da utente a" = "Strong quake reported by user at %@"; // replaced by alert_intensity_moderate
"Sisma molto forte segnalato da utente a" = "Very strong quake reported by user at %@"; // replaced by alert_intensity_strong
"Sisma rilevato a" = "تم الكشف عن زلزال في %@";
"alert_intensity_no_shaking" = "لم يتم الشعور به في موقعك";
"alert_intensity_mild" = "توقع اهتزاز خفيف أو بدون اهتزاز";
"alert_intensity_moderate" = "توقع اهتزاز متوسط";
"alert_intensity_strong" = "توقع اهتزاز قوي";
// aligned with Android
"drawer_main_settings" = "الاعدادات";
"drawer_main_info" = "معلومات";
"drawer_main_faq" = "الأسئلة المتكررة";
"drawer_main_help" = "مساعدة";
"drawer_author" = "المؤلف";
"drawer_main_sponsors" = "الرعاة";
"drawer_main_disclaimer" = "الأحكام والشروط";
"drawer_privacy" = "الخصوصيات";
"tab_network" = "تنبيهات";
"tab_manual" = "تقارير";
"tab_official" = "الشبكات الزلزالية";
"inapp_available_10k" = "\U200FTop 10K %lu اشتراكات لا تزال متوفرة ليتم تنبيهها في أقل من ثانية واحدة منذ اكتشاف الزلزال";
"inapp_available_100k" = "\U200FTop 100K %lu اشتراكات لا تزال متوفرة ليتم تنبيهها في أقل من 5 ثوان منذ اكتشاف الزلزال";
"filter_magnitude" = "القدر الأدنى";
"filter_distance" = "البعد الأقصى";
"filter_timeframe" = "إطار زمني";
"filter_strong" = "أظهر الزلازل القوية على أي بعد إذا كان من";
"filter_near" = "أظهر الزلازل مهما كانت قوتها إذا كانت أقرب من 50 كم";
"filter_reflect" = "قم بتغيير إعدادات إخطار الزلازل وفقا للمرشحات";
"main_understood" = "مفهوم";
"options_low_magnitude" = "الانتباه إلى أن ليست كل الشبكات الزلزالية توفر بيانات الزلازل التي تقل عن 2.0 درجة. علاوة على ذلك ، فإنك تزيد بشكل كبير من نقل البيانات واستخدام البطارية بسبب الإخطارات. ما لم يتم تصنيع جهازك حديثا ، ستلاحظ أيضا تباطؤا عاما.";
"share_radius100" = "%@ في دائرة نصف قطرها 100 كم";
"official_smartphones" = "تم اكتشاف زلزال في الوقت الفعلي في %@ من الهواتف الذكية. تم إصدار تنبيه.";
"official_reports" = "تم الإشعار من قبل %@ من المستخدمين";
"official_prelimiary" = "تمهيدي";
"calendar_description_nogeo_km" = "\U200Fزلزال M%@، عمق %@ كم.";
"filter_empty" = "إعتمادا على المرشحات والشبكات الزلزالية التي تم تفعيلها, لم تحدث زلازل في آخر 24 ساعة. لتغيير المرشحات انقر على الشريط البنفسجي في الأسفل. لتمكين الشبكات الزلزالية الأخرى ، انقر فوق رمز العالم في الأعلى.";
"official_select_message" = "ستستلم إشعارات فقط من شبكة المراقبة للبلد المحدد وستتضمن القائمة الاكتشافات القادمة من تلك الشبكة فقط. هل تؤكّد؟";
"official_select_confirm" = "قم بالتأكيد على الدولة";
"share_hashtag" = "#زلزال أرضي";
"share_notified" = "قررت من خلال التطبيق منبه الزلازل. قم بتنزيل التطبيق من https://sismo.app/download/ لاستلام تنبيهات في الوقت الفعلي حول #earthquake @SismoDetector";
"manual_sure" = "هل تريد فعلا التنقرير عن زلزال أرضي؟";
"manual_yes" = "نعم";
"filter_filter" = "مرشحات";
"liveview_unknown_location" = "موقفك غير معروف. تمكين موقع الهاتف الذكي من تكوين الهاتف الذكي";
"map_number" = "تم الكشف عن زلزال بواسطة %@ الهواتف الذكية";
"permission_location_no" = "لقد اخترت منع التطبيق من قراءة موقع الجهاز. لن تستلم تنبيهات وإشعارات في الوقت الفعلي";
"permission_location_no_background" = "إخترت منع التطبيق من قراءة موقع جهازك عندما يكون التطبيق في الخلفية. قد لا يتم استلام الاشعارات والتنبيهات في الوقت الحقيقي";
"share_yourtime" = "(توقيتك)";
"official_close" = "أغلق";
"main_share" = "شارك";
"main_simulator" = "محاكي";
"globe_simulation_button" = "حساب وقت التحذير";
"globe_simulation" = "إذا كان مركز الزلزال خارج القرص الأحمر وتم اكتشاف الزلزال على الفور بواسطة الهواتف الذكية ، فستتلقى التنبيه مقدما بأكثر من 5 ثوانٍ. حدد مركز الزلزال المحتمل على الخريطة لحساب وقت التحذير.";
"globe_simulation_outside" = "إختر موقع خارج نطاق القرص الأحمر";
"globe_simulation_inside" = "إختر موقع داخل نطاق القرص الأخضر";
"globe_simulation_message1" = "مع مركز الزلزال هذا ، يجب أن تتلقى التنبيه مقدما %.0f ثانية. ومع ذلك ، سيتم تنبيه %.0f شخصًا قبلك. وقت التحذير سيكون %.0f ثانية. من خلال الاشتراك الآن في خدمة الأفضلية TOP 10K، سيتم تنبيه %.0f من الأشخاص فقط قبلك (بموجب البعد عن مركز الزلزال)";
"globe_simulation_message2" = "مع مركز الزلزال هذا ، يجب أن تتلقى التنبيه مقدما %.0f ثانية. ومع ذلك ، سيتم تنبيه %.0f شخصًا قبلك. سوف تتلقى التنبيه بعد %.0f ثانية من الموجات الزلزالية. من خلال الاشتراك الآن في خدمة الأفضلية TOP 10K، سيتم تنبيه %.0f من الأشخاص فقط قبلك (بموجب البعد عن مركز الزلزال)";
"globe_simulation_message3" = "مع مركز الزلزال هذا ، يجب أن تتلقى التنبيه مقدما %.0f ثانية. ومع ذلك ، سيتم تنبيه %.0f شخصًا قبلك. من خلال الاشتراك الآن في خدمة الأفضلية TOP 10K، سيتم تنبيه %.0f من الأشخاص فقط قبلك (بموجب البعد عن مركز الزلزال)";
"globe_simulation_message4" = "مع مركز الزلزال هذا ، بفضل خدمة الأولوية %.0f، يجب أن تتلقى التنبيه مقدمًا قبل %.0fثانية. فقط %.0f شخصا سيتم تنبيههم قبلك";
"globe_simulation_message5" = "مع مركز الزلزال هذا ، بفضل خدمة الأولوية %.0f، يجب أن تتلقى التنبيه مقدمًا قبل %.0f ثانية. سيتم تنبيه %.0f شخصًا قبلك. لزيادة وقت التحذير ، يمكنك الاشتراك في خدمة الأولوية %.0f";
"globe_simulation_message6" = "مع مركز الزلزال هذا ، بفضل خدمة الأولوية %.0f، يجب أن تتلقى التنبيه مقدمًا قبل %.0fثانية. ستكون أول من يتم تنبيهه";
"globe_simulation_priority" = "خدمة الأولوية";
"status_cancel" = "ألغي";
"options_near_alert" = "قم بالإبلاغ عن الزلازل مهما كانت قوتها إذا كانت المسافة أقل من 50 كم";
"options_alarms" = "تنبيه بوقت فعلي";
"options_notification_enable_alarm" = "قم بتفعيل الإنذار عند اكتشاف زلزال في الوقت الفعلي بواسطة شبكة الهواتف الذكية";
"options_notification_official" = "إخطارات الشبكة الزلزالية";
"options_notification_enable_official" = "استلم بلاغات الزلازل المكتشفة من قبل الشبكات الزلزالية الوطنية والدولية";
"options_agencies" = "الشبكات الزلزالية";
"options_radius" = "المجال من موقعك";
"options_energy" = "طاقة الزلزال";
"options_near" = "بالقرب من الزلازل الأرضية";
"options_strong" = "زلازل قوية";
"options_strong_alert" = "قم بالإخطار عن الزلازل على أي مسافة إذا كان حجمها أعلى من";
"options_strong_magnitude" = "درجة";
"options_notification_manual" = "إشعارات تقرير المستخدم";
"options_notification_enable_manual" = "استلم الإخطارات للزلازل التي أبلغ عنها يدويا من قبل المستخدمين";
"main_areacheck_message" = "في الوقت الحالي ، يوجد في منطقتك %s هواتف ذكية تراقب الزلازل في الوقت الفعلي. قدرة شبكة الهاتف الذكي على اكتشاف الزلازل في الوقت الفعلي هي%@. لتحسين اكتشاف الزلازل في منطقتك ، شارك التطبيق مع عائلتك وأصدقائك ، شكرًا!";
"main_version" = "نموذج";
"app_name" = "منبه الزلازل";
"official_depth" = "العمق:";
"manual_nolocation" = "موقعك غير معروف ولذلك ليس من الممكن التقرير عن الزلزال الأرضي";
"manual_wait" = "عليك الانتظار على الأقل لمدة 5 دقائق منذ تقريرك الأخير";
"manual_ok" = "تم استلام التقرير. سيظهر تقريرك على الخريطة فقط إذا تم الإبلاغ عن الزلزال من قبل عدد كاف من المستخدمين في المنطقة.";
"manual_error" = "هناك خطأ ما";
"main_map" = "تقارير في آخر 24 ساعة";
"official_button_map" = "خريطة";
"main_feel" = "شعرت بزلزال!";
"network_pro" = "PRO نموذج";
"network_pro_convert" = "ابدأ التحويل";
"inapp_active" = "تفعيل التسجيل";
"inapp_nosub" = "لا توجد تسجيلات فعالة";
"inapp_list" = "خدمة الأولوية";
"inapp_description" = "يتلقى جميع المستخدمين تنبيهات عند اكتشاف زلزال في الوقت الفعلي. ومع ذلك ، يستغرق تنبيه الجميع ما يصل إلى 30 ثانية لأنه ليس من الممكن تقنيًا القيام بذلك على الفور. يمكنك الآن الانضمام إلى قوائم الأولوية لأول 10000 أو 100000 شخص تم تنبيههم. يكون ترتيب التنبيه على النحو التالي: أولاً جميع المستخدمين الذين لديهم خدمة TOP 10K ، ثم جميع المستخدمين الذين لديهم خدمة TOP 100K وأخيراً جميع المستخدمين الآخرين. مع الخدمة المتساوية ، يعتمد ترتيب التنبيه على المسافة من مركز الزلزال.";
"permission_location_no_background_solve" = "حل المشكلة";
"main_share_app" = "شارك التطبيق";
"main_vote" = "قيّم التطبيق";
"main_twitter_see" = "التبيين في تويتر";
"map_smartphone_magnitude" = "سيتم تقدير قوة الزلزال بواسطة الشبكة الزلزالية الوطنية وسيظهر في علامة تبويب الشبكات الزلزالية في التطبيق";
"main_alerttest" = "تنبيه اختياري";
"main_simulator" = "محاكي";
"main_how_it_work" = "كيف يعمل";
"main_past_quakes" = "تنبيهات زلزالية سابقة";
"main_total_quakes" = "منذ عام 2013: %lu";
"main_recent_quakes" = "آخر 24 ساعة: %lu";
"main_total_quakes_initial" = "منذ عام 2013: 0";
"main_recent_quakes_initial" = "آخر 24 ساعة: 0";
"main_network" = "شبكة الهواتف الذكية";
"main_monitoring_currently2" = "الهواتف الذكية تراقب الزلازل";
"main_coverage" = "تغطية محلية";
"inapp_list" = "خدمة الأولوية";
"inapp_adv" = "كن أول من يتم تبليغه عند الكشف عن زلزال في الوقت الفعلي.";
"weather_location" = "بيانات الموقع";
"main_nodetection" = "لم يتلق هاتفك الذكي أي تنبيه في الوقت الفعلي مؤخرا";
"official_select_country" = "لتنقية قائمة الزلازل الأرضية، إختر دولتك";
"official_select_or" = "أو";
"official_select_networks" = "قم بإدارة شبكات الزلازل";
"official_card_settings" = "إعدادات البطاقة";
"official_card_distance" = "البعد";
"official_card_coordinates" = "الاحداثيات";
"official_card_population" = "عدد السكان";
"main_share_text" = "\U200Fمرحبا! أقترح عليك تطبيق مشروع Earthquake Network مع تنبيهات في الوقت الفعلي. التحميل عن طريق https://sismo.app/download";
"mercalli_II" = "\U200FII - بالكاد يدرك";
"mercalli_III" = "\U200FIII - إهتزازات مشابهة لشاحنة تمر بالجوار";
"mercalli_IV" = "\U200FIV - إهتزازات النوافذ, إهتزاز خفيف للأشياء المعلقة";
"mercalli_V" = "\U200FV - سقوط لأغراض عن الرفوف";
"mercalli_VI" = "\U200FVI - شقوق صغيرة في المباني و إنكسار الشبابيك";
"mercalli_VII" = "\U200FVII - أضرار في المباني وصعوبة على أن تبقى واقفة";
"mercalli_VIII" = "\U200FVIII - أضرار واضحة في المباني وانهيارات جزئية";
"mercalli_IX" = "\U200FIX - إنهيارات مستمرة في المباني ، ووقوع الناس على الأرض";
"mercalli_X" = "\U200FX - إنهارت مبان كاملة";
"mercalli_XI" = "\U200FXI - تدمير مراكز حضرية بأكملها ، العديد من الضحايا ، شقوق في الأرض وانهيارات أرضيةlandslides";
"mercalli_XII" = "\U200FXII - اضطراب التربة ، إزاحة قشرة الأرض";
"mercalli_intensity" = "شدة %@";
// values
"official_magnitude_value_00" = "درجة >= 0.0";
"official_magnitude_value_05" = "درجة >= 0.5";
"official_magnitude_value_10" = "درجة >= 1.0";
"official_magnitude_value_15" = "درجة >= 1.5";
"official_magnitude_value_20" = "درجة >= 2.0";
"official_magnitude_value_25" = "درجة >= 2.5";
"official_magnitude_value_30" = "درجة >= 3.0";
"official_magnitude_value_35" = "درجة >= 3.5";
"official_magnitude_value_40" = "درجة >= 4.0";
"official_magnitude_value_45" = "درجة >= 4.5";
"official_magnitude_value_50" = "درجة >= 5.0";
"official_magnitude_value_55" = "درجة >= 5.5";
"official_magnitude_value_60" = "درجة >= 6.0";
"official_magnitude_value_65" = "درجة >= 6.5";
"official_magnitude_value_70" = "درجة >= 7.0";
"official_magnitude_value_75" = "درجة >= 7.5";
"eqn_timeframe_last_month" = "آخر شهر";
"eqn_timeframe_last_day" = "آخر يوم";
"eqn_timeframe_last_week" = "آخر أسبوع";
"eqn_timeframe_last_hour" = "آخر ساعة";
"report_timeframe_one_day" = "يوم واحد";
"report_timeframe_twelve_hours" = "إثنا عشر ساعة";
"report_timeframe_six_hours" = "ست ساعات";
"report_timeframe_two_hours" = "ساعتان";
"report_timeframe_one_hour" = "ساعة واحدة";
"report_timeframe_ten_minutes" = "عشر دقائق";
"radius_any_distance" = "أي بعد";
"official_distance" = "\U200F%lu كم من موقعك";
"configuration_countries_united_states" = "الولايات المتحدة";
"configuration_countries_italy" = "إيطاليا";
"configuration_countries_spain" = "إسبانيا";
"configuration_countries_china" = "الصين";
"configuration_countries_japan" = "اليابان";
"configuration_countries_nicaragua" = "نيكاراغوا";
"configuration_countries_mexico" = "المكسيك";
"configuration_countries_colombia" = "كولومبيا";
"configuration_countries_costa_rica" = "كوستا ريكا";
"configuration_countries_cila" = "تشيلي";
"configuration_countries_venezuela" = "فنزويلا";
"configuration_countries_new_zeland" = "نيوزيلندا";
"configuration_countries_argentina" = "الأرجنتين";
"configuration_countries_ecuador" = "الاكوادور";
"configuration_countries_philippines" = "فيلبيني";
"configuration_countries_peru" = "بيرو";
"configuration_countries_dominican_republic" = "جمهورية الدومينيكان";
"configuration_countries_puerto_rico" = "بورتوريكو";
"configuration_countries_turkey" = "ديك رومى";
"configuration_countries_india" = "الهند";
"configuration_countries_greece" = "اليونان";
"configuration_countries_france" = "فرنسا";
"configuration_countries_croatia" = "كرواتيا";
"configuration_countries_other" = "بلدان اخرى";
"youtube_video" = "https://www.youtube.com/watch?v=BqaW97fJFZc";
// ios only
"network_pro_privacy_disclaimer" = "إخلاء المسؤولية عن الخصوصية";
"network_pro_terms_conditions" = "الأحكام والشروط";
"inapp_detail_description" = "• سيتم تحميل مدفوعاتك على حساب iTunes الخاص بك عند تأكيد الشراء \n • يتم تجديد الاشتراك تلقائيًا ما لم يتم إلغاء تنشيط التجديد التلقائي قبل 24 ساعة على الأقل من نهاية الفترة الحالية \n • سيتم فرض رسوم على التجديد خلال 24 ساعة ساعات قبل نهاية الفترة الحالية وتكلفة التجديد المحددة \n • يمكن إدارة الاشتراكات من قبل المستخدم ويمكن إلغاء تنشيط التجديد التلقائي من خلال الوصول إلى إعدادات حساب المستخدم بعد الشراء.";
"inapp_lifetime_detail_description" = "• سيتم تحميل دفعتك على حساب iTunes الخاص بك عند تأكيد الشراء";
"inapp_purchase" = "اشترك في الخدمة";
"official_select_country_placeholder" = "اختر الدولة";
"inapp_lifetime_subscriptions" = "اشتراكات مدى الحياة";
"inapp_yearly_subscriptions" = "الاشتراكات السنوية";
"inapp_monthly_subscriptions" = "الاشتراكات الشهرية";
"inapp_monthly_payment" = "ستدفع شهريا:";
"inapp_yearly_payment" = "ستدفع كل عام:";
"inapp_lifetime_payment" = "سوف تدفع:";
"ok" = "تمام";
"critical_alerts_setting" = "التنبيهات الحرجة. قم بإصدار صوت أيضًا في وضع عدم الإزعاج";
"attention" = "انتباه";
"official_no_country_selected" = "لم تقم بتحديد أي بلد";
"report" = "التقارير";
"purchase_pro_restore" = "يعيد";
"purchase_pro_restore_alert_title" = "اكتملت الاستعادة";
"purchase_pro_restore_alert_message" = "لقد استعدت المنتج الذي اشتريته";
"purchase_pro_no_subscriptions_alert_message" = "لم يتم العثور على شراء للاستعادة. تأكد من تسجيل الدخول إلى الحساب الذي تم الشراء به.";
"calendar_missing_permission" = "لا يمكن فتح التقويم ، تأكد من تعيين الأذونات الصحيحة.";
"error_server_registration" = "لم يكن من الممكن التسجيل في خادم التطبيق. التسجيل مطلوب لتلقي التنبيهات في الوقت الحقيقي وإشعارات الزلازل.";
"retry" = "أعد المحاولة";
@@ -0,0 +1,200 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>manual_minutes_ago</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@VARIABLE@</string>
<key>VARIABLE</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>zero</key>
<string>الآن</string>
<key>one</key>
<string>قبل دقيقة</string>
<key>two</key>
<string>قبل دقيقتين</string>
<key>few</key>
<string>قبل %d دقائق</string>
<key>many</key>
<string>قبل %d دقيقة</string>
<key>other</key>
<string>قبل %d دقيقة</string>
</dict>
</dict>
<key>manual_hours_ago</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@VARIABLE@</string>
<key>VARIABLE</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>zero</key>
<string>الآن</string>
<key>one</key>
<string>قبل ساعة</string>
<key>two</key>
<string>قبل ساعتين</string>
<key>few</key>
<string>قبل %d ساعات</string>
<key>many</key>
<string>قبل %d ساعة </string>
<key>other</key>
<string>قبل %d ساعة</string>
</dict>
</dict>
<key>manual_days_ago</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@VARIABLE@</string>
<key>VARIABLE</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>zero</key>
<string>الآن</string>
<key>one</key>
<string>قبل يوم</string>
<key>two</key>
<string>قبل يومين</string>
<key>few</key>
<string>قبل %d أيام</string>
<key>many</key>
<string>قبل %d يوم</string>
<key>other</key>
<string>قبل %d يوم</string>
</dict>
</dict>
<key>inapp_adv_minutes</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@VARIABLE@</string>
<key>VARIABLE</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>zero</key>
<string>>قام مستخدم بالاشتراك في الخدمة منذ %d دقيقة فقط</string>
<key>one</key>
<string>قام مستخدم بالاشتراك في الخدمة منذ دقيقة فقط!</string>
<key>two</key>
<string>قام مستخدم بالاشتراك في الخدمة منذ دقيقتين فقط!</string>
<key>few</key>
<string>قام مستخدم بالاشتراك في الخدمة منذ %d دقائق فقط!</string>
<key>many</key>
<string>قام مستخدم بالاشتراك في الخدمة منذ %d دقيقة فقط!</string>
<key>other</key>
<string>قام مستخدم بالاشتراك في الخدمة منذ %d دقيقة فقط!</string>
</dict>
</dict>
<key>inapp_adv_hours</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@VARIABLE@</string>
<key>VARIABLE</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>zero</key>
<string>قام مستخدم بالاشتراك في الخدمة منذ %d ساعات فقط!</string>
<key>one</key>
<string>قام مستخدم بالاشتراك في الخدمة منذ ساعة فقط!</string>
<key>two</key>
<string>قام مستخدم بالاشتراك في الخدمة منذ ساعتين فقط!</string>
<key>few</key>
<string>قام مستخدم بالاشتراك في الخدمة منذ %d ساعات فقط!</string>
<key>many</key>
<string>قام مستخدم بالاشتراك في الخدمة منذ %d ساعات فقط!</string>
<key>other</key>
<string>قام مستخدم بالاشتراك في الخدمة منذ %d ساعات فقط!</string>
</dict>
</dict>
<key>inapp_adv_days</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@VARIABLE@</string>
<key>VARIABLE</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>zero</key>
<string>قام مستخدم بالاشتراك في الخدمة منذ %d يوم فقط.</string>
<key>one</key>
<string>قام مستخدم بالاشتراك في الخدمة منذ يوم فقط.</string>
<key>two</key>
<string>قام مستخدم بالاشتراك في الخدمة منذ يومين فقط.</string>
<key>few</key>
<string>قام مستخدم بالاشتراك في الخدمة منذ %d أيام فقط.</string>
<key>many</key>
<string>قام مستخدم بالاشتراك في الخدمة منذ %d يوم فقط.</string>
<key>other</key>
<string>قام مستخدم بالاشتراك في الخدمة منذ %d يوم فقط.</string>
</dict>
</dict>
<key>alert_wave</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@VARIABLE@</string>
<key>VARIABLE</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>zero</key>
<string>موجة زلزالية في %d ثانية</string>
<key>one</key>
<string>موجة زلزالية في %d ثانية</string>
<key>two</key>
<string>موجة زلزالية في %d ثانية</string>
<key>few</key>
<string>موجة زلزالية في %d ثوان</string>
<key>many</key>
<string>موجة زلزالية في %d ثانية</string>
<key>other</key>
<string>موجة زلزالية في %d ثانية</string>
</dict>
</dict>
<!-- keep just as template -->
<key>StringKey</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@VARIABLE@</string>
<key>VARIABLE</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string></string>
<key>zero</key>
<string></string>
<key>one</key>
<string></string>
<key>two</key>
<string></string>
<key>few</key>
<string></string>
<key>many</key>
<string></string>
<key>other</key>
<string></string>
</dict>
</dict>
</dict>
</plist>
+3 -3
View File
@@ -1,5 +1,5 @@
# Uncomment the next line to define a global platform for your project
platform :ios, '12.0'
platform :ios, '13.0'
use_frameworks!
@@ -12,11 +12,11 @@ target 'Earthquake Network' do
pod 'Solar'
end
# Force Deployment Target to 12.0 in order to silece Xcode warnings
# Force Deployment Target to 13.0 in order to silece Xcode warnings
post_install do |pi|
pi.pods_project.targets.each do |t|
t.build_configurations.each do |config|
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.0'
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '13.0'
end
end
end
+41 -41
View File
@@ -6,15 +6,15 @@ PODS:
- FBAEMKit (= 16.1.3)
- FBSDKCoreKit_Basics (= 16.1.3)
- FBSDKCoreKit_Basics (16.1.3)
- FirebaseCore (10.12.0):
- FirebaseCore (10.13.0):
- FirebaseCoreInternal (~> 10.0)
- GoogleUtilities/Environment (~> 7.8)
- GoogleUtilities/Logger (~> 7.8)
- FirebaseCoreExtension (10.12.0):
- FirebaseCoreExtension (10.13.0):
- FirebaseCore (~> 10.0)
- FirebaseCoreInternal (10.12.0):
- FirebaseCoreInternal (10.13.0):
- "GoogleUtilities/NSData+zlib (~> 7.8)"
- FirebaseCrashlytics (10.12.0):
- FirebaseCrashlytics (10.13.0):
- FirebaseCore (~> 10.5)
- FirebaseInstallations (~> 10.0)
- FirebaseSessions (~> 10.5)
@@ -22,12 +22,12 @@ PODS:
- GoogleUtilities/Environment (~> 7.8)
- nanopb (< 2.30910.0, >= 2.30908.0)
- PromisesObjC (~> 2.1)
- FirebaseInstallations (10.12.0):
- FirebaseInstallations (10.13.0):
- FirebaseCore (~> 10.0)
- GoogleUtilities/Environment (~> 7.8)
- GoogleUtilities/UserDefaults (~> 7.8)
- PromisesObjC (~> 2.1)
- FirebaseMessaging (10.12.0):
- FirebaseMessaging (10.13.0):
- FirebaseCore (~> 10.0)
- FirebaseInstallations (~> 10.0)
- GoogleDataTransport (~> 9.2)
@@ -36,7 +36,7 @@ PODS:
- GoogleUtilities/Reachability (~> 7.8)
- GoogleUtilities/UserDefaults (~> 7.8)
- nanopb (< 2.30910.0, >= 2.30908.0)
- FirebaseSessions (10.12.0):
- FirebaseSessions (10.13.0):
- FirebaseCore (~> 10.5)
- FirebaseCoreExtension (~> 10.0)
- FirebaseInstallations (~> 10.0)
@@ -44,61 +44,61 @@ PODS:
- GoogleUtilities/Environment (~> 7.10)
- nanopb (< 2.30910.0, >= 2.30908.0)
- PromisesSwift (~> 2.1)
- Google-Mobile-Ads-SDK (10.8.0):
- Google-Mobile-Ads-SDK (10.9.0):
- GoogleAppMeasurement (< 11.0, >= 7.0)
- GoogleUserMessagingPlatform (>= 1.1)
- GoogleAppMeasurement (10.12.0):
- GoogleAppMeasurement/AdIdSupport (= 10.12.0)
- GoogleAppMeasurement (10.13.0):
- GoogleAppMeasurement/AdIdSupport (= 10.13.0)
- GoogleUtilities/AppDelegateSwizzler (~> 7.11)
- GoogleUtilities/MethodSwizzler (~> 7.11)
- GoogleUtilities/Network (~> 7.11)
- "GoogleUtilities/NSData+zlib (~> 7.11)"
- nanopb (< 2.30910.0, >= 2.30908.0)
- GoogleAppMeasurement/AdIdSupport (10.12.0):
- GoogleAppMeasurement/WithoutAdIdSupport (= 10.12.0)
- GoogleAppMeasurement/AdIdSupport (10.13.0):
- GoogleAppMeasurement/WithoutAdIdSupport (= 10.13.0)
- GoogleUtilities/AppDelegateSwizzler (~> 7.11)
- GoogleUtilities/MethodSwizzler (~> 7.11)
- GoogleUtilities/Network (~> 7.11)
- "GoogleUtilities/NSData+zlib (~> 7.11)"
- nanopb (< 2.30910.0, >= 2.30908.0)
- GoogleAppMeasurement/WithoutAdIdSupport (10.12.0):
- GoogleAppMeasurement/WithoutAdIdSupport (10.13.0):
- GoogleUtilities/AppDelegateSwizzler (~> 7.11)
- GoogleUtilities/MethodSwizzler (~> 7.11)
- GoogleUtilities/Network (~> 7.11)
- "GoogleUtilities/NSData+zlib (~> 7.11)"
- nanopb (< 2.30910.0, >= 2.30908.0)
- GoogleDataTransport (9.2.3):
- GoogleDataTransport (9.2.5):
- GoogleUtilities/Environment (~> 7.7)
- nanopb (< 2.30910.0, >= 2.30908.0)
- PromisesObjC (< 3.0, >= 1.2)
- GoogleUserMessagingPlatform (2.0.1)
- GoogleUtilities/AppDelegateSwizzler (7.11.1):
- GoogleUserMessagingPlatform (2.1.0)
- GoogleUtilities/AppDelegateSwizzler (7.11.5):
- GoogleUtilities/Environment
- GoogleUtilities/Logger
- GoogleUtilities/Network
- GoogleUtilities/Environment (7.11.1):
- GoogleUtilities/Environment (7.11.5):
- PromisesObjC (< 3.0, >= 1.2)
- GoogleUtilities/Logger (7.11.1):
- GoogleUtilities/Logger (7.11.5):
- GoogleUtilities/Environment
- GoogleUtilities/MethodSwizzler (7.11.1):
- GoogleUtilities/MethodSwizzler (7.11.5):
- GoogleUtilities/Logger
- GoogleUtilities/Network (7.11.1):
- GoogleUtilities/Network (7.11.5):
- GoogleUtilities/Logger
- "GoogleUtilities/NSData+zlib"
- GoogleUtilities/Reachability
- "GoogleUtilities/NSData+zlib (7.11.1)"
- GoogleUtilities/Reachability (7.11.1):
- "GoogleUtilities/NSData+zlib (7.11.5)"
- GoogleUtilities/Reachability (7.11.5):
- GoogleUtilities/Logger
- GoogleUtilities/UserDefaults (7.11.1):
- GoogleUtilities/UserDefaults (7.11.5):
- GoogleUtilities/Logger
- nanopb (2.30909.0):
- nanopb/decode (= 2.30909.0)
- nanopb/encode (= 2.30909.0)
- nanopb/decode (2.30909.0)
- nanopb/encode (2.30909.0)
- PromisesObjC (2.2.0)
- PromisesSwift (2.2.0):
- PromisesObjC (= 2.2.0)
- PromisesObjC (2.3.1)
- PromisesSwift (2.3.1):
- PromisesObjC (= 2.3.1)
- Solar (2.1.0)
DEPENDENCIES:
@@ -137,23 +137,23 @@ SPEC CHECKSUMS:
FBAEMKit: af2972f39bb0f3f7c45998f435b007833c32ffb2
FBSDKCoreKit: 19e2e18b3be578d7a51fed8fdd8c152bef0b9511
FBSDKCoreKit_Basics: dd9826ce3c9fd9f8cdf8dbbd0ef0a53e6c0c9e7e
FirebaseCore: f86a1394906b97ac445ae49c92552a9425831bed
FirebaseCoreExtension: 0ce5ac36042001cfa233ce7bfa28e5c313cf80f4
FirebaseCoreInternal: 950500ad8a08963657f6d8c67b579740c06d6aa1
FirebaseCrashlytics: c4d111b7430c49744c74bcc6346ea00868661ac8
FirebaseInstallations: 7b99ef103f013624444c614397038219c45f8e63
FirebaseMessaging: bb2c4f6422a753038fe137d90ae7c1af57251316
FirebaseSessions: a4ee211eeb31a2224cd8d9d4e30a0fccde9aa00c
Google-Mobile-Ads-SDK: 69daa7fb42061b425340706e382e87fab3e666a3
GoogleAppMeasurement: 2d800fab85e7848b1e66a6f8ce5bca06c5aad892
GoogleDataTransport: f0308f5905a745f94fb91fea9c6cbaf3831cb1bd
GoogleUserMessagingPlatform: 5f8b30daf181805317b6b985bb51c1ff3beca054
GoogleUtilities: 9aa0ad5a7bc171f8bae016300bfcfa3fb8425749
FirebaseCore: 9948a31ff2c6cf323f9b040068201a95d271b68d
FirebaseCoreExtension: ce60f9db46d83944cf444664d6d587474128eeca
FirebaseCoreInternal: b342e37cd4f5b4454ec34308f073420e7920858e
FirebaseCrashlytics: 4679fbc4768fcb4dd6f5533101841d40256d4475
FirebaseInstallations: b28af1b9f997f1a799efe818c94695a3728c352f
FirebaseMessaging: c2b782a6af3058b6e53ac2a6eaab84c5786200c8
FirebaseSessions: 991fb4c20b3505eef125f7cbfa20a5b5b189c2a4
Google-Mobile-Ads-SDK: e81e8b009a182dc8dd14951782efdbb30a5e4510
GoogleAppMeasurement: 3ae505b44174bcc0775f5c86cecc5826259fbb1e
GoogleDataTransport: 54dee9d48d14580407f8f5fbf2f496e92437a2f2
GoogleUserMessagingPlatform: dce302b8f1b84d6e945812ee7a15c3f65a102cbf
GoogleUtilities: 13e2c67ede716b8741c7989e26893d151b2b2084
nanopb: b552cce312b6c8484180ef47159bc0f65a1f0431
PromisesObjC: 09985d6d70fbe7878040aa746d78236e6946d2ef
PromisesSwift: cf9eb58666a43bbe007302226e510b16c1e10959
PromisesObjC: c50d2056b5253dadbd6c2bea79b0674bd5a52fa4
PromisesSwift: 28dca69a9c40779916ac2d6985a0192a5cb4a265
Solar: 2dc6e7cc39186cb0c8228fa08df76fb50c7d8f24
PODFILE CHECKSUM: d1702281e78deff520792b6eb9ce54ffd0e034c5
PODFILE CHECKSUM: a4027fde148a2d0a7a4303b78175c16623cf3a1a
COCOAPODS: 1.12.1