Compare commits

...

32 Commits

Author SHA1 Message Date
Andrea Busi cae5fee992 feat: Remove same type posted notifications
Resolves: https://gitlab.steamware.net/eqn/eqn.ios/-/issues/48
2022-05-30 16:02:46 +02:00
Andrea Busi 53b8c0fab4 release: Increase version for release 2022-05-29 22:16:19 +02:00
Andrea Busi 8751d3c8f2 fix: Solve crazy behaviour with iOS 15 2022-05-29 22:14:06 +02:00
Andrea Busi 2d333f993b feat: Make slider with step values 2022-05-29 22:13:46 +02:00
Andrea Busi 22d421f1cc refactor: Add debug log 2022-05-26 21:51:30 +02:00
Andrea Busi cec8b39fc7 fix: Be sure to update push token in Firebase 2022-05-26 21:51:08 +02:00
Andrea Busi 5ceaa4a8be fix: Save user position after server registration 2022-05-26 18:06:37 +02:00
Andrea Busi 94bdb9dbe1 fix: Don't try to parse nil data 2022-05-26 18:06:27 +02:00
Andrea Busi ee1b762032 fix: Call callback for position endpoint 2022-05-26 18:06:13 +02:00
Andrea Busi 5a6c5a5cfc release: Increase version for release 2022-05-22 21:31:58 +02:00
Andrea Busi d55b2ec98f fix: Solve wrong value save in settings 2022-05-22 21:31:50 +02:00
Andrea Busi 761ebc1d17 release: Increase version for release 2022-05-22 11:54:06 +02:00
Andrea Busi dd5e8862ed fix: Don't reload entire table view in settings, to avoid strange behaviour with iOS 15 2022-05-22 11:53:23 +02:00
Andrea Busi ceca3ed50d fix: Remove wrong translatesAutoresizingMaskIntoConstraints for cell views 2022-05-22 11:28:07 +02:00
Andrea Busi 6cce448acf release: Increase version for release 2022-05-20 18:37:45 +02:00
Andrea Busi 5ddb8da902 chore: Add project icon for SourceTree 2022-05-20 18:36:31 +02:00
Andrea Busi 644002a792 fix: Solve layout issue in seismic card 2022-05-20 18:35:26 +02:00
Andrea Busi e902969c9a release: Increase version for release 2022-05-19 11:26:56 +02:00
Andrea Busi 57c2ca5ae9 refactor: Disable ads
Resolves: https://gitlab.steamware.net/eqn/eqn.ios/-/issues/46
2022-05-19 11:26:50 +02:00
Andrea Busi 107d4c7600 fix: Remove broken reference 2022-05-19 11:26:33 +02:00
Andrea Busi 6a41f4558a dependency: Update Pods
Resolves: https://gitlab.steamware.net/eqn/eqn.ios/-/issues/45
2022-05-19 11:26:33 +02:00
Andrea Busi 995a6011d5 chore: Update certificates and profiles 2022-05-19 11:26:33 +02:00
Andrea Busi fcb3ab5be1 release: Update changelog 2022-05-19 11:26:33 +02:00
Andrea Busi f8c7edf588 refactor: Hide pro version section in home
Resolves: https://gitlab.steamware.net/eqn/eqn.ios/-/issues/43
2022-05-19 11:26:28 +02:00
Andrea Busi 4bb77e2921 refactor: Use new icon
Resolves: https://gitlab.steamware.net/eqn/eqn.ios/-/issues/43
2022-05-19 11:26:22 +02:00
Andrea Busi d399e0b37b refactor: Replace deprecated 'class' in protocol definition
Also remove not needed @objc declaration

Resolves: https://gitlab.steamware.net/eqn/eqn.ios/-/issues/44
2022-05-19 11:25:22 +02:00
Andrea Busi a85fbe56be release: Increase version for release 2021-04-23 14:02:20 +02:00
Andrea Busi cf97c3cb61 fix: Properly handle new subscriptions also in detail page 2021-04-23 14:02:20 +02:00
Andrea Busi 7611e3eb15 feat: Add button to show/hide some cards in alerts section
Resolves: https://gitlab.steamware.net/eqn/eqn.ios/-/issues/42
2021-04-23 14:02:20 +02:00
Andrea Busi 4369284fb7 refactor: Align UI style in subscriptions and pro version page 2021-04-23 14:02:20 +02:00
Andrea Busi 0e4fadd666 feat: Handle new lifetime subscriptions
Resolves: https://gitlab.steamware.net/eqn/eqn.ios/-/issues/41
2021-04-23 14:02:20 +02:00
Andrea Busi 6622256339 refactor: Improve code in VersioneProProducts class 2021-04-23 10:33:22 +02:00
72 changed files with 638 additions and 359 deletions
+38
View File
@@ -1,5 +1,43 @@
# Changelog
## Versione 5.0.3
### Build (89)
- Corretto problema con ultima posizione non salvata in app
- Forzato aggiornamento Firebase
- Corretti metodi deprecati in salvataggio dati
- Corretti comportamento filtri con iOS 15
- Slider con valori a step
## Versione 5.0.2
### Build (88)
- Corretto errato salvataggio raggio sismi forti in allerte tempo reale
## Versione 5.0.1
### Build (87)
- Corretto problema con slider in impostazioni
## Versione 5.0
### Build (86)
- Corretto problema layout in schede sismi
### Build (85)
- Nuova icona
- Nascosta sezione 'pro'
- Aggiornamento ad Xcode 13
- Disabilitati ads
## Versione 4.2
### Build (84)
- Corretti errori in nuovi sviluppi
### Build (83)
- Aggiunto supporto per abbonamenti a vita
- Allineata UI in sezione abbonamenti e versione pro
## Versione 4.1.1
### Build (82)
- Corretti placeholder in stringhe
@@ -2,3 +2,4 @@
// Use this file to import your target's public headers that you would like to expose to Swift.
//
#import "NotificationService.h"
@@ -0,0 +1,42 @@
//
// NotificationService+Extension.swift
// EQNNotificationService
//
// Created by Andrea Busi on 28/05/22.
// Copyright © 2022 Earthquake Network. All rights reserved.
//
import Foundation
import UserNotifications
extension NotificationService {
@objc(removeNotificationsForType:completion:)
func removeNotifications(
for type: String?,
completion: @escaping() -> Void
) {
guard let type = type else {
completion()
return
}
let notificationCenter = UNUserNotificationCenter.current()
notificationCenter.getDeliveredNotifications { notifications in
let sameTypeNotifications = notifications.filter { notification in
let payload = notification.request.content.userInfo
if let notificationType = payload["type"] as? String {
return notificationType == type
}
return false
}
let identifiers = sameTypeNotifications.map { $0.request.identifier }
notificationCenter.removeDeliveredNotifications(withIdentifiers: identifiers)
completion()
}
}
}
@@ -9,6 +9,8 @@
#import "NotificationService.h"
#import "EQNAllertaSismica.h"
#import "Costanti.h"
#import "EQNNotificationService-Swift.h"
@interface NotificationService ()
@@ -158,7 +160,10 @@ static NSString * const EQNSoundNotificationEQN = @"alert_sound.wav";
}
}
[self contentComplete];
// remove same type posted notification
[self removeNotificationsForType:notificationType completion:^{
[self contentComplete];
}];;
}
- (void)serviceExtensionTimeWillExpire
@@ -7,9 +7,11 @@
objects = {
/* Begin PBXBuildFile section */
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 */; };
652C37BD26092B3C0068EC3B /* FiltersViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 652C37BC26092B3C0068EC3B /* FiltersViewModel.swift */; };
6531185928425B89006CBC29 /* NotificationService+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6531185828425B89006CBC29 /* NotificationService+Extension.swift */; };
65355FFF25F38D3300BB57D2 /* SegnalazioniMapViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65355FFE25F38D3300BB57D2 /* SegnalazioniMapViewController.swift */; };
6535600425F398CD00BB57D2 /* Costanti+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6535600325F398CD00BB57D2 /* Costanti+Extensions.swift */; };
653604E9262348FA00B2B651 /* EQNBaseMapFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 653604E8262348FA00B2B651 /* EQNBaseMapFilter.swift */; };
@@ -225,7 +227,6 @@
DCB528212560161C005288E5 /* AlertSimulatorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCB528202560161C005288E5 /* AlertSimulatorViewController.swift */; };
DCB6FBEC24D0B40600ED23B8 /* Colors.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DCB6FBEB24D0B40600ED23B8 /* Colors.xcassets */; };
DCBB267A24D1E7F500F04559 /* SubscriptionsHeaderTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCBB267924D1E7F500F04559 /* SubscriptionsHeaderTableViewCell.swift */; };
DCBB267C24D1E98300F04559 /* EQNInsetTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCBB267B24D1E98300F04559 /* EQNInsetTableViewCell.swift */; };
DCBB267E24D1EA2000F04559 /* SubscriptionProductTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCBB267D24D1EA2000F04559 /* SubscriptionProductTableViewCell.swift */; };
DCBB268024D1ECE200F04559 /* SubscriptionDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCBB267F24D1ECE200F04559 /* SubscriptionDetailViewController.swift */; };
DCBB84F0252CFC4600F12633 /* AlertsNoLocationTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCBB84EF252CFC4600F12633 /* AlertsNoLocationTableViewCell.swift */; };
@@ -284,9 +285,11 @@
/* Begin PBXFileReference section */
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>"; };
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>"; };
652C37BC26092B3C0068EC3B /* FiltersViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FiltersViewModel.swift; sourceTree = "<group>"; };
6531185828425B89006CBC29 /* NotificationService+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NotificationService+Extension.swift"; sourceTree = "<group>"; };
65355FFE25F38D3300BB57D2 /* SegnalazioniMapViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SegnalazioniMapViewController.swift; sourceTree = "<group>"; };
6535600325F398CD00BB57D2 /* Costanti+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Costanti+Extensions.swift"; sourceTree = "<group>"; };
653604E8262348FA00B2B651 /* EQNBaseMapFilter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EQNBaseMapFilter.swift; sourceTree = "<group>"; };
@@ -547,7 +550,6 @@
DCB528202560161C005288E5 /* AlertSimulatorViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlertSimulatorViewController.swift; sourceTree = "<group>"; };
DCB6FBEB24D0B40600ED23B8 /* Colors.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Colors.xcassets; sourceTree = "<group>"; };
DCBB267924D1E7F500F04559 /* SubscriptionsHeaderTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscriptionsHeaderTableViewCell.swift; sourceTree = "<group>"; };
DCBB267B24D1E98300F04559 /* EQNInsetTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EQNInsetTableViewCell.swift; sourceTree = "<group>"; };
DCBB267D24D1EA2000F04559 /* SubscriptionProductTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscriptionProductTableViewCell.swift; sourceTree = "<group>"; };
DCBB267F24D1ECE200F04559 /* SubscriptionDetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscriptionDetailViewController.swift; sourceTree = "<group>"; };
DCBB84EF252CFC4600F12633 /* AlertsNoLocationTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlertsNoLocationTableViewCell.swift; sourceTree = "<group>"; };
@@ -660,6 +662,7 @@
8C483CB521FDACD100259FD2 /* EQNNotificationService-Bridging-Header.h */,
8C4B0B7C21CACE3F00AED489 /* NotificationService.h */,
8C4B0B7D21CACE3F00AED489 /* NotificationService.m */,
6531185828425B89006CBC29 /* NotificationService+Extension.swift */,
DC30BC862534DBB30041B23B /* Icons */,
8C4B0B7F21CACE3F00AED489 /* Info.plist */,
);
@@ -752,6 +755,7 @@
8C7A3B64225A5EA30045B266 /* NSDictionary+EQNExtensions.m */,
65E1B19A260F980600A0ACBA /* Dictionary+EQNExtensions.swift */,
65583A04261B83BE00ECA9F9 /* UIKit+Extensions.swift */,
650B23AA2632CCD3007AE752 /* UIView+EQNExtensions.swift */,
);
path = Extensions;
sourceTree = "<group>";
@@ -1097,7 +1101,6 @@
DC03BEAA250BC0A60084769B /* EQNRoundedButton.swift */,
DC52B8A424FCCD6900ABEBA6 /* AppTheme.swift */,
DCA5B6E6252E4BD8002AEC96 /* EQNBaseTableViewCell.swift */,
DCBB267B24D1E98300F04559 /* EQNInsetTableViewCell.swift */,
653C67E125F3CC2E00FE52AC /* EQNCustomAnnotationView.swift */,
6586971025F44C26009C0182 /* EQNBlurredCloseButton.swift */,
);
@@ -1451,9 +1454,9 @@
"${BUILT_PRODUCTS_DIR}/DZNEmptyDataSet/DZNEmptyDataSet.framework",
"${BUILT_PRODUCTS_DIR}/FirebaseCore/FirebaseCore.framework",
"${BUILT_PRODUCTS_DIR}/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework",
"${BUILT_PRODUCTS_DIR}/FirebaseCoreInternal/FirebaseCoreInternal.framework",
"${BUILT_PRODUCTS_DIR}/FirebaseCrashlytics/FirebaseCrashlytics.framework",
"${BUILT_PRODUCTS_DIR}/FirebaseInstallations/FirebaseInstallations.framework",
"${BUILT_PRODUCTS_DIR}/FirebaseInstanceID/FirebaseInstanceID.framework",
"${BUILT_PRODUCTS_DIR}/FirebaseMessaging/FirebaseMessaging.framework",
"${BUILT_PRODUCTS_DIR}/GoogleDataTransport/GoogleDataTransport.framework",
"${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework",
@@ -1466,9 +1469,9 @@
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/DZNEmptyDataSet.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCore.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCoreDiagnostics.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCoreInternal.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCrashlytics.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseInstallations.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseInstanceID.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseMessaging.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleDataTransport.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleUtilities.framework",
@@ -1526,6 +1529,7 @@
buildActionMask = 2147483647;
files = (
DCDAB31925188BB3001AE40D /* EQNAllertaSismica.m in Sources */,
6531185928425B89006CBC29 /* NotificationService+Extension.swift in Sources */,
8C4B0B7E21CACE3F00AED489 /* NotificationService.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -1580,7 +1584,6 @@
8CF66059214C566B009F4314 /* Reachability.m in Sources */,
DC886A5D24E92D5500F7A5D3 /* EQNBaseViewController.m in Sources */,
8C593E8A217BA2470008B260 /* EQNSegnalazione.m in Sources */,
DCBB267C24D1E98300F04559 /* EQNInsetTableViewCell.swift in Sources */,
8CBD3DCA2149B9AD0070C963 /* AllerteViewController.m in Sources */,
DC646F32252B698B000AA5FD /* AlertsSeismicNotificationCompactTableViewCell.swift in Sources */,
DCF10DCD24D2C935009F34C3 /* EQNPurchaseAvailability.swift in Sources */,
@@ -1631,6 +1634,7 @@
DCB28CEE24FB8400001F557E /* SettingsViewController.swift in Sources */,
DCB528212560161C005288E5 /* AlertSimulatorViewController.swift in Sources */,
DCC76BD8251F56050005C4DC /* SeismicCardSettingsViewController.swift in Sources */,
650B23AB2632CCD3007AE752 /* UIView+EQNExtensions.swift in Sources */,
653C67FC25F3D63500FE52AC /* EQNMapAnnotationUserReport.swift in Sources */,
DC3CE50A250EB7A8005A7DD5 /* EQNGenericPickerViewController.swift in Sources */,
DCEFF21A24F587E3009D3FE1 /* SettingItem.swift in Sources */,
@@ -1738,12 +1742,12 @@
CODE_SIGN_ENTITLEMENTS = EQNNotificationService/EQNNotificationService.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 82;
CURRENT_PROJECT_VERSION = 89;
DEVELOPMENT_TEAM = WJA4MR4CPC;
INFOPLIST_FILE = EQNNotificationService/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
MARKETING_VERSION = 4.1.1;
MARKETING_VERSION = 5.0.3;
PRODUCT_BUNDLE_IDENTIFIER = com.finazzi.distquake.notificationservice;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "EQNetwork Extension Service - Development";
@@ -1762,12 +1766,12 @@
CODE_SIGN_ENTITLEMENTS = EQNNotificationService/EQNNotificationService.entitlements;
CODE_SIGN_IDENTITY = "Apple Distribution";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 82;
CURRENT_PROJECT_VERSION = 89;
DEVELOPMENT_TEAM = WJA4MR4CPC;
INFOPLIST_FILE = EQNNotificationService/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
MARKETING_VERSION = 4.1.1;
MARKETING_VERSION = 5.0.3;
PRODUCT_BUNDLE_IDENTIFIER = com.finazzi.distquake.notificationservice;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "EQNetwork Extension Service - AppStore";
@@ -1811,9 +1815,11 @@
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "iPhone Developer";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Manual;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = WJA4MR4CPC;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
@@ -1823,6 +1829,7 @@
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
"ADS_ENABLED=0",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
@@ -1870,13 +1877,16 @@
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "iPhone Developer";
CODE_SIGN_IDENTITY = "Apple Distribution";
CODE_SIGN_STYLE = Manual;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = WJA4MR4CPC;
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_PREPROCESSOR_DEFINITIONS = "ADS_ENABLED=0";
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
@@ -1899,16 +1909,16 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = "Earthquake Network/Earthquake Network.entitlements";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Apple Development";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 82;
CURRENT_PROJECT_VERSION = 89;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = WJA4MR4CPC;
GCC_PREFIX_HEADER = "Earthquake Network/Earthquake Network-Prefix.pch";
INFOPLIST_FILE = "Earthquake Network/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
MARKETING_VERSION = 4.1.1;
MARKETING_VERSION = 5.0.3;
OTHER_LDFLAGS = (
"$(inherited)",
"-ObjC",
@@ -1944,8 +1954,6 @@
"-framework",
"\"FirebaseInstallations\"",
"-framework",
"\"FirebaseInstanceID\"",
"-framework",
"\"FirebaseMessaging\"",
"-framework",
"\"Foundation\"",
@@ -2011,15 +2019,15 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = "Earthquake Network/Earthquake Network.entitlements";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Apple Distribution";
CODE_SIGN_IDENTITY = "Apple Distribution";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 82;
CURRENT_PROJECT_VERSION = 89;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = WJA4MR4CPC;
GCC_PREFIX_HEADER = "Earthquake Network/Earthquake Network-Prefix.pch";
INFOPLIST_FILE = "Earthquake Network/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
MARKETING_VERSION = 4.1.1;
MARKETING_VERSION = 5.0.3;
OTHER_LDFLAGS = (
"$(inherited)",
"-ObjC",
@@ -2055,8 +2063,6 @@
"-framework",
"\"FirebaseInstallations\"",
"-framework",
"\"FirebaseInstanceID\"",
"-framework",
"\"FirebaseMessaging\"",
"-framework",
"\"Foundation\"",
@@ -2120,12 +2126,12 @@
CODE_SIGN_ENTITLEMENTS = EQNNotificationContent/EQNNotificationContent.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 82;
CURRENT_PROJECT_VERSION = 89;
DEVELOPMENT_TEAM = WJA4MR4CPC;
INFOPLIST_FILE = EQNNotificationContent/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
MARKETING_VERSION = 4.1.1;
MARKETING_VERSION = 5.0.3;
PRODUCT_BUNDLE_IDENTIFIER = com.finazzi.distquake.notificationcontent;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "EQNetwork Extension Content - Development";
@@ -2144,12 +2150,12 @@
CODE_SIGN_ENTITLEMENTS = EQNNotificationContent/EQNNotificationContent.entitlements;
CODE_SIGN_IDENTITY = "Apple Distribution";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 82;
CURRENT_PROJECT_VERSION = 89;
DEVELOPMENT_TEAM = WJA4MR4CPC;
INFOPLIST_FILE = EQNNotificationContent/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
MARKETING_VERSION = 4.1.1;
MARKETING_VERSION = 5.0.3;
PRODUCT_BUNDLE_IDENTIFIER = com.finazzi.distquake.notificationcontent;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "EQNetwork Extension Content - AppStore";
+5
View File
@@ -36,10 +36,12 @@
// Test ads on specific devices
GADMobileAds.sharedInstance.requestConfiguration.testDeviceIdentifiers = @[ @"81392581e1790d4fbc6eff919815088d" ];
#endif
#if ADS_ENABLED
// start 3rd party SDKs and custom managers
[GADMobileAds.sharedInstance startWithCompletionHandler:^(GADInitializationStatus *status) {
NSLog(@"[AppDelegate] GADMobileAds started with status: %@", status);
}];
#endif
[EQNUser defaultUser];
[EQNManager defaultManager];
@@ -122,7 +124,10 @@
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
NSString *token = [self stringWithDeviceToken:deviceToken];
NSLog(@"[DEBUG] push token: %@", token);
[[NSUserDefaults standardUserDefaults] setObject:token forKey:EQNUserDefaultPushToken];
FIRMessaging.messaging.APNSToken = deviceToken;
}
- (NSString *)stringWithDeviceToken:(NSData *)deviceToken
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="16097.2" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="20037" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<device id="retina4_7" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="16087"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="20020"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
@@ -24,12 +24,12 @@
</constraints>
</imageView>
</subviews>
<color key="backgroundColor" red="0.50766238939999997" green="0.75272958739999996" blue="0.98132258650000004" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="Dzo-29-2FJ" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="LUF-7j-Kmc"/>
<constraint firstItem="Dzo-29-2FJ" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="MuU-xU-Ic2"/>
</constraints>
<viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
@@ -38,6 +38,6 @@
</scene>
</scenes>
<resources>
<image name="eq_icon" width="166" height="166"/>
<image name="eq_icon" width="200" height="200"/>
</resources>
</document>
@@ -16,9 +16,9 @@
@import StoreKit;
@import SafariServices;
@import CoreLocation;
@import GoogleMobileAds;
@interface AllerteViewController () <UITableViewDelegate, UITableViewDataSource>
@property (weak, nonatomic) IBOutlet UIBarButtonItem *expandeCollapseButton;
@property (weak, nonatomic) IBOutlet UITableView *tableView;
@property (strong, nonatomic) NSMutableArray *tableItems;
@property (nonatomic) BOOL isNotificaAttiva;
@@ -36,7 +36,7 @@ typedef NS_ENUM(NSInteger, AllerteTableRow) {
AllerteTableRowAllertePassate,
AllerteTableRowReteSmartphone,
AllerteTableRowServizioPriorita,
AllerteTableRowVersionePro,
AllerteTableRowVersionePro, // non più visualizzata con passaggio dell'app a pagamento
AllerteTableRowDatiPosizione
};
@@ -112,6 +112,10 @@ typedef NS_ENUM(NSInteger, AllerteTableRow) {
{
[super refreshUI];
// `AllerteTableRowReteSmartphone` and `AllerteTableRowDatiPosizione` are hidden bu default, user can show them
BOOL showAllCards = [[NSUserDefaults standardUserDefaults] boolForKey:EQNUserDefaultKeyAlertsShowAllCards];
self.expandeCollapseButton.image = showAllCards ? [UIImage imageNamed:@"navbar-icon-arrow-collapse"] : [UIImage imageNamed:@"navbar-icon-arrow-expand"];
NSDate *date = [[NSUserDefaults standardUserDefaults] objectForKey:NOTIFICHE_RETE_SMARTPHONE_DATA_NOTIFICA];
if (date) {
if ([EQNUtility getDifferenceMinute:date] < TEMPO_VISUALIZZAZIONE_NOTIFICA)
@@ -125,21 +129,26 @@ typedef NS_ENUM(NSInteger, AllerteTableRow) {
[self.tableItems removeAllObjects];
// rows always visible
[self.tableItems addObjectsFromArray:@[ @(AllerteTableRowSismiRilevati), @(AllerteTableRowAllertePassate), @(AllerteTableRowServizioPriorita)]];
if (showAllCards) {
[self.tableItems addObject:@(AllerteTableRowReteSmartphone)];
}
// check if locations is enabled
if (CLLocationManager.authorizationStatus != kCLAuthorizationStatusAuthorizedAlways) {
[self.tableItems addObject:@(AllerteTableRowLocationPermission)];
}
// always visible rows
[self.tableItems addObjectsFromArray:@[ @(AllerteTableRowSismiRilevati), @(AllerteTableRowAllertePassate), @(AllerteTableRowReteSmartphone), @(AllerteTableRowServizioPriorita)]];
// pro cell visible only if user hasn't already bought the app
if ([EQNPurchaseUtility isProVersionEnabled] == NO) {
[self.tableItems addObject:@(AllerteTableRowVersionePro)];
}
// location data visible only if last position is known
if ([EQNUser defaultUser].lastPosition != nil) {
if ([EQNUser defaultUser].lastPosition != nil && showAllCards) {
[self.tableItems addObject:@(AllerteTableRowDatiPosizione)];
}
// sort items based on enum position
NSSortDescriptor *sorter = [NSSortDescriptor sortDescriptorWithKey:@"self" ascending:YES];
[self.tableItems sortUsingDescriptors:@[sorter]];
[self.tableView reloadData];
}
@@ -150,6 +159,16 @@ typedef NS_ENUM(NSInteger, AllerteTableRow) {
[[EQNManager defaultManager] sincronizza];
}
- (IBAction)collapseExpandTapped:(id)sender
{
// toggle saved value
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
BOOL showAll = [defaults boolForKey:EQNUserDefaultKeyAlertsShowAllCards];
[defaults setBool:!showAll forKey:EQNUserDefaultKeyAlertsShowAllCards];
[self refreshUI];
}
- (void)actionCloseNotification
{
[[NSUserDefaults standardUserDefaults] removeObjectForKey:NOTIFICHE_RETE_SMARTPHONE_DATA_NOTIFICA];
@@ -44,7 +44,11 @@
{
[super viewWillAppear:animated];
#if ADS_ENABLED
[self handleAdBanner];
#else
[self hideAdBanner];
#endif
}
#pragma mark - Public
@@ -13,6 +13,7 @@ import StoreKit
class PurchaseProVersionViewController: UIViewController {
@IBOutlet private weak var containerView: UIView!
@IBOutlet private weak var titleLabel: UILabel!
@IBOutlet private weak var subtitleLabel: UILabel!
@IBOutlet private weak var discountTextLabel: UILabel!
@@ -65,6 +66,7 @@ class PurchaseProVersionViewController: UIViewController {
openTermsButton.setTitle(NSLocalizedString("network_pro_terms_conditions", comment: ""), for: .normal)
payingLabel.text = NSLocalizedString("network_pro_paying", comment: "")
purchaseButton.setTitle(NSLocalizedString("network_pro_convert", comment: "").uppercased(), for: .normal)
containerView.eqn_applyShadowAndRoundedCorners()
}
private func updateUI() {
@@ -22,6 +22,7 @@ class SubscriptionDetailViewController: UIViewController {
}
}
@IBOutlet private weak var containerView: UIView!
@IBOutlet private weak var productTitleLabel: UILabel!
@IBOutlet private weak var productImageView: UIImageView!
@IBOutlet private weak var productDescriptionLabel: UILabel!
@@ -43,42 +44,44 @@ class SubscriptionDetailViewController: UIViewController {
object: nil)
updateUI()
setupUI()
}
// MARK: - Private
private func setupUI() {
containerView.eqn_applyShadowAndRoundedCorners()
}
private func updateUI() {
guard let product = product, isViewLoaded else { return }
productImageView.image = VersioneProProducts.image(for: product.productIdentifier)
productTitleLabel.text = product.localizedTitle
productDescriptionLabel.text = product.localizedDescription
var purchaseRecapString = ""
var subscriptionDetailsString = ""
switch product.productIdentifier {
case VersioneProProducts.Identifier.Subscription10kMonthly:
productImageView.image = UIImage.init(named: "top_10k")
case VersioneProProducts.Identifier.Subscription10kMonthly,
VersioneProProducts.Identifier.Subscription100kMonthly:
purchaseRecapString = "inapp_monthly_payment"
case VersioneProProducts.Identifier.Subscription100kMonthly:
productImageView.image = UIImage.init(named: "top_100k")
purchaseRecapString = "inapp_monthly_payment"
case VersioneProProducts.Identifier.Subscription100kYearly, VersioneProProducts.Identifier.Subscription100kYearlyDiscounted:
productImageView.image = UIImage.init(named: "top_100k")
subscriptionDetailsString = "inapp_detail_description"
case VersioneProProducts.Identifier.Subscription100kYearly,
VersioneProProducts.Identifier.Subscription100kYearlyDiscounted,
VersioneProProducts.Identifier.Subscription10kYearly,
VersioneProProducts.Identifier.Subscription10kYearlyDiscounted:
purchaseRecapString = "inapp_yearly_payment"
case VersioneProProducts.Identifier.Subscription10kYearly, VersioneProProducts.Identifier.Subscription10kYearlyDiscounted:
productImageView.image = UIImage.init(named: "top_10k")
purchaseRecapString = "inapp_yearly_payment"
subscriptionDetailsString = "inapp_detail_description"
case VersioneProProducts.Identifier.Subscription10kPerpetual,
VersioneProProducts.Identifier.Subscription100kPerpetual:
purchaseRecapString = "inapp_lifetime_payment"
subscriptionDetailsString = "inapp_lifetime_detail_description"
default:
break
}
subscriptionDetailsLabel.text = NSLocalizedString("", comment: "")
subscriptionDetailsLabel.text = NSLocalizedString(subscriptionDetailsString, comment: "")
openPrivacyButton.setTitle(NSLocalizedString("network_pro_privacy_disclaimer", comment: ""), for: .normal)
openTermsButton.setTitle(NSLocalizedString("network_pro_terms_conditions", comment: ""), for: .normal)
@@ -9,7 +9,7 @@
import UIKit
import StoreKit
class SubscriptionProductTableViewCell: EQNInsetTableViewCell {
class SubscriptionProductTableViewCell: UITableViewCell {
var product: SKProduct? {
didSet {
@@ -28,22 +28,38 @@ class SubscriptionProductTableViewCell: EQNInsetTableViewCell {
@IBOutlet private weak var productInfoLabel: UILabel!
// MARK: - View Lifecycle
// force an inset to have the same style of EQNBaseTableViewCell
override var frame: CGRect {
get {
return super.frame
}
set (newFrame) {
let inset: CGFloat = 8
var frame = newFrame
frame.origin.x += inset
frame.size.width -= 2 * inset
super.frame = frame
}
}
// MARK: - Private
private func updateUI() {
guard let product = product else { return }
productImageView.image = imageForProductIdentifier(product.productIdentifier)
productImageView.image = VersioneProProducts.image(for: product.productIdentifier)
productTitleLabel.text = product.localizedTitle
productDescriptionLabel?.text = product.localizedDescription
let infoKey = is100kSubscriptionForProductIdentifier(product.productIdentifier) ? "inapp_available_100k" : "inapp_available_10k"
let infoKey = VersioneProProducts.is100kSubscription(for: product.productIdentifier) ? "inapp_available_100k" : "inapp_available_10k"
let counter = availability(for: product.productIdentifier)
productInfoLabel.text = String(format: NSLocalizedString(infoKey, comment: ""), counter)
}
private func availability(for productIdentifier: String) -> Int {
if is100kSubscriptionForProductIdentifier(productIdentifier) {
if VersioneProProducts.is100kSubscription(for: productIdentifier) {
return availability?.top100kAvailable ?? 0
}
return availability?.top10kAvailable ?? 0
@@ -9,7 +9,7 @@
import UIKit
import StoreKit
class SubscriptionsActiveTableViewCell: EQNInsetTableViewCell {
class SubscriptionsActiveTableViewCell: EQNBaseTableViewCell {
var product: SKProduct? {
didSet {
@@ -40,7 +40,7 @@ class SubscriptionsActiveTableViewCell: EQNInsetTableViewCell {
if let productIdentifier = product?.productIdentifier {
noSubscriptionsLabel.isHidden = true
activeSubscriptionImageView.isHidden = false
activeSubscriptionImageView.image = imageForProductIdentifier(productIdentifier)
activeSubscriptionImageView.image = VersioneProProducts.image(for: productIdentifier)
} else {
noSubscriptionsLabel.isHidden = false
activeSubscriptionImageView.isHidden = true
@@ -8,7 +8,7 @@
import UIKit
class SubscriptionsDescriptionTableViewCell: EQNInsetTableViewCell {
class SubscriptionsDescriptionTableViewCell: EQNBaseTableViewCell {
@IBOutlet private weak var headerLabel: UILabel!
@IBOutlet private weak var descriptionLabel: UILabel!
@@ -8,7 +8,7 @@
import UIKit
class SubscriptionsHeaderTableViewCell: EQNInsetTableViewCell {
class SubscriptionsHeaderTableViewCell: UITableViewCell {
var isLoading = false {
didSet {
@@ -25,13 +25,6 @@ class SubscriptionsHeaderTableViewCell: EQNInsetTableViewCell {
@IBOutlet private weak var headerTitleLabel: UILabel!
@IBOutlet private weak var loadingActivityIndicator: UIActivityIndicatorView!
// MARK: - View Lifecycle
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
// MARK: - Private
private func updateUI() {
@@ -21,11 +21,13 @@ class SubscriptionsViewController: UITableViewController {
case description
case monthly
case yearly
case perpetual
var sectionTitle: String? {
switch self {
case .monthly: return NSLocalizedString("inapp_monthly_subscriptions", comment: "")
case .yearly: return NSLocalizedString("inapp_yearly_subscriptions", comment: "")
case .perpetual: return NSLocalizedString("inapp_lifetime_subscriptions", comment: "")
default: return nil
}
}
@@ -36,6 +38,7 @@ class SubscriptionsViewController: UITableViewController {
private var allProducts = [SKProduct]()
private var monthlyProducts = [SKProduct]()
private var yearlyProducts = [SKProduct]()
private var perpetualProducts = [SKProduct]()
/// Product already bought by the user
private var subscribedProduct: SKProduct?
/// Availability for subscriptions
@@ -105,6 +108,7 @@ class SubscriptionsViewController: UITableViewController {
private func updateUI() {
monthlyProducts.removeAll()
yearlyProducts.removeAll()
perpetualProducts.removeAll()
// creates list to show
let isDiscountAvailable = checkDiscountPrice()
@@ -127,6 +131,11 @@ class SubscriptionsViewController: UITableViewController {
yearlyProducts.append(product)
}
}
// perpetual scribuscriptions doesn't have discounted version
if product.productIdentifier == VersioneProProducts.Identifier.Subscription10kPerpetual ||
product.productIdentifier == VersioneProProducts.Identifier.Subscription100kPerpetual {
perpetualProducts.append(product)
}
}
tableView.reloadData()
@@ -142,7 +151,7 @@ class SubscriptionsViewController: UITableViewController {
let purchased = products.filter { (product) -> Bool in
let isPurchased = VersioneProProducts.store.isProductPurchased(product.productIdentifier)
let isSubscription = VersioneProProducts.Identifier.isSubscription(for: product.productIdentifier)
let isSubscription = VersioneProProducts.isSubscription(for: product.productIdentifier)
return isPurchased && isSubscription
}
self.subscribedProduct = purchased.first
@@ -231,7 +240,7 @@ class SubscriptionsViewController: UITableViewController {
if tableSection.sectionTitle != nil {
return 50
}
return 10
return 0
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
@@ -239,8 +248,10 @@ class SubscriptionsViewController: UITableViewController {
switch tableSection {
case .active: return 1
case .description: return 1
case .monthly: return monthlyProducts.count
case .yearly: return yearlyProducts.count
case .monthly,
.yearly,
.perpetual:
return availableProducts(for: tableSection).count
}
}
@@ -252,6 +263,33 @@ class SubscriptionsViewController: UITableViewController {
}
return UITableView.automaticDimension
}
override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
let tableSection = sections[indexPath.section]
if tableSection == .active || tableSection == .description {
return
}
// add round borders to first and last row in products cells
let cornerRadius = AppTheme.shared.cardCornerRadius
var corners: UIRectCorner = []
if indexPath.row == 0 {
corners.update(with: .topLeft)
corners.update(with: .topRight)
}
if indexPath.row == tableView.numberOfRows(inSection: indexPath.section) - 1 {
corners.update(with: .bottomLeft)
corners.update(with: .bottomRight)
}
let maskLayer = CAShapeLayer()
maskLayer.path = UIBezierPath(roundedRect: cell.bounds,
byRoundingCorners: corners,
cornerRadii: CGSize(width: cornerRadius, height: cornerRadius)).cgPath
cell.layer.mask = maskLayer
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let tableSection = sections[indexPath.section]
@@ -265,7 +303,7 @@ class SubscriptionsViewController: UITableViewController {
return cell
}
let products = tableSection == .monthly ? monthlyProducts : yearlyProducts
let products = availableProducts(for: tableSection)
let cell = tableView.dequeueReusableCell(withIdentifier: "SubscriptionCell", for: indexPath) as! SubscriptionProductTableViewCell
cell.product = products[indexPath.row]
cell.availability = availability
@@ -276,11 +314,22 @@ class SubscriptionsViewController: UITableViewController {
tableView.deselectRow(at: indexPath, animated: true)
let tableSection = sections[indexPath.section]
if tableSection == .monthly || tableSection == .yearly {
let products = tableSection == .monthly ? monthlyProducts : yearlyProducts
let products = availableProducts(for: tableSection)
if !products.isEmpty {
performSegue(withIdentifier: Self.SegueIdentifierSubscriptionDetail, sender: products[indexPath.row])
}
}
// MARK: - Helpers
private func availableProducts(for section: TableSection) -> [SKProduct] {
switch section {
case .monthly: return monthlyProducts
case .yearly: return yearlyProducts
case .perpetual: return perpetualProducts
default: return []
}
}
}
extension SubscriptionsViewController: StoryboardInitializable {
@@ -10,7 +10,7 @@ import UIKit
import MapKit
import CoreLocation
protocol SeismicNetworkTableViewCellDelegate: class {
protocol SeismicNetworkTableViewCellDelegate: AnyObject {
func seismicNetworkCellDidTapShare(_ cell: SeismicNetworkTableViewCell)
func seismicNetworkCellDidTapMap(_ cell: SeismicNetworkTableViewCell)
func seismicNetworkCellDidTapMapDetail(_ cell: SeismicNetworkTableViewCell)
@@ -90,7 +90,7 @@ class SeismicNetworkTableViewCell: UITableViewCell {
let label = UILabel()
label.translatesAutoresizingMaskIntoConstraints = false
label.font = UIFont.preferredFont(for: .title2, weight: .semibold)
label.numberOfLines = 2
label.numberOfLines = 3
return label
}()
@@ -256,7 +256,9 @@ class SeismicNetworkTableViewCell: UITableViewCell {
titleImageView.widthAnchor.constraint(equalTo: titleImageView.heightAnchor).isActive = true
networkLabel.heightAnchor.constraint(equalToConstant: 34.0).isActive = true
networkLabel.setContentHuggingPriority(.init(800), for: .horizontal)
networkLabel.setContentCompressionResistancePriority(.defaultHigh, for: .horizontal)
placeLabel.setContentHuggingPriority(.init(200), for: .horizontal)
placeLabel.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
shareButton.widthAnchor.constraint(equalToConstant: titleComponentsHeight).isActive = true
shareButton.widthAnchor.constraint(equalTo: shareButton.heightAnchor).isActive = true
@@ -8,7 +8,7 @@
import UIKit
@objc protocol SeismicFiltersViewControllerDelegate: class {
protocol SeismicFiltersViewControllerDelegate: AnyObject {
func seismicFiltersControllerDidUpdateFilters(_ controller: SeismicFiltersViewController)
}
@@ -24,7 +24,7 @@ class SeismicFiltersViewController: UIViewController, UITableViewDelegate, UITab
case modificaImpostazioni
}
@objc weak var delegate: SeismicFiltersViewControllerDelegate?
weak var delegate: SeismicFiltersViewControllerDelegate?
/// Tells if delegate needs to redownload data when filter is dismissed
@objc private(set) var needsDataUpdate = false
@@ -66,7 +66,8 @@ class SeismicFiltersViewController: UIViewController, UITableViewDelegate, UITab
super.viewDidLoad()
setupUI()
updateUI()
loadDataSource()
tableView.reloadData()
}
private func setupUI() {
@@ -83,7 +84,7 @@ class SeismicFiltersViewController: UIViewController, UITableViewDelegate, UITab
closeButton.setLocalizedTitle(key: "official_close", uppercased: false)
}
private func updateUI() {
private func loadDataSource() {
currentMagnitudoMinima = EQNData.magitudoDebole(for: EQNSeismic.shared.magnitudoMinima)
if initialMagnitudoMinima == nil {
initialMagnitudoMinima = currentMagnitudoMinima
@@ -97,7 +98,6 @@ class SeismicFiltersViewController: UIViewController, UITableViewDelegate, UITab
initialQualsiasiMagnitudo = currentSismiQualsiasiMagnitudo
}
currentModificaImpostazioni = EQNSeismic.shared.modificaImpostazioniAbilitato
tableView.reloadData()
}
// MARK: - Table view delegate and data source
@@ -111,7 +111,7 @@ class SeismicFiltersViewController: UIViewController, UITableViewDelegate, UITab
switch setting.type {
case .slider:
let cell = tableView.dequeueReusableCell(withIdentifier: SettingSliderTableViewCell.Identifier, for: indexPath) as! SettingSliderTableViewCell
let cell = SettingSliderTableViewCell(style: .default, reuseIdentifier: nil)
cell.titleLabel.text = setting.displayTitle
if indexPath.row == RowIdentifier.magnitudoMinima.rawValue {
@@ -120,7 +120,6 @@ class SeismicFiltersViewController: UIViewController, UITableViewDelegate, UITab
currentMagnitudoMinima = value
EQNSeismic.shared.magnitudoMinima = value.value
EQNSeismic.shared.saveFilters()
updateUI()
}
cell.dragEnded = { [unowned self] in
showWarningAlertIfNeeded(for: currentMagnitudoMinima)
@@ -131,7 +130,6 @@ class SeismicFiltersViewController: UIViewController, UITableViewDelegate, UITab
currentDistanzaMassima = value
EQNSeismic.shared.distanzaMassima = value.value
EQNSeismic.shared.saveFilters()
updateUI()
}
} else if indexPath.row == RowIdentifier.periodoTemporale.rawValue {
cell.configureSlider(with: dataSourcePeriodoTemporale, current: currentPeriodoTemporale)
@@ -139,7 +137,6 @@ class SeismicFiltersViewController: UIViewController, UITableViewDelegate, UITab
currentPeriodoTemporale = value
EQNSeismic.shared.periodoTemporale = value.value
EQNSeismic.shared.saveFilters()
updateUI()
}
} else if indexPath.row == RowIdentifier.sismiFortiDistanza.rawValue {
cell.isDisabled = !currentSismiFortiAbilitati
@@ -148,13 +145,12 @@ class SeismicFiltersViewController: UIViewController, UITableViewDelegate, UITab
currentSismiFortiDistanza = value
EQNSeismic.shared.sismiFortiMagnitudo = value.value
EQNSeismic.shared.saveFilters()
updateUI()
}
}
return cell
case .enable:
let cell = tableView.dequeueReusableCell(withIdentifier: SettingEnableTableViewCell.Identifier, for: indexPath) as! SettingEnableTableViewCell
let cell = SettingEnableTableViewCell(style: .default, reuseIdentifier: nil)
cell.titleLabel.text = setting.displayTitle
cell.detailTextLabel?.text = setting.subtitle
@@ -164,7 +160,9 @@ class SeismicFiltersViewController: UIViewController, UITableViewDelegate, UITab
currentSismiFortiAbilitati = value
EQNSeismic.shared.sismiFortiAbilitati = value
EQNSeismic.shared.saveFilters()
updateUI()
loadDataSource()
tableView.reloadData()
}
} else if indexPath.row == RowIdentifier.sismiQualsiasiMagnitudo.rawValue {
cell.toggleSwitch.isOn = currentSismiQualsiasiMagnitudo
@@ -172,7 +170,6 @@ class SeismicFiltersViewController: UIViewController, UITableViewDelegate, UITab
currentSismiQualsiasiMagnitudo = value
EQNSeismic.shared.sismiQualsiasiAbilitati = value
EQNSeismic.shared.saveFilters()
updateUI()
}
} else if indexPath.row == RowIdentifier.modificaImpostazioni.rawValue {
cell.toggleSwitch.isOn = currentModificaImpostazioni
@@ -180,7 +177,6 @@ class SeismicFiltersViewController: UIViewController, UITableViewDelegate, UITab
currentModificaImpostazioni = value
EQNSeismic.shared.modificaImpostazioniAbilitato = value
EQNSeismic.shared.saveFilters()
updateUI()
}
}
@@ -8,7 +8,7 @@
import UIKit
protocol SeismicCardSettingsViewControllerDelegate: class {
protocol SeismicCardSettingsViewControllerDelegate: AnyObject {
func seismicCardSettingsDidComplete(_ controller: SeismicCardSettingsViewController)
}
@@ -9,7 +9,7 @@
import UIKit
import MapKit
protocol SeismicNetworksMapDetailViewControllerDelegate: class {
protocol SeismicNetworksMapDetailViewControllerDelegate: AnyObject {
func seismicNetworksMapDetailControllerWillUpdateData(_ controller: SeismicNetworksMapDetailViewController, needsDataUpdate: Bool)
}
@@ -155,10 +155,12 @@ class SeismicNetworksViewController: UIViewController, UITableViewDelegate, UITa
let filteredSeismics = EQNSeismic.shared.filterSeismicList(allSeismics ?? [])
rows = filteredSeismics.map { .seismic($0) }
#if ADS_ENABLED
// if is not a pro user, show an advertise
if !EQNPurchaseUtility.isProVersionEnabled() {
loadAd()
}
#endif
// if a map detail is presented, update its data
if let mapController = currentMapController {
@@ -9,13 +9,13 @@
import UIKit
@objc protocol SeismicSettingsNetworksViewControllerDelegate: class {
protocol SeismicSettingsNetworksViewControllerDelegate: AnyObject {
func seismicSettingsNetworksControllerDidComplete(_ controller: SeismicSettingsNetworksViewController)
}
class SeismicSettingsNetworksViewController: UITableViewController {
@objc weak var delegate: SeismicSettingsNetworksViewControllerDelegate?
weak var delegate: SeismicSettingsNetworksViewControllerDelegate?
// MARK: - Private
@@ -9,7 +9,7 @@
import Foundation
@objc protocol SeismicSettingsViewControllerDelegate: class {
protocol SeismicSettingsViewControllerDelegate: AnyObject {
func seismicSettingsControllerDidComplete(_ controller: SeismicSettingsViewController)
func seismicSettingsControllerWillOpenProviders(_ controller: SeismicSettingsViewController)
}
@@ -17,7 +17,7 @@ import Foundation
class SeismicSettingsViewController: UIViewController {
@objc weak var delegate: SeismicSettingsViewControllerDelegate?
weak var delegate: SeismicSettingsViewControllerDelegate?
// MARK: - Private
@@ -89,8 +89,6 @@ class SettingDateTableViewCell: UITableViewCell {
// MARK: - Private
private func setupUI() {
translatesAutoresizingMaskIntoConstraints = false
stackView.addArrangedSubview(titleLabel)
stackView.addArrangedSubview(valuesLabel)
@@ -62,7 +62,6 @@ class SettingEnableTableViewCell: UITableViewCell {
private func setupUI() {
selectionStyle = .none
translatesAutoresizingMaskIntoConstraints = false
let stackView = UIStackView()
stackView.translatesAutoresizingMaskIntoConstraints = false
@@ -54,8 +54,6 @@ class SettingMultivaluesTableViewCell: UITableViewCell {
// MARK: - Private
private func setupUI() {
translatesAutoresizingMaskIntoConstraints = false
let stackView = UIStackView()
stackView.translatesAutoresizingMaskIntoConstraints = false
stackView.axis = .vertical
@@ -55,7 +55,6 @@ class SettingSegmentedTableViewCell: UITableViewCell {
private func setupUI() {
selectionStyle = .none
translatesAutoresizingMaskIntoConstraints = false
let stackView = UIStackView()
stackView.translatesAutoresizingMaskIntoConstraints = false
@@ -66,7 +66,6 @@ class SettingSliderTableViewCell: UITableViewCell {
private func setupUI() {
selectionStyle = .none
translatesAutoresizingMaskIntoConstraints = false
let stackView = UIStackView()
stackView.translatesAutoresizingMaskIntoConstraints = false
@@ -99,6 +98,12 @@ class SettingSliderTableViewCell: UITableViewCell {
let index = Int(sender.value)
let item = items[index]
// make slider with step values
let step: Float = 1
let roundedValue = round(sender.value / step) * step
sender.value = roundedValue
// update value
valueLabel.text = item.display
valueChanged?(item)
}
@@ -75,7 +75,8 @@ typedef NS_ENUM(NSInteger, RowIdentifier) {
self.dataSourceSismi = [EQNData seismicToNotify];
self.dataSourceRaggioSisma = [EQNData raggioSismi];
[self updateUI];
[self loadDataSource];
[self.tableView reloadData];
}
#pragma mark - Private
@@ -94,7 +95,7 @@ typedef NS_ENUM(NSInteger, RowIdentifier) {
[self.tableView registerClass:[SettingDateTableViewCell class] forCellReuseIdentifier:SettingDateTableViewCell.Identifier];
}
- (void)updateUI
- (void)loadDataSource
{
self.notificationEnabled = [EQNAllertaSismica sharedInstance].isAbilitato;
self.criticalAlertsEnabled = [EQNAllertaSismica sharedInstance].isCriticalAlertsEnabled;
@@ -120,8 +121,6 @@ typedef NS_ENUM(NSInteger, RowIdentifier) {
self.currentEndTime = endTime;
[[EQNAllertaSismica sharedInstance] saveUserInfo];
[self.tableView reloadData];
}
@@ -262,35 +261,40 @@ typedef NS_ENUM(NSInteger, RowIdentifier) {
{
[EQNAllertaSismica sharedInstance].sismiDaNotificare = seismic.value;
[[EQNAllertaSismica sharedInstance] saveUserInfo];
[self updateUI];
[self loadDataSource];
}
- (void)updateLowSeismicRadius:(EQNGenericValue *)radius
{
[EQNAllertaSismica sharedInstance].raggioSismiLievi = radius.value;
[[EQNAllertaSismica sharedInstance] saveUserInfo];
[self updateUI];
[self loadDataSource];
}
- (void)updateStrongSeismicRadius:(EQNGenericValue *)radius
{
[EQNAllertaSismica sharedInstance].raggioSismiForti = radius.value;
[[EQNAllertaSismica sharedInstance] saveUserInfo];
[self updateUI];
[self loadDataSource];
}
- (void)updateStartTime:(NSDate *)date
{
[EQNAllertaSismica sharedInstance].oraioInizio = date;
[[EQNAllertaSismica sharedInstance] saveUserInfo];
[self updateUI];
[self loadDataSource];
}
- (void)updateEndTime:(NSDate *)date
{
[EQNAllertaSismica sharedInstance].orarioFine = date;
[[EQNAllertaSismica sharedInstance] saveUserInfo];
[self updateUI];
[self loadDataSource];
}
- (void)askForCriticalAlertsPermission
@@ -62,14 +62,16 @@ typedef NS_ENUM(NSInteger, RowIdentifier) {
self.dataSourceRaggioSisma = [EQNData raggioSismi];
self.dataSourceMagnitudoForti = [EQNData magitudoForti];
[self updateUI];
[self loadDataSource];
[self.tableView reloadData];
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self updateUI];
[self loadDataSource];
[self.tableView reloadData];
}
#pragma mark - Private
@@ -86,7 +88,7 @@ typedef NS_ENUM(NSInteger, RowIdentifier) {
[self.tableView registerClass:[SettingMultivaluesTableViewCell class] forCellReuseIdentifier:SettingMultivaluesTableViewCell.Identifier];
}
- (void)updateUI
- (void)loadDataSource
{
self.notificationEnabled = [EQNNotificheReteSismiche sharedInstance].isAbilitato;
self.notificationNearEarthquakeEnabled = [EQNNotificheReteSismiche sharedInstance].isAbilitaVicini;
@@ -110,8 +112,6 @@ typedef NS_ENUM(NSInteger, RowIdentifier) {
}
[[EQNNotificheReteSismiche sharedInstance] saveUserInfo];
[self.tableView reloadData];
}
@@ -229,7 +229,7 @@ typedef NS_ENUM(NSInteger, RowIdentifier) {
[EQNNotificheReteSismiche sharedInstance].distanzaPosizione = radius.value;
[[EQNNotificheReteSismiche sharedInstance] saveUserInfo];
[self updateUI];
[self loadDataSource];
}
- (void)updateSeismicEnergy:(EQNGenericValue *)energy
@@ -237,7 +237,7 @@ typedef NS_ENUM(NSInteger, RowIdentifier) {
[EQNNotificheReteSismiche sharedInstance].energiaSisma = energy.value;
[[EQNNotificheReteSismiche sharedInstance] saveUserInfo];
[self updateUI];
[self loadDataSource];
}
- (void)updateStrongEarthquakeEnergy:(EQNGenericValue *)energy
@@ -245,7 +245,7 @@ typedef NS_ENUM(NSInteger, RowIdentifier) {
[EQNNotificheReteSismiche sharedInstance].energiaTerremotiForti = energy.value;
[[EQNNotificheReteSismiche sharedInstance] saveUserInfo];
[self updateUI];
[self loadDataSource];
}
- (NSString *)stringOfSelectedNetworks
+1
View File
@@ -66,6 +66,7 @@ static NSString * const EQNServerUrlAlertSimulator = @"https://srv.earthquakenet
static NSString * const EQNUserDefaultAppGroupSuite = @"group.com.finazzi.distquake";
static NSString * const EQNUserDefaultKeyAlertsShowAllCards = @"EQNetwork.AlertsShowAllCards";
static NSString * const EQNUserDefaultKeySesmicInformations = @"EQNetwork.SeismicInformations";
static NSString * const EQNUserDefaultKeyOneShotShowCountry = @"EQNetwork.OneShot.CountrySelection";
static NSString * const EQNUserDefaultLastLocation = @"EQNLast_Location";
@@ -0,0 +1,25 @@
//
// UIView+EQNExtensions.swift
// Earthquake Network
//
// Created by Andrea Busi on 23/04/21.
// Copyright © 2021 Earthquake Network. All rights reserved.
//
import UIKit
extension UIView {
func eqn_applyShadowAndRoundedCorners() {
// rounded corners
layer.cornerRadius = AppTheme.shared.cardCornerRadius
layer.masksToBounds = false
// apply a shadow to the current view
layer.shadowColor = UIColor.black.cgColor
layer.shadowOpacity = 0.5
layer.shadowOffset = CGSize(width: 0, height: 2)
layer.shadowRadius = 2
}
}
@@ -10,6 +10,6 @@ import Foundation
@objc
protocol EQNCommandProtocol: class {
protocol EQNCommandProtocol: AnyObject {
@objc func execute()
}
+4 -7
View File
@@ -130,14 +130,11 @@
- (void)inviaPosizioneServer
{
NSLog(@"URLPosizione %@", [EQNGeneratoreURLServer urlPosizione]);
[[ServerRequest defaultServerConnectionSingleton] inviaInformazioniAlServerWithURL:[EQNGeneratoreURLServer urlPosizione] richiesta:EQNTipoChiamataPosizione success:^(id result) {
NSLog(@"inviato");
} failure:^(NSError *errore) {
NSLog(@"[EQNUtility] Position saved on server");
[self saveUserInfo];
} failure:^(NSError *error) {
NSLog(@"[EQNUtility] Unable to save position. Error: %@", error.localizedDescription);
}];
}
@@ -102,6 +102,10 @@
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data = [defaults objectForKey:keyName];
if (!data) {
NSLog(@"[EQNUtility] No array saved for key '%@'", keyName);
return nil;
}
NSError *error;
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingFromData:data error:&error];
@@ -119,6 +123,10 @@
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data = [defaults objectForKey:keyName];
if (!data) {
NSLog(@"[EQNUtility] No dictionary saved for key '%@'", keyName);
return nil;
}
NSError *error;
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingFromData:data error:&error];
@@ -53,7 +53,7 @@
[userDefaults setBool:self.isAbilitato forKey:NOTIFICHE_ALLERA_SISMICA_ABILITATO];
[userDefaults setObject:self.sismiDaNotificare forKey:NOTIFICHE_ALLERA_SISMICA_SISMI_DA_NOTIFICARE];
[userDefaults setObject:self.raggioSismiLievi forKey:NOTIFICHE_ALLERA_SISMICA_RAGGIO_SISMI_LIEVI];
[userDefaults setObject:self.raggioSismiLievi forKey:NOTIFICHE_ALLERA_SISMICA_RAGGIO_SISMI_FORTI];
[userDefaults setObject:self.raggioSismiForti forKey:NOTIFICHE_ALLERA_SISMICA_RAGGIO_SISMI_FORTI];
[userDefaults setBool:self.isintervalloAllarme forKey:NOTIFICHE_ALLERA_SISMICA_ABILITA_INTERVALLO];
[userDefaults setObject:self.oraioInizio forKey:NOTIFICHE_ALLERA_SISMICA_ORA_INIZIO];
[userDefaults setObject:self.orarioFine forKey:NOTIFICHE_ALLERA_SISMICA_ORA_FINE];
@@ -37,40 +37,66 @@ public struct VersioneProProducts {
static let Subscription10kMonthly = "com.finazzi.distquake.Abbonamento10k.mensileAutomatico"
static let Subscription10kYearly = "com.finazzi.distquake.Abbonamento10k.annualeAutomatico"
static let Subscription10kYearlyDiscounted = "com.finazzi.distquake.Abbonamento10k.annualeAutomaticoScontato"
static let Subscription10kPerpetual = "com.finazzi.distquake.Abbonamento10k.perpetuo"
static let Subscription100kMonthly = "com.finazzi.distquake.Abbonamento100k.mensileAutomatico"
static let Subscription100kYearly = "com.finazzi.distquake.Abbonamento100k.annualeAutomatico"
static let Subscription100kYearlyDiscounted = "com.finazzi.distquake.Abbonamento100k.annualeAutomaticoscontato"
static let Subscription100kPerpetual = "com.finazzi.distquake.Abbonamento100k.perpetuo"
static let identifiers: Set<ProductIdentifier> = [
ProVersionFullPrice, ProVersionDiscounted,
Subscription10kMonthly, Subscription10kYearly, Subscription10kYearlyDiscounted,
Subscription100kMonthly, Subscription100kYearly, Subscription100kYearlyDiscounted
Subscription100kMonthly, Subscription100kYearly, Subscription100kYearlyDiscounted,
Subscription10kPerpetual, Subscription100kPerpetual
]
static let identifierForProVersion: Set<ProductIdentifier> = [
ProVersionFullPrice, ProVersionDiscounted,
Subscription10kYearly, Subscription10kYearlyDiscounted,
Subscription100kYearly, Subscription100kYearlyDiscounted
Subscription100kYearly, Subscription100kYearlyDiscounted,
Subscription10kPerpetual, Subscription100kPerpetual
]
static let identifiersForTop10k: Set<ProductIdentifier> = [
Subscription10kMonthly, Subscription10kYearly, Subscription10kYearlyDiscounted
Subscription10kMonthly, Subscription10kYearly, Subscription10kYearlyDiscounted, Subscription10kPerpetual
]
static let identifiersForTop100k: Set<ProductIdentifier> = [
Subscription100kMonthly, Subscription100kYearly, Subscription100kYearlyDiscounted
Subscription100kMonthly, Subscription100kYearly, Subscription100kYearlyDiscounted, Subscription100kPerpetual
]
static let identifierForSubscriptions: Set<ProductIdentifier> = [
Subscription10kMonthly, Subscription100kMonthly,
Subscription10kYearly, Subscription10kYearlyDiscounted,
Subscription100kYearly, Subscription100kYearlyDiscounted
Subscription100kYearly, Subscription100kYearlyDiscounted,
Subscription10kPerpetual, Subscription100kPerpetual
]
static func isSubscription(for identifier: String) -> Bool {
Self.identifierForSubscriptions.contains(identifier)
}
static func isSubscription(for identifier: String) -> Bool {
Identifier.identifierForSubscriptions.contains(identifier)
}
static func is10kSubscription(for identifier: String) -> Bool {
Identifier.identifiersForTop10k.contains(identifier)
}
static func is100kSubscription(for identifier: String) -> Bool {
Identifier.identifiersForTop100k.contains(identifier)
}
static func image(for productIdentifier: String) -> UIImage? {
if is100kSubscription(for: productIdentifier){
return UIImage(named: "top_100k")
}
if is10kSubscription(for: productIdentifier) {
return UIImage(named: "top_10k")
}
return nil
}
public static let store = IAPHelper(productIds: VersioneProProducts.Identifier.identifiers)
@@ -80,27 +106,4 @@ func resourceNameForProductIdentifier(_ productIdentifier: String) -> String? {
return productIdentifier.components(separatedBy: ".").last
}
func imageForProductIdentifier(_ productIdentifier: String) -> UIImage? {
let products100k = [VersioneProProducts.Identifier.Subscription100kMonthly,
VersioneProProducts.Identifier.Subscription100kYearly,
VersioneProProducts.Identifier.Subscription100kYearlyDiscounted]
if products100k.contains(productIdentifier) {
return UIImage(named: "top_100k")
}
let products10k = [VersioneProProducts.Identifier.Subscription10kMonthly,
VersioneProProducts.Identifier.Subscription10kYearly,
VersioneProProducts.Identifier.Subscription10kYearlyDiscounted]
if products10k.contains(productIdentifier) {
return UIImage(named: "top_10k")
}
return nil
}
func is100kSubscriptionForProductIdentifier(_ productIdentifier: String) -> Bool {
let products100k = [VersioneProProducts.Identifier.Subscription100kMonthly,
VersioneProProducts.Identifier.Subscription100kYearly,
VersioneProProducts.Identifier.Subscription100kYearlyDiscounted]
return products100k.contains(productIdentifier)
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 111 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 209 KiB

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 323 KiB

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 865 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.5 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.0 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 12 KiB

@@ -137,6 +137,7 @@
case EQNTipoChiamataRilevamento:
onSuccess([EQNUtility clearStringMessaggi:newStr]);
break;
case EQNTipoChiamataPosizione:
case EQNTipoChiamataCalibrazione:
case EQNTipoChiamataImpostazioniNotifiche:
case EQNTipoChiamataAlertSimulator:
@@ -35,7 +35,7 @@
<nil key="highlightedColor"/>
</label>
<stackView opaque="NO" contentMode="scaleToFill" ambiguous="YES" axis="vertical" spacing="22" translatesAutoresizingMaskIntoConstraints="NO" id="WHR-BN-hfJ">
<rect key="frame" x="8" y="34" width="377.5" height="654"/>
<rect key="frame" x="8" y="34" width="377.5" height="703.5"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="You are buying the PRO version, advertisement will be removed" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="6z8-bz-exh">
<rect key="frame" x="0.0" y="0.0" width="377.5" height="41"/>
@@ -60,17 +60,17 @@ In più sostieni il progetto di ricerca il quale non riceve finanziamenti estern
<nil key="highlightedColor"/>
</label>
<stackView opaque="NO" contentMode="scaleToFill" ambiguous="YES" axis="vertical" distribution="fillEqually" translatesAutoresizingMaskIntoConstraints="NO" id="exx-jC-Bsi">
<rect key="frame" x="0.0" y="377" width="377.5" height="123.5"/>
<rect key="frame" x="0.0" y="377" width="377.5" height="173"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" ambiguous="YES" contentHorizontalAlignment="left" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Xkb-Nt-Fiw">
<rect key="frame" x="0.0" y="0.0" width="377.5" height="62"/>
<rect key="frame" x="0.0" y="0.0" width="377.5" height="86.5"/>
<state key="normal" title="Privacy disclaimer"/>
<connections>
<action selector="openExternalLinkTapped:" destination="rRh-R0-bas" eventType="touchUpInside" id="7I2-2c-6U4"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" ambiguous="YES" contentHorizontalAlignment="left" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="dnA-Yy-Ado">
<rect key="frame" x="0.0" y="62" width="377.5" height="61.5"/>
<rect key="frame" x="0.0" y="86.5" width="377.5" height="86.5"/>
<state key="normal" title="Terms and conditions"/>
<connections>
<action selector="openExternalLinkTapped:" destination="rRh-R0-bas" eventType="touchUpInside" id="eaH-Et-bch"/>
@@ -79,7 +79,7 @@ In più sostieni il progetto di ricerca il quale non riceve finanziamenti estern
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" ambiguous="YES" axis="vertical" spacing="10" translatesAutoresizingMaskIntoConstraints="NO" id="5e5-N9-PcO">
<rect key="frame" x="0.0" y="522.5" width="377.5" height="131.5"/>
<rect key="frame" x="0.0" y="572" width="377.5" height="131.5"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="You are paying:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="gGN-X8-wUL">
<rect key="frame" x="0.0" y="0.0" width="377.5" height="20.5"/>
@@ -143,8 +143,9 @@ In più sostieni il progetto di ricerca il quale non riceve finanziamenti estern
<constraint firstItem="aTr-Vm-6rY" firstAttribute="bottom" secondItem="LIA-2s-RvE" secondAttribute="bottom" id="yW8-WZ-Ncl"/>
</constraints>
</view>
<navigationItem key="navigationItem" id="DOH-gv-btw"/>
<navigationItem key="navigationItem" largeTitleDisplayMode="never" id="DOH-gv-btw"/>
<connections>
<outlet property="containerView" destination="aeL-82-LFr" id="q7p-FM-mfN"/>
<outlet property="descriptionTextLabel" destination="1Wb-RN-Qxg" id="yaP-xh-l6b"/>
<outlet property="discountTextLabel" destination="Ywi-cF-AR3" id="SoR-jd-nic"/>
<outlet property="openPrivacyButton" destination="Xkb-Nt-Fiw" id="WkY-zF-a7Q"/>
@@ -169,7 +170,7 @@ In più sostieni il progetto di ricerca il quale non riceve finanziamenti estern
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="pxx-Kc-Db6">
<rect key="frame" x="0.0" y="140" width="414" height="756"/>
<rect key="frame" x="0.0" y="88" width="414" height="808"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="X53-xC-GHZ">
<rect key="frame" x="8" y="8" width="393.5" height="805"/>
@@ -283,7 +284,7 @@ In più sostieni il progetto di ricerca il quale non riceve finanziamenti estern
</scrollView>
</subviews>
<viewLayoutGuide key="safeArea" id="pPN-XV-Rfn"/>
<color key="backgroundColor" systemColor="groupTableViewBackgroundColor"/>
<color key="backgroundColor" systemColor="systemGroupedBackgroundColor"/>
<constraints>
<constraint firstItem="pxx-Kc-Db6" firstAttribute="top" secondItem="pPN-XV-Rfn" secondAttribute="top" id="07C-Tl-ZdQ"/>
<constraint firstItem="pxx-Kc-Db6" firstAttribute="trailing" secondItem="pPN-XV-Rfn" secondAttribute="trailing" id="A9c-wR-QKt"/>
@@ -293,6 +294,7 @@ In più sostieni il progetto di ricerca il quale non riceve finanziamenti estern
</view>
<navigationItem key="navigationItem" id="yp6-rq-6l9"/>
<connections>
<outlet property="containerView" destination="X53-xC-GHZ" id="03M-s1-vhe"/>
<outlet property="openPrivacyButton" destination="ZqJ-8B-jWz" id="7PD-At-UD8"/>
<outlet property="openTermsButton" destination="Lur-Tu-wib" id="x34-JZ-2NQ"/>
<outlet property="productDescriptionLabel" destination="qZL-r3-lXS" id="nA2-Sm-FSh"/>
@@ -1031,10 +1033,10 @@ In più sostieni il progetto di ricerca il quale non riceve finanziamenti estern
<scene sceneID="9hc-If-3Tb">
<objects>
<tableViewController storyboardIdentifier="subscriptionsController" modalPresentationStyle="fullScreen" id="cXN-cY-DjM" customClass="SubscriptionsViewController" customModule="Earthquake_Network" customModuleProvider="target" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="28" sectionFooterHeight="28" id="q2Q-SQ-bFH">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="none" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="28" sectionFooterHeight="28" id="q2Q-SQ-bFH">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" systemColor="groupTableViewBackgroundColor"/>
<color key="backgroundColor" systemColor="systemGroupedBackgroundColor"/>
<prototypes>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="none" indentationWidth="10" reuseIdentifier="ActiveSubscriptionsCell" rowHeight="140" id="MQJ-yM-iDt" customClass="SubscriptionsActiveTableViewCell" customModule="Earthquake_Network" customModuleProvider="target">
<rect key="frame" x="0.0" y="28" width="414" height="140"/>
@@ -1043,48 +1045,62 @@ In più sostieni il progetto di ricerca il quale non riceve finanziamenti estern
<rect key="frame" x="0.0" y="0.0" width="414" height="140"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Active subscriptions" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="c9L-RP-VQh" customClass="EQNEdgeInsetLabel" customModule="Earthquake_Network" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="158.5" height="26"/>
<color key="backgroundColor" name="Light blue"/>
<constraints>
<constraint firstAttribute="height" constant="26" id="ErK-An-J5r"/>
</constraints>
<fontDescription key="fontDescription" type="system" weight="medium" pointSize="17"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" alignment="center" spacing="4" translatesAutoresizingMaskIntoConstraints="NO" id="g2D-09-dmu">
<rect key="frame" x="20" y="34" width="374" height="87"/>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Qua-Xe-GWL">
<rect key="frame" x="8" y="8" width="398" height="124"/>
<subviews>
<imageView hidden="YES" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="top_10k" translatesAutoresizingMaskIntoConstraints="NO" id="ZQI-Db-Pb4">
<rect key="frame" x="122" y="0.0" width="130" height="50"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Active subscriptions" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="c9L-RP-VQh" customClass="EQNEdgeInsetLabel" customModule="Earthquake_Network" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="158.5" height="26"/>
<color key="backgroundColor" name="Light blue"/>
<constraints>
<constraint firstAttribute="width" constant="130" id="fZ7-02-Ezz"/>
<constraint firstAttribute="height" constant="50" id="qsx-s4-NiD"/>
<constraint firstAttribute="height" constant="26" id="ErK-An-J5r"/>
</constraints>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="No active subscriptions" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="axa-WN-rP3">
<rect key="frame" x="98" y="0.0" width="178.5" height="87"/>
<fontDescription key="fontDescription" style="UICTFontTextStyleBody"/>
<nil key="textColor"/>
<fontDescription key="fontDescription" type="system" weight="medium" pointSize="17"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" alignment="center" spacing="4" translatesAutoresizingMaskIntoConstraints="NO" id="g2D-09-dmu">
<rect key="frame" x="48" y="34" width="322" height="62"/>
<subviews>
<imageView hidden="YES" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="top_10k" translatesAutoresizingMaskIntoConstraints="NO" id="ZQI-Db-Pb4">
<rect key="frame" x="96" y="0.0" width="130" height="50"/>
<constraints>
<constraint firstAttribute="width" constant="130" id="fZ7-02-Ezz"/>
<constraint firstAttribute="height" constant="50" id="qsx-s4-NiD"/>
</constraints>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="No active subscriptions" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="axa-WN-rP3">
<rect key="frame" x="72" y="0.0" width="178.5" height="62"/>
<fontDescription key="fontDescription" style="UICTFontTextStyleBody"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
</stackView>
</subviews>
</stackView>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
<constraints>
<constraint firstAttribute="trailing" secondItem="c9L-RP-VQh" secondAttribute="trailing" priority="250" constant="255.5" id="14i-ZH-FKD"/>
<constraint firstItem="g2D-09-dmu" firstAttribute="centerX" secondItem="Qua-Xe-GWL" secondAttribute="centerX" constant="10" id="AN3-jv-Jda"/>
<constraint firstItem="g2D-09-dmu" firstAttribute="top" secondItem="c9L-RP-VQh" secondAttribute="bottom" constant="8" id="IwZ-uA-q9y"/>
<constraint firstAttribute="bottomMargin" secondItem="g2D-09-dmu" secondAttribute="bottom" constant="20" id="asX-RQ-r3l"/>
<constraint firstItem="c9L-RP-VQh" firstAttribute="leading" secondItem="Qua-Xe-GWL" secondAttribute="leading" id="fHZ-h9-ypi"/>
<constraint firstItem="g2D-09-dmu" firstAttribute="leading" secondItem="Qua-Xe-GWL" secondAttribute="leadingMargin" constant="40" id="hJl-t8-8gM"/>
<constraint firstItem="c9L-RP-VQh" firstAttribute="top" secondItem="Qua-Xe-GWL" secondAttribute="top" id="qMw-jv-AFa"/>
<constraint firstAttribute="trailingMargin" secondItem="g2D-09-dmu" secondAttribute="trailing" constant="20" id="xp5-qM-pn7"/>
</constraints>
</view>
</subviews>
<constraints>
<constraint firstItem="g2D-09-dmu" firstAttribute="leading" secondItem="POW-zi-4UN" secondAttribute="leadingMargin" id="USb-WR-wNm"/>
<constraint firstAttribute="trailingMargin" secondItem="g2D-09-dmu" secondAttribute="trailing" id="YaO-Qz-yaz"/>
<constraint firstItem="c9L-RP-VQh" firstAttribute="top" secondItem="POW-zi-4UN" secondAttribute="top" id="aXn-Ts-fbh"/>
<constraint firstItem="g2D-09-dmu" firstAttribute="top" secondItem="c9L-RP-VQh" secondAttribute="bottom" constant="8" id="ctZ-zz-se8"/>
<constraint firstAttribute="trailing" secondItem="c9L-RP-VQh" secondAttribute="trailing" priority="250" id="esW-pI-87E"/>
<constraint firstItem="g2D-09-dmu" firstAttribute="centerX" secondItem="POW-zi-4UN" secondAttribute="centerX" id="fSa-Qb-eVd"/>
<constraint firstAttribute="bottomMargin" secondItem="g2D-09-dmu" secondAttribute="bottom" constant="8" id="rbk-tR-lYK"/>
<constraint firstItem="c9L-RP-VQh" firstAttribute="leading" secondItem="POW-zi-4UN" secondAttribute="leading" id="vBT-Qt-a6G"/>
<constraint firstAttribute="bottom" secondItem="Qua-Xe-GWL" secondAttribute="bottom" constant="8" id="2dd-ZU-S09"/>
<constraint firstItem="Qua-Xe-GWL" firstAttribute="leading" secondItem="POW-zi-4UN" secondAttribute="leading" constant="8" id="IPJ-On-GUz"/>
<constraint firstAttribute="trailing" secondItem="Qua-Xe-GWL" secondAttribute="trailing" constant="8" id="pIw-hF-VaG"/>
<constraint firstItem="Qua-Xe-GWL" firstAttribute="top" secondItem="POW-zi-4UN" secondAttribute="top" constant="8" id="yNm-sR-xl1"/>
</constraints>
</tableViewCellContentView>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<connections>
<outlet property="activeSubscriptionImageView" destination="ZQI-Db-Pb4" id="bf8-ua-1AW"/>
<outlet property="containerView" destination="Qua-Xe-GWL" id="0KS-N4-2AR"/>
<outlet property="headerLabel" destination="c9L-RP-VQh" id="ZLx-CA-yeJ"/>
<outlet property="noSubscriptionsLabel" destination="axa-WN-rP3" id="4yQ-qa-GLH"/>
</connections>
@@ -1096,57 +1112,71 @@ In più sostieni il progetto di ricerca il quale non riceve finanziamenti estern
<rect key="frame" x="0.0" y="0.0" width="414" height="400"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Priority service" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ZXY-1S-WBT" customClass="EQNEdgeInsetLabel" customModule="Earthquake_Network" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="117" height="26"/>
<color key="backgroundColor" name="Light blue"/>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="kCf-AE-JEH">
<rect key="frame" x="8" y="8" width="398" height="384"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Priority service" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ZXY-1S-WBT" customClass="EQNEdgeInsetLabel" customModule="Earthquake_Network" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="117" height="26"/>
<color key="backgroundColor" name="Light blue"/>
<constraints>
<constraint firstAttribute="height" constant="26" id="3bq-w5-2GF"/>
</constraints>
<fontDescription key="fontDescription" type="system" weight="medium" pointSize="17"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" textAlignment="justified" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="BNz-EW-lXI">
<rect key="frame" x="16" y="34" width="366" height="342"/>
<string key="text">Un'allerta è inviata agli utenti dell'app ogni volta che un sisma è rilevato in tempo reale. Allertare tutti può richiedere fino a 30 secondi in quanto non è tecnicamente fattibile farlo istantaneamente. Ora puoi entrare a far parte delle liste di priorità delle prime 10'000 o 100'000 persone allertate. L'ordine di allerta è il seguente: prima tutti gli utenti con servizio TOP 10K, successivamente tutti gli utenti con servizio TOP 100K ed infine tutti gli altri utenti. A parità di servizio, l'ordine di allerta si basa sulla distanza dall'epicentro.</string>
<fontDescription key="fontDescription" style="UICTFontTextStyleCallout"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
<constraints>
<constraint firstAttribute="height" constant="26" id="3bq-w5-2GF"/>
<constraint firstAttribute="trailing" secondItem="ZXY-1S-WBT" secondAttribute="trailing" priority="250" constant="297" id="7tO-mq-Pwc"/>
<constraint firstAttribute="trailingMargin" secondItem="BNz-EW-lXI" secondAttribute="trailing" constant="8" id="CFv-s3-cyE"/>
<constraint firstItem="BNz-EW-lXI" firstAttribute="top" secondItem="ZXY-1S-WBT" secondAttribute="bottom" constant="8" id="Coo-ku-J4a"/>
<constraint firstItem="BNz-EW-lXI" firstAttribute="leading" secondItem="kCf-AE-JEH" secondAttribute="leadingMargin" constant="8" id="PIQ-wu-11u"/>
<constraint firstItem="ZXY-1S-WBT" firstAttribute="top" secondItem="kCf-AE-JEH" secondAttribute="top" id="cG1-7Y-qjf"/>
<constraint firstAttribute="bottom" secondItem="BNz-EW-lXI" secondAttribute="bottom" constant="8" id="okG-4A-tj3"/>
<constraint firstItem="ZXY-1S-WBT" firstAttribute="leading" secondItem="kCf-AE-JEH" secondAttribute="leading" id="z3e-uS-566"/>
</constraints>
<fontDescription key="fontDescription" type="system" weight="medium" pointSize="17"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" textAlignment="justified" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="BNz-EW-lXI">
<rect key="frame" x="20" y="34" width="374" height="358"/>
<string key="text">Un'allerta è inviata agli utenti dell'app ogni volta che un sisma è rilevato in tempo reale. Allertare tutti può richiedere fino a 30 secondi in quanto non è tecnicamente fattibile farlo istantaneamente. Ora puoi entrare a far parte delle liste di priorità delle prime 10'000 o 100'000 persone allertate. L'ordine di allerta è il seguente: prima tutti gli utenti con servizio TOP 10K, successivamente tutti gli utenti con servizio TOP 100K ed infine tutti gli altri utenti. A parità di servizio, l'ordine di allerta si basa sulla distanza dall'epicentro.</string>
<fontDescription key="fontDescription" style="UICTFontTextStyleCallout"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
</view>
</subviews>
<constraints>
<constraint firstAttribute="trailing" secondItem="ZXY-1S-WBT" secondAttribute="trailing" priority="250" id="C7H-uB-CjO"/>
<constraint firstItem="BNz-EW-lXI" firstAttribute="top" secondItem="ZXY-1S-WBT" secondAttribute="bottom" constant="8" id="Dlj-OV-KyY"/>
<constraint firstItem="BNz-EW-lXI" firstAttribute="leading" secondItem="gqq-Lx-ead" secondAttribute="leadingMargin" id="O3M-Eo-y7m"/>
<constraint firstAttribute="bottom" secondItem="BNz-EW-lXI" secondAttribute="bottom" constant="8" id="PqP-v9-Jyg"/>
<constraint firstAttribute="trailingMargin" secondItem="BNz-EW-lXI" secondAttribute="trailing" id="Wm9-kw-Wal"/>
<constraint firstItem="ZXY-1S-WBT" firstAttribute="leading" secondItem="gqq-Lx-ead" secondAttribute="leading" id="vIC-j2-Aqo"/>
<constraint firstItem="ZXY-1S-WBT" firstAttribute="top" secondItem="gqq-Lx-ead" secondAttribute="top" id="yjI-LD-Gzo"/>
<constraint firstAttribute="bottom" secondItem="kCf-AE-JEH" secondAttribute="bottom" constant="8" id="GzR-SY-AP4"/>
<constraint firstItem="kCf-AE-JEH" firstAttribute="leading" secondItem="gqq-Lx-ead" secondAttribute="leading" constant="8" id="Ik0-zJ-lf3"/>
<constraint firstAttribute="trailing" secondItem="kCf-AE-JEH" secondAttribute="trailing" constant="8" id="fQU-k1-G2e"/>
<constraint firstItem="kCf-AE-JEH" firstAttribute="top" secondItem="gqq-Lx-ead" secondAttribute="top" constant="8" id="q22-Yy-szu"/>
</constraints>
</tableViewCellContentView>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<connections>
<outlet property="containerView" destination="kCf-AE-JEH" id="2fg-BQ-t5L"/>
<outlet property="descriptionLabel" destination="BNz-EW-lXI" id="bjA-4M-6Ej"/>
<outlet property="headerLabel" destination="ZXY-1S-WBT" id="0g5-nu-fz8"/>
</connections>
</tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="none" indentationWidth="10" reuseIdentifier="SectionHeaderCell" id="urG-ON-XcB" customClass="SubscriptionsHeaderTableViewCell" customModule="Earthquake_Network" customModuleProvider="target">
<rect key="frame" x="0.0" y="568" width="414" height="43.5"/>
<rect key="frame" x="0.0" y="568" width="414" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="urG-ON-XcB" id="SrE-iI-Nig">
<rect key="frame" x="0.0" y="0.0" width="414" height="43.5"/>
<rect key="frame" x="0.0" y="0.0" width="414" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" distribution="fillProportionally" translatesAutoresizingMaskIntoConstraints="NO" id="e1H-JK-cpd">
<rect key="frame" x="0.0" y="12" width="414" height="20"/>
<rect key="frame" x="8" y="12" width="398" height="20"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" tag="1" contentMode="left" horizontalHuggingPriority="249" verticalHuggingPriority="251" horizontalCompressionResistancePriority="749" text="Monthly subscriptions" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="0xS-ly-xZg">
<rect key="frame" x="0.0" y="0.0" width="386" height="20"/>
<rect key="frame" x="0.0" y="0.0" width="370" height="20"/>
<fontDescription key="fontDescription" type="boldSystem" pointSize="20"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<activityIndicatorView hidden="YES" opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="751" verticalHuggingPriority="750" horizontalCompressionResistancePriority="751" hidesWhenStopped="YES" style="gray" translatesAutoresizingMaskIntoConstraints="NO" id="4kc-T4-2fq">
<rect key="frame" x="386" y="0.0" width="28" height="20"/>
<rect key="frame" x="370" y="0.0" width="28" height="20"/>
<constraints>
<constraint firstAttribute="width" constant="28" id="3si-0h-9NB"/>
<constraint firstAttribute="height" constant="20" id="vXr-mZ-d4H"/>
@@ -1156,18 +1186,19 @@ In più sostieni il progetto di ricerca il quale non riceve finanziamenti estern
</stackView>
</subviews>
<constraints>
<constraint firstItem="e1H-JK-cpd" firstAttribute="leading" secondItem="SrE-iI-Nig" secondAttribute="leading" id="59O-Jd-Fai"/>
<constraint firstAttribute="trailing" secondItem="e1H-JK-cpd" secondAttribute="trailing" id="HUb-bF-7ch"/>
<constraint firstItem="e1H-JK-cpd" firstAttribute="leading" secondItem="SrE-iI-Nig" secondAttribute="leading" constant="8" id="59O-Jd-Fai"/>
<constraint firstAttribute="trailing" secondItem="e1H-JK-cpd" secondAttribute="trailing" constant="8" id="HUb-bF-7ch"/>
<constraint firstItem="e1H-JK-cpd" firstAttribute="centerY" secondItem="SrE-iI-Nig" secondAttribute="centerY" id="XIm-jA-fkD"/>
</constraints>
</tableViewCellContentView>
<color key="backgroundColor" systemColor="systemGroupedBackgroundColor"/>
<connections>
<outlet property="headerTitleLabel" destination="0xS-ly-xZg" id="9HL-cx-MaB"/>
<outlet property="loadingActivityIndicator" destination="4kc-T4-2fq" id="VqP-5w-IuD"/>
</connections>
</tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" reuseIdentifier="SubscriptionCell" rowHeight="140" id="ltf-er-wHX" customClass="SubscriptionProductTableViewCell" customModule="Earthquake_Network" customModuleProvider="target">
<rect key="frame" x="0.0" y="611.5" width="414" height="140"/>
<rect key="frame" x="0.0" y="612" width="414" height="140"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="ltf-er-wHX" id="ohD-ot-UaH">
<rect key="frame" x="0.0" y="0.0" width="383" height="140"/>
@@ -1218,7 +1249,7 @@ In più sostieni il progetto di ricerca il quale non riceve finanziamenti estern
<outlet property="delegate" destination="cXN-cY-DjM" id="y7A-F9-Alv"/>
</connections>
</tableView>
<navigationItem key="navigationItem" id="rLC-QL-XEw"/>
<navigationItem key="navigationItem" largeTitleDisplayMode="never" id="rLC-QL-XEw"/>
<connections>
<segue destination="tdo-m9-oeL" kind="show" identifier="ShowSubscriptionDetail" id="tjH-rC-dEM"/>
</connections>
@@ -2337,16 +2368,24 @@ Sisma rilevato da 10 smartphone</string>
</view>
<navigationItem key="navigationItem" id="UFX-6G-Mx1">
<nil key="title"/>
<barButtonItem key="rightBarButtonItem" image="navbar-icon-refresh" id="K26-D2-e2V">
<inset key="imageInsets" minX="-12" minY="0.0" maxX="-4" maxY="0.0"/>
<connections>
<action selector="refreshDataTapped:" destination="syj-UE-OWc" id="KPd-FV-q3k"/>
</connections>
</barButtonItem>
<rightBarButtonItems>
<barButtonItem image="navbar-icon-refresh" id="K26-D2-e2V">
<inset key="imageInsets" minX="-12" minY="0.0" maxX="-4" maxY="0.0"/>
<connections>
<action selector="refreshDataTapped:" destination="syj-UE-OWc" id="KPd-FV-q3k"/>
</connections>
</barButtonItem>
<barButtonItem image="navbar-icon-arrow-collapse" id="pbW-2s-ktg">
<connections>
<action selector="collapseExpandTapped:" destination="syj-UE-OWc" id="P42-dV-Dk9"/>
</connections>
</barButtonItem>
</rightBarButtonItems>
</navigationItem>
<connections>
<outlet property="bannerContainerHeightConstraint" destination="kmt-E8-s2w" id="ZM7-bg-NHB"/>
<outlet property="bannerContainerView" destination="PyX-yA-DXv" id="KjR-S3-WEU"/>
<outlet property="expandeCollapseButton" destination="pbW-2s-ktg" id="QmE-Nl-SmO"/>
<outlet property="tableView" destination="a35-sg-TCr" id="OhR-Ty-elu"/>
<segue destination="rRh-R0-bas" kind="show" identifier="ShowProVersion" id="phk-Ww-RSV"/>
<segue destination="cXN-cY-DjM" kind="show" identifier="ShowPrioritySubscriptions" id="yhm-9X-yNM"/>
@@ -2397,5 +2436,8 @@ Sisma rilevato da 10 smartphone</string>
<systemColor name="systemBackgroundColor">
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</systemColor>
<systemColor name="systemGroupedBackgroundColor">
<color red="0.94901960784313721" green="0.94901960784313721" blue="0.96862745098039216" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</systemColor>
</resources>
</document>
@@ -20,14 +20,7 @@ class EQNBaseTableViewCell: UITableViewCell {
clipsToBounds = true
// rounded corners
containerView.layer.cornerRadius = AppTheme.shared.cardCornerRadius
containerView.layer.masksToBounds = false
// apply a shadow to the container view
containerView.layer.shadowColor = UIColor.black.cgColor
containerView.layer.shadowOpacity = 0.5
containerView.layer.shadowOffset = CGSize(width: 0, height: 2)
containerView.layer.shadowRadius = 2
// rounded corners and shadow
containerView.eqn_applyShadowAndRoundedCorners()
}
}
@@ -1,25 +0,0 @@
//
// EQNInsetTableViewCell.swift
// Earthquake Network
//
// Created by Busi Andrea on 29/07/2020.
// Copyright © 2020 Earthquake Network. All rights reserved.
//
import Foundation
class EQNInsetTableViewCell: UITableViewCell {
override var frame: CGRect {
get {
return super.frame
}
set (newFrame) {
let inset: CGFloat = 15
var frame = newFrame
frame.origin.x += inset
frame.size.width -= 2 * inset
super.frame = frame
}
}
}
@@ -209,12 +209,15 @@
"network_pro_terms_conditions" = "Όροι και συνθήκες";
"network_pro_paying" = "Πληρώνετε:";
"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" = "Προσοχή";
@@ -209,12 +209,15 @@
"network_pro_terms_conditions" = "Terms and conditions";
"network_pro_paying" = "You are paying:";
"inapp_detail_description" = "• Your payment will be charged to your iTunes account upon confirmation of purchase\n• The subscription is automatically renewed unless the automatic renewal is deactivated at least 24 hours before the end of the current period\n• Subscription will be charged for renewal within 24 hours before the end of the current period and the renewal cost identified\n• Subscriptions can be managed by the user and automatic renewal can be deactivated by accessing the user's account settings after the purchase.";
"inapp_lifetime_detail_description" = "• Your payment will be charged to your iTunes account upon confirmation of purchase";
"inapp_purchase" = "SUBSCRIBE TO SERVICE";
"official_select_country_placeholder" = "Select the country";
"inapp_lifetime_subscriptions" = "Lifetime subscriptions";
"inapp_yearly_subscriptions" = "Annual subscriptions";
"inapp_monthly_subscriptions" = "Monthly subscriptions";
"inapp_monthly_payment" = "you will pay per month:";
"inapp_yearly_payment" = "you will pay per year:";
"inapp_lifetime_payment" = "you will pay:";
"ok" = "Ok";
"critical_alerts_setting" = "Critical alerts. Make a sound also in do not disturb mode";
"attention" = "Attention";
@@ -209,12 +209,15 @@
"network_pro_terms_conditions" = "Términos y condiciones";
"network_pro_paying" = "Estas pagando:";
"inapp_detail_description" = "• Su pago se cargará a su cuenta de iTunes tras la confirmación de la compra\n• La suscripción se renueva automáticamente a menos que la renovación automática se desactive al menos 24 horas antes del final del período actual\n• La suscripción se cobrará por la renovación dentro de las 24 horas antes del final del período actual y el costo de renovación identificado\n• Las suscripciones pueden ser administradas por el usuario y la renovación automática se puede desactivar accediendo a la configuración de la cuenta del usuario después de la compra.";
"inapp_lifetime_detail_description" = "• Su pago se cargará a su cuenta de iTunes tras la confirmación de la compra";
"inapp_purchase" = "SUSCRÍBETE AL SERVICIO";
"official_select_country_placeholder" = "Seleccione el pais";
"inapp_lifetime_subscriptions" = "Suscripciones de por vida";
"inapp_yearly_subscriptions" = "Suscripciones anuales";
"inapp_monthly_subscriptions" = "Suscripciones mensuales";
"inapp_monthly_payment" = "pagarás por mes:";
"inapp_yearly_payment" = "pagarás por año:";
"inapp_lifetime_payment" = "pagarás:";
"ok" = "OK";
"critical_alerts_setting" = "Alertas críticas. Emite un sonido también en el modo no molestar";
"attention" = "Atención";
@@ -209,12 +209,15 @@
"network_pro_terms_conditions" = "Termes et conditions";
"network_pro_paying" = "Vous payez:";
"inapp_detail_description" = "• Votre paiement sera débité de votre compte iTunes lors de la confirmation de l'achat\n• L'abonnement est automatiquement renouvelé sauf si le renouvellement automatique est désactivé au moins 24 heures avant la fin de la période en cours\n• L'abonnement sera facturé pour le renouvellement dans les 24 heures avant la fin de la période en cours et le coût de renouvellement identifié\n• Les abonnements peuvent être gérés par l'utilisateur et le renouvellement automatique peut être désactivé en accédant aux paramètres du compte de l'utilisateur après l'achat.";
"inapp_lifetime_detail_description" = "• Votre paiement sera débité de votre compte iTunes lors de la confirmation de l'achat";
"inapp_purchase" = "ABONNEZ-VOUS AU SERVICE";
"official_select_country_placeholder" = "Sélectionnez le pays";
"inapp_lifetime_subscriptions" = "Abonnements à vie";
"inapp_yearly_subscriptions" = "Abonnements annuels";
"inapp_monthly_subscriptions" = "Abonnements mensuels";
"inapp_monthly_payment" = "vous paierez par mois:";
"inapp_yearly_payment" = "vous paierez par an:";
"inapp_lifetime_payment" = "vous paierez:";
"ok" = "OK";
"critical_alerts_setting" = "Alertes critiques. Émettre un son également en mode Ne pas déranger";
"attention" = "Attention";
@@ -209,12 +209,15 @@
"network_pro_terms_conditions" = "Uvjeti i odredbe";
"network_pro_paying" = "Plaćate:";
"inapp_detail_description" = "• Vaša će uplata biti naplaćena na vaš iTunes račun nakon potvrde kupnje\n• Pretplata se automatski obnavlja, osim ako se automatska obnova ne deaktivira najmanje 24 sata prije kraja tekućeg razdoblja\n • Pretplata će se naplatiti za obnovu u roku od 24 sati prije kraja tekućeg razdoblja i utvrđenih troškova obnove\n • Korisnikom može upravljati pretplatama, a automatskim obnavljanjem može se deaktivirati pristupom postavkama korisničkog računa nakon kupnje.";
"inapp_lifetime_detail_description" = "• Vaša će uplata biti naplaćena na vaš iTunes račun nakon potvrde kupnje";
"inapp_purchase" = "PRETPLATITE SE NA SERVIS";
"official_select_country_placeholder" = "Odaberite zemlju";
"inapp_lifetime_subscriptions" = "Doživotne pretplate";
"inapp_yearly_subscriptions" = "Godišnje pretplate";
"inapp_monthly_subscriptions" = "Mjesečne pretplate";
"inapp_monthly_payment" = "ćete platiti po mjesecu:";
"inapp_yearly_payment" = "ćete platiti godišnje:";
"inapp_lifetime_payment" = "ćete platiti:";
"ok" = "OK";
"critical_alerts_setting" = "Kritična upozorenja. Dajte zvuk i u načinu ne ometaj";
"attention" = "Pažnja";
@@ -209,12 +209,15 @@
"network_pro_terms_conditions" = "Syarat dan ketentuan";
"network_pro_paying" = "Anda membayar:";
"inapp_detail_description" = "• Pembayaran Anda akan dibebankan ke akun iTunes Anda setelah konfirmasi pembelian\n• Langganan diperpanjang secara otomatis kecuali pembaruan otomatis dinonaktifkan setidaknya 24 jam sebelum akhir periode saat ini\n• Langganan akan dikenakan biaya untuk pembaruan dalam waktu 24 jam sebelum akhir periode berjalan dan biaya pembaruan diidentifikasi\n• Langganan dapat dikelola oleh pengguna dan pembaruan otomatis dapat dinonaktifkan dengan mengakses pengaturan akun pengguna setelah pembelian.";
"inapp_lifetime_detail_description" = "• Pembayaran Anda akan dibebankan ke akun iTunes Anda setelah konfirmasi pembelian";
"inapp_purchase" = "BERLANGGANAN LAYANAN";
"official_select_country_placeholder" = "Pilih negaranya";
"inapp_lifetime_subscriptions" = "Langganan seumur hidup";
"inapp_yearly_subscriptions" = "Langganan tahunan";
"inapp_monthly_subscriptions" = "Langganan bulanan";
"inapp_monthly_payment" = "Anda akan membayar per bulan:";
"inapp_yearly_payment" = "Anda akan membayar per tahu:";
"inapp_lifetime_payment" = "Anda akan membayar:";
"ok" = "OK";
"critical_alerts_setting" = "Peringatan kritis. Bersuara juga dalam mode jangan ganggu";
"attention" = "Perhatian";
@@ -209,12 +209,15 @@
"network_pro_terms_conditions" = "Termini e condizioni";
"network_pro_paying" = "Stai pagando:";
"inapp_detail_description" = "• Il pagamento verrà addebitato sul tuo account iTunes alla conferma dell'acquisto\n• L'abbonamento si rinnova automaticamente a meno che il rinnovo automatico non venga disattivato almeno 24 ore prima della fine del periodo corrente\n• L'abbonamento verrà addebitato per il rinnovo entro 24 ore prima della fine del periodo corrente e al costo di rinnovo indicato\n• Gli abbonamenti possono essere gestiti dall'utente e il rinnovo automatico può essere disattivato accedendo alle impostazioni dell'account dell'utente dopo l'acquisto.";
"inapp_lifetime_detail_description" = "• Il pagamento verrà addebitato sul tuo account iTunes alla conferma dell'acquisto";
"inapp_purchase" = "ISCRIVITI AL SERVIZIO";
"official_select_country_placeholder" = "Scegli la nazione";
"inapp_lifetime_subscriptions" = "Abbonamenti a vita";
"inapp_yearly_subscriptions" = "Abbonamenti annuali";
"inapp_monthly_subscriptions" = "Abbonamenti mensili";
"inapp_monthly_payment" = "pagherai al mese:";
"inapp_yearly_payment" = "pagherai all'anno:";
"inapp_lifetime_payment" = "pagherai:";
"ok" = "OK";
"critical_alerts_setting" = "Allerte critiche. Produci un suono anche in modalità non disturbare";
"attention" = "Attenzione";
@@ -209,12 +209,15 @@
"network_pro_terms_conditions" = "Şartlar ve koşullar";
"network_pro_paying" = "Ödüyorsunuz:";
"inapp_detail_description" = "• Satın alma onayının ardından ödemeniz iTunes hesabınızdan tahsil edilecektir\n• Otomatik yenileme, cari dönemin bitiminden en az 24 saat önce devre dışı bırakılmadığı sürece abonelik otomatik olarak yenilenir\n• Abonelik, 24 saat içinde yenileme için ücretlendirilir cari dönemin bitiminden saatler önce ve belirlenen yenileme maliyeti\n• Satın alma işleminden sonra kullanıcının hesap ayarlarına girilerek abonelikler kullanıcı tarafından yönetilebilir ve otomatik yenileme devre dışı bırakılabilir.";
"inapp_lifetime_detail_description" = "• Satın alma onayının ardından ödemeniz iTunes hesabınızdan tahsil edilecektir";
"inapp_purchase" = "HİZMETE ABONE OL";
"official_select_country_placeholder" = "Ülkeyi seçin";
"inapp_lifetime_subscriptions" = "Ömür boyu abonelikler";
"inapp_yearly_subscriptions" = "Yıllık abonelikler";
"inapp_monthly_subscriptions" = "Aylık abonelikler";
"inapp_monthly_payment" = "aylık ödeyeceksiniz:";
"inapp_yearly_payment" = "senelik ödeyeceksin:";
"inapp_lifetime_payment" = "ödeyeceksin:";
"ok" = "OK";
"critical_alerts_setting" = "Kritik uyarılar. Rahatsız etmeyin modunda da ses çıkar";
"attention" = "Dikkat";
+105 -81
View File
@@ -1,96 +1,120 @@
PODS:
- DZNEmptyDataSet (1.8.1)
- Firebase/Core (7.10.0):
- Firebase/Core (9.0.0):
- Firebase/CoreOnly
- FirebaseAnalytics (~> 7.10.0)
- Firebase/CoreOnly (7.10.0):
- FirebaseCore (= 7.10.0)
- Firebase/Crashlytics (7.10.0):
- FirebaseAnalytics (~> 9.0.0)
- Firebase/CoreOnly (9.0.0):
- FirebaseCore (= 9.0.0)
- Firebase/Crashlytics (9.0.0):
- Firebase/CoreOnly
- FirebaseCrashlytics (~> 7.10.0)
- Firebase/Messaging (7.10.0):
- FirebaseCrashlytics (~> 9.0.0)
- Firebase/Messaging (9.0.0):
- Firebase/CoreOnly
- FirebaseMessaging (~> 7.10.0)
- FirebaseAnalytics (7.10.0):
- FirebaseCore (~> 7.0)
- FirebaseInstallations (~> 7.0)
- GoogleAppMeasurement (= 7.10.0)
- GoogleUtilities/AppDelegateSwizzler (~> 7.0)
- GoogleUtilities/MethodSwizzler (~> 7.0)
- GoogleUtilities/Network (~> 7.0)
- "GoogleUtilities/NSData+zlib (~> 7.0)"
- FirebaseMessaging (~> 9.0.0)
- FirebaseAnalytics (9.0.0):
- FirebaseAnalytics/AdIdSupport (= 9.0.0)
- FirebaseCore (~> 9.0)
- FirebaseInstallations (~> 9.0)
- GoogleUtilities/AppDelegateSwizzler (~> 7.7)
- GoogleUtilities/MethodSwizzler (~> 7.7)
- GoogleUtilities/Network (~> 7.7)
- "GoogleUtilities/NSData+zlib (~> 7.7)"
- nanopb (~> 2.30908.0)
- FirebaseCore (7.10.0):
- FirebaseCoreDiagnostics (~> 7.4)
- GoogleUtilities/Environment (~> 7.0)
- GoogleUtilities/Logger (~> 7.0)
- FirebaseCoreDiagnostics (7.10.0):
- GoogleDataTransport (~> 8.4)
- GoogleUtilities/Environment (~> 7.0)
- GoogleUtilities/Logger (~> 7.0)
- FirebaseAnalytics/AdIdSupport (9.0.0):
- FirebaseCore (~> 9.0)
- FirebaseInstallations (~> 9.0)
- GoogleAppMeasurement (= 9.0.0)
- GoogleUtilities/AppDelegateSwizzler (~> 7.7)
- GoogleUtilities/MethodSwizzler (~> 7.7)
- GoogleUtilities/Network (~> 7.7)
- "GoogleUtilities/NSData+zlib (~> 7.7)"
- nanopb (~> 2.30908.0)
- FirebaseCrashlytics (7.10.0):
- FirebaseCore (~> 7.0)
- FirebaseInstallations (~> 7.0)
- GoogleDataTransport (~> 8.4)
- FirebaseCore (9.0.0):
- FirebaseCoreDiagnostics (~> 9.0)
- FirebaseCoreInternal (~> 9.0)
- GoogleUtilities/Environment (~> 7.7)
- GoogleUtilities/Logger (~> 7.7)
- FirebaseCoreDiagnostics (9.0.0):
- GoogleDataTransport (~> 9.1)
- GoogleUtilities/Environment (~> 7.7)
- GoogleUtilities/Logger (~> 7.7)
- nanopb (~> 2.30908.0)
- PromisesObjC (~> 1.2)
- FirebaseInstallations (7.10.0):
- FirebaseCore (~> 7.0)
- GoogleUtilities/Environment (~> 7.0)
- GoogleUtilities/UserDefaults (~> 7.0)
- PromisesObjC (~> 1.2)
- FirebaseInstanceID (7.10.0):
- FirebaseCore (~> 7.0)
- FirebaseInstallations (~> 7.0)
- GoogleUtilities/Environment (~> 7.0)
- GoogleUtilities/UserDefaults (~> 7.0)
- FirebaseMessaging (7.10.0):
- FirebaseCore (~> 7.0)
- FirebaseInstanceID (~> 7.0)
- GoogleUtilities/AppDelegateSwizzler (~> 7.0)
- GoogleUtilities/Environment (~> 7.0)
- GoogleUtilities/Reachability (~> 7.0)
- GoogleUtilities/UserDefaults (~> 7.0)
- Google-Mobile-Ads-SDK (8.3.0):
- GoogleAppMeasurement (~> 7.0)
- FirebaseCoreInternal (9.0.0):
- "GoogleUtilities/NSData+zlib (~> 7.7)"
- FirebaseCrashlytics (9.0.0):
- FirebaseCore (~> 9.0)
- FirebaseInstallations (~> 9.0)
- GoogleDataTransport (~> 9.1)
- GoogleUtilities/Environment (~> 7.7)
- nanopb (~> 2.30908.0)
- PromisesObjC (~> 2.1)
- FirebaseInstallations (9.0.0):
- FirebaseCore (~> 9.0)
- GoogleUtilities/Environment (~> 7.7)
- GoogleUtilities/UserDefaults (~> 7.7)
- PromisesObjC (~> 2.1)
- FirebaseMessaging (9.0.0):
- FirebaseCore (~> 9.0)
- FirebaseInstallations (~> 9.0)
- GoogleDataTransport (~> 9.1)
- GoogleUtilities/AppDelegateSwizzler (~> 7.7)
- GoogleUtilities/Environment (~> 7.7)
- GoogleUtilities/Reachability (~> 7.7)
- GoogleUtilities/UserDefaults (~> 7.7)
- nanopb (~> 2.30908.0)
- Google-Mobile-Ads-SDK (9.4.0):
- GoogleAppMeasurement (< 10.0, >= 7.0)
- GoogleUserMessagingPlatform (>= 1.1)
- GoogleAppMeasurement (7.10.0):
- GoogleUtilities/AppDelegateSwizzler (~> 7.0)
- GoogleUtilities/MethodSwizzler (~> 7.0)
- GoogleUtilities/Network (~> 7.0)
- "GoogleUtilities/NSData+zlib (~> 7.0)"
- GoogleAppMeasurement (9.0.0):
- GoogleAppMeasurement/AdIdSupport (= 9.0.0)
- GoogleUtilities/AppDelegateSwizzler (~> 7.7)
- GoogleUtilities/MethodSwizzler (~> 7.7)
- GoogleUtilities/Network (~> 7.7)
- "GoogleUtilities/NSData+zlib (~> 7.7)"
- nanopb (~> 2.30908.0)
- GoogleDataTransport (8.4.0):
- GoogleUtilities/Environment (~> 7.2)
- GoogleAppMeasurement/AdIdSupport (9.0.0):
- GoogleAppMeasurement/WithoutAdIdSupport (= 9.0.0)
- GoogleUtilities/AppDelegateSwizzler (~> 7.7)
- GoogleUtilities/MethodSwizzler (~> 7.7)
- GoogleUtilities/Network (~> 7.7)
- "GoogleUtilities/NSData+zlib (~> 7.7)"
- nanopb (~> 2.30908.0)
- PromisesObjC (~> 1.2)
- GoogleAppMeasurement/WithoutAdIdSupport (9.0.0):
- GoogleUtilities/AppDelegateSwizzler (~> 7.7)
- GoogleUtilities/MethodSwizzler (~> 7.7)
- GoogleUtilities/Network (~> 7.7)
- "GoogleUtilities/NSData+zlib (~> 7.7)"
- nanopb (~> 2.30908.0)
- GoogleDataTransport (9.1.4):
- GoogleUtilities/Environment (~> 7.7)
- nanopb (< 2.30910.0, >= 2.30908.0)
- PromisesObjC (< 3.0, >= 1.2)
- GoogleUserMessagingPlatform (2.0.0)
- GoogleUtilities/AppDelegateSwizzler (7.3.1):
- GoogleUtilities/AppDelegateSwizzler (7.7.0):
- GoogleUtilities/Environment
- GoogleUtilities/Logger
- GoogleUtilities/Network
- GoogleUtilities/Environment (7.3.1):
- PromisesObjC (~> 1.2)
- GoogleUtilities/Logger (7.3.1):
- GoogleUtilities/Environment (7.7.0):
- PromisesObjC (< 3.0, >= 1.2)
- GoogleUtilities/Logger (7.7.0):
- GoogleUtilities/Environment
- GoogleUtilities/MethodSwizzler (7.3.1):
- GoogleUtilities/MethodSwizzler (7.7.0):
- GoogleUtilities/Logger
- GoogleUtilities/Network (7.3.1):
- GoogleUtilities/Network (7.7.0):
- GoogleUtilities/Logger
- "GoogleUtilities/NSData+zlib"
- GoogleUtilities/Reachability
- "GoogleUtilities/NSData+zlib (7.3.1)"
- GoogleUtilities/Reachability (7.3.1):
- "GoogleUtilities/NSData+zlib (7.7.0)"
- GoogleUtilities/Reachability (7.7.0):
- GoogleUtilities/Logger
- GoogleUtilities/UserDefaults (7.3.1):
- GoogleUtilities/UserDefaults (7.7.0):
- GoogleUtilities/Logger
- nanopb (2.30908.0):
- nanopb/decode (= 2.30908.0)
- nanopb/encode (= 2.30908.0)
- nanopb/decode (2.30908.0)
- nanopb/encode (2.30908.0)
- PromisesObjC (1.2.12)
- PromisesObjC (2.1.0)
- Solar (2.1.0)
DEPENDENCIES:
@@ -108,9 +132,9 @@ SPEC REPOS:
- FirebaseAnalytics
- FirebaseCore
- FirebaseCoreDiagnostics
- FirebaseCoreInternal
- FirebaseCrashlytics
- FirebaseInstallations
- FirebaseInstanceID
- FirebaseMessaging
- Google-Mobile-Ads-SDK
- GoogleAppMeasurement
@@ -123,23 +147,23 @@ SPEC REPOS:
SPEC CHECKSUMS:
DZNEmptyDataSet: 9525833b9e68ac21c30253e1d3d7076cc828eaa7
Firebase: fffddd0bab8677d07376538365faa93ff3889b39
FirebaseAnalytics: 4641d7ae4220174f6ca5626163ffc5de2e90391e
FirebaseCore: ec566d917b2195fc2610aeb148dae99f57a788f9
FirebaseCoreDiagnostics: 5662a3823ffcc0acbaa9a21ba5ed302fac634705
FirebaseCrashlytics: e7669d368a22d202f1d0c7546ffdfdff496e1a8c
FirebaseInstallations: bf2ec8dbf36ff4c91af6b9a003d15855757680c1
FirebaseInstanceID: 5ad92c898e1328b66e8dd58811964d6fe4d334c3
FirebaseMessaging: 76b3058cef7f339cf10db196e03bbbb2165fb5d7
Google-Mobile-Ads-SDK: c14f5a63db1414b4ca0ee1539c9f3d700ace96c2
GoogleAppMeasurement: 1c863b1161fc3c8cf614a7460d1be6a7c262aab3
GoogleDataTransport: cd9db2180fcecd8da1b561aea31e3e56cf834aa7
Firebase: a876fadc5ea653a377693376fd4f885c62704512
FirebaseAnalytics: ea4f6f4b604a20b4de4d3c7f7a2cb51d9a989040
FirebaseCore: e4c0b5d9727eaee0b43f9ed00baff7500c188d7b
FirebaseCoreDiagnostics: 54410e5d156bf406a764c2722d9f77d682723b4c
FirebaseCoreInternal: 5b8f4f2e2970a4cb9bd1cf7ada16c8ba69a29530
FirebaseCrashlytics: 08561398868790fc9694b85efb4c080940926fcc
FirebaseInstallations: e693c0dfe404af44afbd553de42498b2ca1ca189
FirebaseMessaging: 411a61cde991cbd00b5b11c7a25e0c8f28c44990
Google-Mobile-Ads-SDK: 5a1d44987c82e441811ecaa5ae824e100ea819d7
GoogleAppMeasurement: 2c2792d43ebdea0524adbc90cba9139721f3039b
GoogleDataTransport: 5fffe35792f8b96ec8d6775f5eccd83c998d5a3b
GoogleUserMessagingPlatform: ab890ce5f6620f293a21b6bdd82e416a2c73aeca
GoogleUtilities: e1d9ed4e544fc32a93e00e721400cbc3f377200d
GoogleUtilities: e0913149f6b0625b553d70dae12b49fc62914fd1
nanopb: a0ba3315591a9ae0a16a309ee504766e90db0c96
PromisesObjC: 3113f7f76903778cf4a0586bd1ab89329a0b7b97
PromisesObjC: 99b6f43f9e1044bd87a95a60beff28c2c44ddb72
Solar: 2dc6e7cc39186cb0c8228fa08df76fb50c7d8f24
PODFILE CHECKSUM: dd5131b6d7a83fb7c22ecc161ed4fc143eda0ac1
COCOAPODS: 1.10.1
COCOAPODS: 1.11.3
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB