Compare commits

...

26 Commits

Author SHA1 Message Date
Andrea Busi 27dc1d8ff5 release: Increase version for release 2020-11-21 15:50:37 +01:00
Andrea Busi 4a0fe9ed09 refactor: Remove unused constants 2020-11-21 15:50:37 +01:00
Andrea Busi b382b70aa9 refactor: Reorganize some code 2020-11-21 15:50:37 +01:00
Andrea Busi 024a7c6333 feat: Add button to open subscriptions page from simulator result 2020-11-21 15:50:37 +01:00
Andrea Busi c9b4ef1aa5 feat: Add protocol to create controllers from storyboard 2020-11-21 15:50:37 +01:00
Andrea Busi f30ab9e009 refactor: Remove unused strings 2020-11-21 15:50:37 +01:00
Andrea Busi e15b7bcca2 feat: Add simulator function 2020-11-15 15:44:34 +01:00
Andrea Busi 90426c21f1 fix: Solve an issue with home layout 2020-11-15 15:44:15 +01:00
Andrea Busi 2ab07b7010 feat: Add methods to check enabled subscriptions 2020-11-15 15:44:15 +01:00
Andrea Busi be8fd7f4b5 refactor: Rewrite enum to be more Obj-C 2020-11-15 15:44:15 +01:00
Andrea Busi 4bf972747f dependency: Update Pods 2020-11-15 15:44:15 +01:00
Andrea Busi 96567c19f5 refactor: Remove unused GoogleMaps and GooglePlaces dependencies 2020-11-15 15:44:15 +01:00
Andrea Busi 82d5bd6b0d refactor: Remove some unused strings and remove extra escaping 2020-11-15 15:44:15 +01:00
Andrea Busi 889dd5e179 refactor: Improve code style 2020-11-14 17:46:39 +01:00
Andrea Busi bd8aba6992 refactor: Improve imports 2020-11-14 17:46:39 +01:00
Andrea Busi 017af0ed8e refactor: Add folder for "segnalazioni" controller 2020-11-14 15:08:23 +01:00
Andrea Busi 4f4d8dac52 fix: Add missing translation 2020-10-26 06:46:56 +01:00
Andrea Busi 122cf497b3 release: Increase version for release 2020-10-16 18:28:51 +02:00
Andrea Busi 361b51a5a2 fix: Use proper value when creating url for test alert 2020-10-16 18:28:51 +02:00
Andrea Busi bbfd28c5d2 dependency: Update Pods 2020-10-15 11:51:46 +02:00
Andrea Busi e399c53de1 feat: Add countdown inside notification content
Resolves: https://gitlab.steamware.net/eqn/eqn.ios/-/issues/28
2020-10-15 11:47:54 +02:00
Andrea Busi d8c0d48ad2 refactor: Improve notification content layout and cleanup code 2020-10-15 08:40:03 +02:00
Andrea Busi a474d5782f refactor: Improve style and comments for EQNUtility class 2020-10-15 08:40:03 +02:00
Andrea Busi c538ca7dcb refactor: Move ads utility in a dedicated class 2020-10-15 08:40:03 +02:00
Andrea Busi b11af3d138 fix: Explicit import StoreKit 2020-10-15 08:40:02 +02:00
Andrea Busi 8e1b1bd5a7 refactor: Remove not yet used sounds 2020-10-13 11:23:38 +02:00
52 changed files with 1053 additions and 1617 deletions
+20
View File
@@ -1,5 +1,25 @@
# Changelog
## Versione 3.2.0
### Build (48)
- Rimosse stringhe non utilizzate
- Aggiunto bottone per aprire pagina abbonamenti
### Build (47)
- Corretto problema layout in home
- Aggiunta funzione simulatore
- Rimosse stringhe non utilizzate e aggiornate traduzioni mancanti
## Versione 3.1.0
### Build (46)
- Corretto invio parametri per test allerta
### Build (45)
- Rimossi suoni non utilizzati
- Rivista content extension notifica
## Versione 3.0
### Build (44)
@@ -1,11 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="M4Y-Lb-cyx">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="17156" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="M4Y-Lb-cyx">
<device id="retina4_7" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14490.49"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17125"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
@@ -15,68 +13,61 @@
<objects>
<viewController id="M4Y-Lb-cyx" userLabel="Notification View Controller" customClass="NotificationViewController" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" simulatedAppContext="notificationCenter" id="S3S-Oj-5AN">
<rect key="frame" x="0.0" y="0.0" width="320" height="480"/>
<rect key="frame" x="0.0" y="0.0" width="320" height="330"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="pCT-Wh-lut">
<rect key="frame" x="30" y="28" width="274" height="33"/>
<constraints>
<constraint firstAttribute="height" constant="33" id="3nL-zP-Xy4"/>
</constraints>
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
<nil key="textColor"/>
<rect key="frame" x="8" y="216" width="304" height="20.5"/>
<fontDescription key="fontDescription" style="UICTFontTextStyleHeadline"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="f3d-th-bgU">
<rect key="frame" x="16" y="69" width="288" height="47"/>
<constraints>
<constraint firstAttribute="height" constant="47" id="ret-xK-EBP"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<label hidden="YES" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="bT3-3m-qLh">
<rect key="frame" x="16" y="124" width="288" height="29"/>
<constraints>
<constraint firstAttribute="height" constant="29" id="Uqp-c7-9jk"/>
</constraints>
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" text="Label" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="bT3-3m-qLh">
<rect key="frame" x="8" y="285" width="304" height="29"/>
<fontDescription key="fontDescription" style="UICTFontTextStyleTitle2"/>
<color key="textColor" red="0.91764705879999997" green="0.46274509800000002" blue="0.0078431372550000003" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<mapView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" mapType="standard" translatesAutoresizingMaskIntoConstraints="NO" id="4ID-Zb-OQF">
<rect key="frame" x="0.0" y="161" width="320" height="259"/>
<rect key="frame" x="0.0" y="0.0" width="320" height="200"/>
<constraints>
<constraint firstAttribute="height" relation="greaterThanOrEqual" constant="259" id="WpP-bs-nlm"/>
<constraint firstAttribute="height" constant="200" id="Pgl-8e-ePq"/>
</constraints>
<connections>
<outlet property="delegate" destination="M4Y-Lb-cyx" id="Cs2-OY-eT2"/>
</connections>
</mapView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="f3d-th-bgU">
<rect key="frame" x="8" y="244.5" width="304" height="20.5"/>
<fontDescription key="fontDescription" style="UICTFontTextStyleBody"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstItem="4ID-Zb-OQF" firstAttribute="leading" secondItem="2BE-c3-nQJ" secondAttribute="leading" id="6ml-zm-WGB"/>
<constraint firstItem="f3d-th-bgU" firstAttribute="top" secondItem="pCT-Wh-lut" secondAttribute="bottom" constant="8" id="7wZ-2G-DRJ"/>
<constraint firstItem="f3d-th-bgU" firstAttribute="leading" secondItem="2BE-c3-nQJ" secondAttribute="leading" constant="16" id="B18-89-k0p"/>
<constraint firstItem="2BE-c3-nQJ" firstAttribute="trailing" secondItem="f3d-th-bgU" secondAttribute="trailing" constant="16" id="JZ8-8S-jXR"/>
<constraint firstItem="2BE-c3-nQJ" firstAttribute="trailing" secondItem="pCT-Wh-lut" secondAttribute="trailing" constant="16" id="P48-jk-9M7"/>
<constraint firstItem="4ID-Zb-OQF" firstAttribute="top" secondItem="bT3-3m-qLh" secondAttribute="bottom" constant="8" id="beN-rS-bGS"/>
<constraint firstItem="bT3-3m-qLh" firstAttribute="leading" secondItem="2BE-c3-nQJ" secondAttribute="leading" constant="16" id="cYK-5u-EMT"/>
<constraint firstItem="4ID-Zb-OQF" firstAttribute="bottom" secondItem="2BE-c3-nQJ" secondAttribute="bottom" constant="-60" id="gfC-gJ-8KE"/>
<constraint firstItem="bT3-3m-qLh" firstAttribute="top" secondItem="f3d-th-bgU" secondAttribute="bottom" constant="8" id="ixD-Y8-JnR"/>
<constraint firstItem="4ID-Zb-OQF" firstAttribute="trailing" secondItem="2BE-c3-nQJ" secondAttribute="trailing" id="n4A-8c-Bbr"/>
<constraint firstItem="2BE-c3-nQJ" firstAttribute="trailing" secondItem="bT3-3m-qLh" secondAttribute="trailing" constant="16" id="sak-kv-U04"/>
<constraint firstItem="pCT-Wh-lut" firstAttribute="leading" secondItem="2BE-c3-nQJ" secondAttribute="leading" constant="30" id="tuy-Pe-AhL"/>
<constraint firstItem="pCT-Wh-lut" firstAttribute="top" secondItem="2BE-c3-nQJ" secondAttribute="top" constant="8" id="xC7-C5-Yju"/>
</constraints>
<viewLayoutGuide key="safeArea" id="2BE-c3-nQJ"/>
<constraints>
<constraint firstItem="pCT-Wh-lut" firstAttribute="leading" secondItem="2BE-c3-nQJ" secondAttribute="leading" constant="8" id="3cg-0U-ASJ"/>
<constraint firstItem="f3d-th-bgU" firstAttribute="leading" secondItem="pCT-Wh-lut" secondAttribute="leading" id="7qA-vV-ocI"/>
<constraint firstItem="2BE-c3-nQJ" firstAttribute="trailing" secondItem="pCT-Wh-lut" secondAttribute="trailing" constant="8" id="CAC-UM-SaJ"/>
<constraint firstItem="f3d-th-bgU" firstAttribute="trailing" secondItem="pCT-Wh-lut" secondAttribute="trailing" id="Dd7-BF-iOG"/>
<constraint firstItem="f3d-th-bgU" firstAttribute="top" secondItem="pCT-Wh-lut" secondAttribute="bottom" constant="8" id="FJ8-nn-ydU"/>
<constraint firstItem="2BE-c3-nQJ" firstAttribute="bottom" secondItem="bT3-3m-qLh" secondAttribute="bottom" constant="16" id="I71-6U-jK3"/>
<constraint firstItem="pCT-Wh-lut" firstAttribute="top" secondItem="4ID-Zb-OQF" secondAttribute="bottom" constant="16" id="It9-RA-906"/>
<constraint firstItem="bT3-3m-qLh" firstAttribute="trailing" secondItem="f3d-th-bgU" secondAttribute="trailing" id="KXf-x4-iZs"/>
<constraint firstItem="bT3-3m-qLh" firstAttribute="leading" secondItem="f3d-th-bgU" secondAttribute="leading" id="QlJ-Vh-oi4"/>
<constraint firstItem="bT3-3m-qLh" firstAttribute="top" secondItem="f3d-th-bgU" secondAttribute="bottom" constant="20" id="UUO-2F-eE7"/>
<constraint firstItem="4ID-Zb-OQF" firstAttribute="trailing" secondItem="2BE-c3-nQJ" secondAttribute="trailing" id="buf-BU-I5b"/>
<constraint firstItem="4ID-Zb-OQF" firstAttribute="leading" secondItem="2BE-c3-nQJ" secondAttribute="leading" id="e8D-ji-t64"/>
<constraint firstItem="4ID-Zb-OQF" firstAttribute="top" secondItem="2BE-c3-nQJ" secondAttribute="top" id="hL6-gc-S6i"/>
</constraints>
</view>
<extendedEdge key="edgesForExtendedLayout"/>
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
<size key="freeformSize" width="320" height="480"/>
<size key="freeformSize" width="320" height="330"/>
<connections>
<outlet property="descrizione" destination="f3d-th-bgU" id="3PP-J5-iAi"/>
<outlet property="mappa" destination="4ID-Zb-OQF" id="d2K-qy-Q7P"/>
<outlet property="onda" destination="bT3-3m-qLh" id="xoD-qM-UAF"/>
<outlet property="titolo" destination="pCT-Wh-lut" id="C0V-PC-Sai"/>
<outlet property="descriptionLabel" destination="f3d-th-bgU" id="Aym-KJ-DqY"/>
<outlet property="mapView" destination="4ID-Zb-OQF" id="x8o-nT-bL4"/>
<outlet property="titleLabel" destination="pCT-Wh-lut" id="uIg-dn-Wms"/>
<outlet property="waveLabel" destination="bT3-3m-qLh" id="AkJ-nd-d2R"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="vXp-U4-Rya" userLabel="First Responder" sceneMemberID="firstResponder"/>
@@ -2,17 +2,12 @@
// NotificationViewController.h
// EQNNotificationContent
//
// Created by Luca Beretta on 03/01/2019.
// Copyright © 2019 Luca Beretta. All rights reserved.
// Refactored by Andrea Busi on 14/10/2020.
// Copyright © 2020 Earthquake Network. All rights reserved.
//
#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
@interface NotificationViewController : UIViewController
@property (weak, nonatomic) IBOutlet UILabel *titolo;
@property (weak, nonatomic) IBOutlet UILabel *descrizione;
@property (weak, nonatomic) IBOutlet UILabel *onda;
@property (weak, nonatomic) IBOutlet MKMapView *mappa;
@end
@@ -2,82 +2,164 @@
// NotificationViewController.m
// EQNNotificationContent
//
// Created by Luca Beretta on 03/01/2019.
// Copyright © 2019 Luca Beretta. All rights reserved.
// Refactored by Andrea Busi on 14/10/2020.
// Copyright © 2020 Earthquake Network. All rights reserved.
//
#import "NotificationViewController.h"
#import <UserNotifications/UserNotifications.h>
#import <UserNotificationsUI/UserNotificationsUI.h>
#import <MapKit/MapKit.h>
#import "PastquakesAnnotation.h"
#import "ReteSismicaAnnotation.h"
#import "EQNUtility.h"
@import UserNotifications;
@import UserNotificationsUI;
@import MapKit;
@interface NotificationViewController () <UNNotificationContentExtension, MKMapViewDelegate>
@property (nonatomic, strong) NSDictionary *info;
@property (nonatomic, strong) NSURLSession *session;
@property (weak, nonatomic) IBOutlet UILabel *titleLabel;
@property (weak, nonatomic) IBOutlet UILabel *descriptionLabel;
@property (weak, nonatomic) IBOutlet UILabel *waveLabel;
@property (weak, nonatomic) IBOutlet MKMapView *mapView;
/// This will be calculated as seismic date + warning time
@property (strong, nonatomic) NSDate *userSeismicTimestamp;
@property (strong, nonatomic) NSTimer *countdownTimer;
@end
@implementation NotificationViewController
- (void)viewDidLoad {
- (void)setMapView:(MKMapView *)mapView
{
_mapView = mapView;
_mapView.scrollEnabled = NO;
_mapView.zoomEnabled = NO;
}
#pragma mark - View Lifecycle
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any required interface initialization here.
}
-(void)didReceiveNotification:(UNNotification *)notification {
- (void)didReceiveNotification:(UNNotification *)notification
{
UNNotificationContent *content = notification.request.content;
NSDictionary *userInfo = content.userInfo;
self.titolo.text = notification.request.content.title;
self.descrizione.text = notification.request.content.body;
NSDictionary *dict = notification.request.content.userInfo;
CLLocation *coordinate = [[CLLocation alloc] initWithLatitude:[dict[@"latitude"] doubleValue] longitude:[dict[@"longitude"] doubleValue]];
// set title and description
self.titleLabel.text = content.title;
self.descriptionLabel.text = content.body;
// add annotation onthe map
CLLocation *coordinate = [[CLLocation alloc] initWithLatitude:[userInfo[@"latitude"] doubleValue]
longitude:[userInfo[@"longitude"] doubleValue]];
MKCoordinateSpan span = MKCoordinateSpanMake(10.5, 10.5);
MKCoordinateRegion region = MKCoordinateRegionMake(coordinate.coordinate, span);
self.mappa.delegate = self;
[self.mappa setCenterCoordinate:coordinate.coordinate animated:NO];
[self.mappa setRegion:region animated:YES];
self.mappa.scrollEnabled = NO;
[self.mapView setCenterCoordinate:coordinate.coordinate animated:NO];
[self.mapView setRegion:region animated:YES];
if ([dict[@"type"] isEqualToString:@"eqn"]) {
PastquakesAnnotation *annotation = [[PastquakesAnnotation alloc] initWithTitle:notification.request.content.body location:coordinate.coordinate intensita:[dict[@"intensity"] intValue]];
[self.mappa addAnnotation:annotation];
}
else if ([dict[@"type"] isEqualToString:@"manual"]){
ReteSismicaAnnotation *annotation = [[ReteSismicaAnnotation alloc] initWithTitle:notification.request.content.body location:coordinate.coordinate magnitudo:[dict[@"magnitudo"] intValue]];
[self.mappa addAnnotation:annotation];
if ([userInfo[@"type"] isEqualToString:@"eqn"]) {
PastquakesAnnotation *annotation = [[PastquakesAnnotation alloc] initWithTitle:content.body
location:coordinate.coordinate
intensita:[userInfo[@"intensity"] intValue]];
[self.mapView addAnnotation:annotation];
} else if ([userInfo[@"type"] isEqualToString:@"manual"]){
ReteSismicaAnnotation *annotation = [[ReteSismicaAnnotation alloc] initWithTitle:content.body
location:coordinate.coordinate
magnitudo:[userInfo[@"magnitudo"] intValue]];
[self.mapView addAnnotation:annotation];
}
self.onda.text = [NSString stringWithFormat:@"%@ %@ %@", NSLocalizedString(@"Onda sismica in", @""), dict[@"wave_speed"], NSLocalizedString(@"secondi", @"")];
self.userSeismicTimestamp = [self calculateUserSeismicTimestampWithInfo:userInfo];
if (self.userSeismicTimestamp) {
// start the countdown
self.countdownTimer = [NSTimer scheduledTimerWithTimeInterval:1.0
target:self
selector:@selector(countdownFired:)
userInfo:nil
repeats:YES];
[self.countdownTimer fire];
}
}
-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation{
#pragma mark - Private
- (nullable NSDate *)calculateUserSeismicTimestampWithInfo:(NSDictionary *)info
{
// dobbiamo calcolare l'ora in cui il sisma arriverà nella posizione dell'utente
// per fare questo, il calcolo sarà:
// timestamp sisma + warning time
// ultima posizione nota dell'utente
CLLocationManager *manager = [[CLLocationManager alloc] init];
CLLocation *lastUserLocation = manager.location;
if (!lastUserLocation) {
return nil;
}
// posizione sisma
double latitude = [info[@"latitude"] doubleValue];
double longitude = [info[@"longitude"] doubleValue];
CLLocation *location = [[CLLocation alloc] initWithLatitude:latitude longitude:longitude];
// distanza tra sisma e utente (in km)
CLLocationDistance distance = [lastUserLocation distanceFromLocation:location];
double userDistance = distance/1000;
// calcoliamo warning_time
double waveSpeed = [info[@"wave_speed"] doubleValue];
double warningTime = round(userDistance/waveSpeed - 5);
// aggiungiamo il warning time al timestamp del sisma
NSDate *seismicDate = [EQNUtility getDateFromString:info[@"datetime"]];
NSDate *userSeismicDate = [seismicDate dateByAddingTimeInterval:warningTime];
return userSeismicDate;
}
- (void)countdownFired:(id)sender
{
NSDate *now = [NSDate date];
NSTimeInterval difference = MAX([self.userSeismicTimestamp timeIntervalSinceDate:now], 0);
self.waveLabel.text = [NSString stringWithFormat:@"%@ %.0f %@", NSLocalizedString(@"alert_wave", @""), difference, NSLocalizedString(@"alert_seconds", @"")];
if (difference <= 0) {
// stop the countdown
[self.countdownTimer invalidate];
self.countdownTimer = nil;
}
}
#pragma mark - MKMapViewDelegate
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
if ([annotation isKindOfClass:[PastquakesAnnotation class]]) {
PastquakesAnnotation *anLocation = (PastquakesAnnotation *)annotation;
MKAnnotationView *annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:IDENTIFIER_ANNOTATION_PASTQUAKES];
if (annotationView == nil)
if (annotationView == nil) {
annotationView = anLocation.annotationView;
else
} else {
annotationView.annotation = anLocation;
}
return annotationView;
}
else if ([annotation isKindOfClass:[ReteSismicaAnnotation class]]) {
} else if ([annotation isKindOfClass:[ReteSismicaAnnotation class]]) {
ReteSismicaAnnotation *anLocation = (ReteSismicaAnnotation *)annotation;
MKAnnotationView *annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:IDENTIFIER_ANNOTATION_RETESMARTPHONE];
if (annotationView == nil)
if (annotationView == nil) {
annotationView = anLocation.annotationView;
else
} else {
annotationView.annotation = anLocation;
}
return annotationView;
}
return nil;
return nil;
}
@end
@@ -20,12 +20,6 @@
8C465D9D21F7BBE700F04673 /* PastquakesAnnotation.h in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C602248218EDBE200C799C2 /* PastquakesAnnotation.h */; };
8C465D9E21F7BD8700F04673 /* PastquakesAnnotation.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C602249218EDBE200C799C2 /* PastquakesAnnotation.m */; };
8C465D9F21F7BE0600F04673 /* Assets.xcassets in Sources */ = {isa = PBXBuildFile; fileRef = 8CBD3DD12149B9AD0070C963 /* Assets.xcassets */; };
8C483CA521FBC06D00259FD2 /* alerta_japanese.m4r in Resources */ = {isa = PBXBuildFile; fileRef = 8C483CA421FBC06D00259FD2 /* alerta_japanese.m4r */; };
8C483CA621FBC06D00259FD2 /* alerta_japanese.m4r in Resources */ = {isa = PBXBuildFile; fileRef = 8C483CA421FBC06D00259FD2 /* alerta_japanese.m4r */; };
8C483CA721FBC06D00259FD2 /* alerta_japanese.m4r in Resources */ = {isa = PBXBuildFile; fileRef = 8C483CA421FBC06D00259FD2 /* alerta_japanese.m4r */; };
8C483CA921FBC1E900259FD2 /* alerta_mexico.m4r in Resources */ = {isa = PBXBuildFile; fileRef = 8C483CA821FBC1E800259FD2 /* alerta_mexico.m4r */; };
8C483CAA21FBC1E900259FD2 /* alerta_mexico.m4r in Resources */ = {isa = PBXBuildFile; fileRef = 8C483CA821FBC1E800259FD2 /* alerta_mexico.m4r */; };
8C483CAB21FBC1E900259FD2 /* alerta_mexico.m4r in Resources */ = {isa = PBXBuildFile; fileRef = 8C483CA821FBC1E800259FD2 /* alerta_mexico.m4r */; };
8C483CAE21FDA53B00259FD2 /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C483CAD21FDA53B00259FD2 /* StoreKit.framework */; };
8C483CB821FDACD300259FD2 /* IAPHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C483CB721FDACD300259FD2 /* IAPHelper.swift */; };
8C483CBC21FDACE500259FD2 /* VersioneProProducts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C483CBB21FDACE500259FD2 /* VersioneProProducts.swift */; };
@@ -82,6 +76,10 @@
DC03BEAB250BC0A60084769B /* EQNRoundedButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC03BEAA250BC0A60084769B /* EQNRoundedButton.swift */; };
DC08803F24F5A89000186D97 /* SettingEnableTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC08803E24F5A89000186D97 /* SettingEnableTableViewCell.swift */; };
DC08804124F5B41400186D97 /* SettingSliderTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC08804024F5B41400186D97 /* SettingSliderTableViewCell.swift */; };
DC0AE1A325381D4100111307 /* EQNAdsUtility.m in Sources */ = {isa = PBXBuildFile; fileRef = DC0AE1A225381D4100111307 /* EQNAdsUtility.m */; };
DC0AE1B52538202300111307 /* EQNUtility.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CF05B56218C93BA0055012B /* EQNUtility.m */; };
DC0AE1B92538204100111307 /* EQNSegnalazione.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C593E89217BA2470008B260 /* EQNSegnalazione.m */; };
DC0AE1BA2538204100111307 /* EQNPastquakes.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CF4F4DA216D44930057110B /* EQNPastquakes.m */; };
DC0E551324F8063300D54270 /* SettingSegmentedTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC0E551224F8063300D54270 /* SettingSegmentedTableViewCell.swift */; };
DC105641251E7ECE002579BB /* UIFont+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC105640251E7ECE002579BB /* UIFont+Extensions.swift */; };
DC27EB2F24F6EBE000ACBFE0 /* SettingsSeismicNetworksViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC27EB2E24F6EBE000ACBFE0 /* SettingsSeismicNetworksViewController.swift */; };
@@ -94,6 +92,7 @@
DC4B67612517833F00634277 /* EQNSeismic.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC4B67602517833F00634277 /* EQNSeismic.swift */; };
DC52B8A224FC145500ABEBA6 /* SettingsBaseViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DC52B8A124FC145500ABEBA6 /* SettingsBaseViewController.m */; };
DC52B8A524FCCD6900ABEBA6 /* AppTheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC52B8A424FCCD6900ABEBA6 /* AppTheme.swift */; };
DC553AF625692E37000B521B /* StoryboardInitializable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC553AF525692E37000B521B /* StoryboardInitializable.swift */; };
DC646F27252B694A000AA5FD /* AlertsSeismicNotificationExpandedTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC646F26252B694A000AA5FD /* AlertsSeismicNotificationExpandedTableViewCell.swift */; };
DC646F32252B698B000AA5FD /* AlertsSeismicNotificationCompactTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC646F31252B698B000AA5FD /* AlertsSeismicNotificationCompactTableViewCell.swift */; };
DC65B391250F243E00251693 /* SeismicSettingsNetworksViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC65B390250F243E00251693 /* SeismicSettingsNetworksViewController.swift */; };
@@ -211,6 +210,7 @@
DCAA913F24F68A1D00145A3D /* SettingMultivaluesTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCAA913E24F68A1D00145A3D /* SettingMultivaluesTableViewCell.swift */; };
DCB28CEE24FB8400001F557E /* SettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCB28CED24FB8400001F557E /* SettingsViewController.swift */; };
DCB45BC8250E86E100DB2D0C /* SeismicSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCB45BC7250E86E100DB2D0C /* SeismicSettingsViewController.swift */; };
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 */; };
@@ -291,8 +291,6 @@
8C2B25122193927E00E0E25E /* ReteSismiDettagliMappa.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ReteSismiDettagliMappa.h; sourceTree = "<group>"; };
8C2B25132193927E00E0E25E /* ReteSismiDettagliMappa.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ReteSismiDettagliMappa.m; sourceTree = "<group>"; };
8C465D9721F6539700F04673 /* Earthquake Network.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = "Earthquake Network.xcodeproj"; sourceTree = "<group>"; };
8C483CA421FBC06D00259FD2 /* alerta_japanese.m4r */ = {isa = PBXFileReference; lastKnownFileType = file; path = alerta_japanese.m4r; sourceTree = "<group>"; };
8C483CA821FBC1E800259FD2 /* alerta_mexico.m4r */ = {isa = PBXFileReference; lastKnownFileType = file; path = alerta_mexico.m4r; sourceTree = "<group>"; };
8C483CAD21FDA53B00259FD2 /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = System/Library/Frameworks/StoreKit.framework; sourceTree = SDKROOT; };
8C483CB021FDA8C700259FD2 /* Earthquake Network-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Earthquake Network-Bridging-Header.h"; sourceTree = "<group>"; };
8C483CB521FDACD100259FD2 /* EQNNotificationService-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "EQNNotificationService-Bridging-Header.h"; sourceTree = "<group>"; };
@@ -388,6 +386,8 @@
DC03BEAA250BC0A60084769B /* EQNRoundedButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EQNRoundedButton.swift; sourceTree = "<group>"; };
DC08803E24F5A89000186D97 /* SettingEnableTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingEnableTableViewCell.swift; sourceTree = "<group>"; };
DC08804024F5B41400186D97 /* SettingSliderTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingSliderTableViewCell.swift; sourceTree = "<group>"; };
DC0AE1A125381D4100111307 /* EQNAdsUtility.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = EQNAdsUtility.h; sourceTree = "<group>"; };
DC0AE1A225381D4100111307 /* EQNAdsUtility.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = EQNAdsUtility.m; sourceTree = "<group>"; };
DC0E551224F8063300D54270 /* SettingSegmentedTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingSegmentedTableViewCell.swift; sourceTree = "<group>"; };
DC105640251E7ECE002579BB /* UIFont+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIFont+Extensions.swift"; sourceTree = "<group>"; };
DC27EB2E24F6EBE000ACBFE0 /* SettingsSeismicNetworksViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsSeismicNetworksViewController.swift; sourceTree = "<group>"; };
@@ -402,6 +402,7 @@
DC52B8A024FC145500ABEBA6 /* SettingsBaseViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SettingsBaseViewController.h; sourceTree = "<group>"; };
DC52B8A124FC145500ABEBA6 /* SettingsBaseViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SettingsBaseViewController.m; sourceTree = "<group>"; };
DC52B8A424FCCD6900ABEBA6 /* AppTheme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppTheme.swift; sourceTree = "<group>"; };
DC553AF525692E37000B521B /* StoryboardInitializable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StoryboardInitializable.swift; sourceTree = "<group>"; };
DC646F26252B694A000AA5FD /* AlertsSeismicNotificationExpandedTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlertsSeismicNotificationExpandedTableViewCell.swift; sourceTree = "<group>"; };
DC646F31252B698B000AA5FD /* AlertsSeismicNotificationCompactTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlertsSeismicNotificationCompactTableViewCell.swift; sourceTree = "<group>"; };
DC65B390250F243E00251693 /* SeismicSettingsNetworksViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SeismicSettingsNetworksViewController.swift; sourceTree = "<group>"; };
@@ -519,6 +520,7 @@
DCAA913E24F68A1D00145A3D /* SettingMultivaluesTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingMultivaluesTableViewCell.swift; sourceTree = "<group>"; };
DCB28CED24FB8400001F557E /* SettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsViewController.swift; sourceTree = "<group>"; };
DCB45BC7250E86E100DB2D0C /* SeismicSettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SeismicSettingsViewController.swift; sourceTree = "<group>"; };
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>"; };
@@ -667,14 +669,12 @@
children = (
8CF66049214C09E0009F4314 /* model */,
8C5EA22E217645C8002DC156 /* ViewController */,
8CF66057214C566B009F4314 /* ServerRequest.h */,
8CF66055214C566A009F4314 /* ServerRequest.m */,
8CF66050214C0F7F009F4314 /* Costanti.h */,
8CBD3DC52149B9AD0070C963 /* AppDelegate.h */,
8CBD3DC62149B9AD0070C963 /* AppDelegate.m */,
8C483CB021FDA8C700259FD2 /* Earthquake Network-Bridging-Header.h */,
DCB6FBEA24D0B11300ED23B8 /* Controllers */,
DCB6FBE924D0B0DF00ED23B8 /* Models */,
DC553AFD25693C09000B521B /* Server Requests */,
DCC23DED24D28F41003A2404 /* UI */,
DC3ADD3024CB1F1E00737919 /* Storyboards */,
DC3ADD2F24CB1EFB00737919 /* Libs */,
@@ -724,8 +724,6 @@
isa = PBXGroup;
children = (
8C60224B218EDBF700C799C2 /* annotation */,
8C8EBBA521540039002784BA /* EQNUser.h */,
8C8EBBA621540039002784BA /* EQNUser.m */,
8C4E343D215012FA008B0D2A /* EQNManager.h */,
8C4E343E215012FA008B0D2A /* EQNManager.m */,
8CF66051214C12DC009F4314 /* EQNMath.h */,
@@ -736,12 +734,6 @@
8CF6604E214C0E58009F4314 /* EQNCalibrazione.m */,
8C4E34402152B5E8008B0D2A /* EQNRilevamento.h */,
8C4E34412152B5E8008B0D2A /* EQNRilevamento.m */,
8C4E34492152EE5B008B0D2A /* EQNGeneratoreURLServer.h */,
8C4E344A2152EE5B008B0D2A /* EQNGeneratoreURLServer.m */,
8CF4F4D0216D2C780057110B /* EQNReteSmartphone.h */,
8CF4F4D1216D2C780057110B /* EQNReteSmartphone.m */,
8CF4F4D6216D3A110057110B /* EQNAreaCheck.h */,
8CF4F4D7216D3A110057110B /* EQNAreaCheck.m */,
8CF4F4D9216D44930057110B /* EQNPastquakes.h */,
8CF4F4DA216D44930057110B /* EQNPastquakes.m */,
8C593E88217BA2470008B260 /* EQNSegnalazione.h */,
@@ -904,6 +896,7 @@
DC3ADD2A24CB1E6600737919 /* Supporting Files */ = {
isa = PBXGroup;
children = (
8C483CB021FDA8C700259FD2 /* Earthquake Network-Bridging-Header.h */,
DCF10DDB24D2E7BE009F34C3 /* Earthquake Network-Prefix.pch */,
8CBD3DD72149B9AD0070C963 /* main.m */,
8C10B0C42282360900125C9F /* Info.plist */,
@@ -930,8 +923,6 @@
isa = PBXGroup;
children = (
DC958D662535788E00D73D4A /* alert_sound.wav */,
8C483CA421FBC06D00259FD2 /* alerta_japanese.m4r */,
8C483CA821FBC1E800259FD2 /* alerta_mexico.m4r */,
);
path = Sound;
sourceTree = "<group>";
@@ -939,6 +930,7 @@
DC3ADD2F24CB1EFB00737919 /* Libs */ = {
isa = PBXGroup;
children = (
DC553AF525692E37000B521B /* StoryboardInitializable.swift */,
DC10563F251E7EC0002579BB /* Extensions */,
8CF66054214C566A009F4314 /* Reachability.h */,
8CF66056214C566A009F4314 /* Reachability.m */,
@@ -986,6 +978,17 @@
path = Cells;
sourceTree = "<group>";
};
DC553AFD25693C09000B521B /* Server Requests */ = {
isa = PBXGroup;
children = (
8C4E34492152EE5B008B0D2A /* EQNGeneratoreURLServer.h */,
8C4E344A2152EE5B008B0D2A /* EQNGeneratoreURLServer.m */,
8CF66057214C566B009F4314 /* ServerRequest.h */,
8CF66055214C566A009F4314 /* ServerRequest.m */,
);
path = "Server Requests";
sourceTree = "<group>";
};
DC99A50124E66DFB0071BC9F /* Commands */ = {
isa = PBXGroup;
children = (
@@ -997,6 +1000,23 @@
path = Commands;
sourceTree = "<group>";
};
DCB5281F256015EB005288E5 /* Simulator */ = {
isa = PBXGroup;
children = (
DCB528202560161C005288E5 /* AlertSimulatorViewController.swift */,
);
path = Simulator;
sourceTree = "<group>";
};
DCB528252560171A005288E5 /* Reports */ = {
isa = PBXGroup;
children = (
8C5EA23B2177B51C002DC156 /* SegnalazioniViewController.h */,
8C5EA23C2177B51C002DC156 /* SegnalazioniViewController.m */,
);
path = Reports;
sourceTree = "<group>";
};
DCB6FBE924D0B0DF00ED23B8 /* Models */ = {
isa = PBXGroup;
children = (
@@ -1012,9 +1032,17 @@
DC4B67602517833F00634277 /* EQNSeismic.swift */,
8CAFD7C321825E4A00F8BD29 /* EQNSisma.h */,
8CAFD7C421825E4A00F8BD29 /* EQNSisma.m */,
DC0AE1A125381D4100111307 /* EQNAdsUtility.h */,
DC0AE1A225381D4100111307 /* EQNAdsUtility.m */,
8CF05B55218C93BA0055012B /* EQNUtility.h */,
8CF05B56218C93BA0055012B /* EQNUtility.m */,
DCF0188E252F09C500C783F0 /* EQNUtility+Extensions.swift */,
8C8EBBA521540039002784BA /* EQNUser.h */,
8C8EBBA621540039002784BA /* EQNUser.m */,
8CF4F4D0216D2C780057110B /* EQNReteSmartphone.h */,
8CF4F4D1216D2C780057110B /* EQNReteSmartphone.m */,
8CF4F4D6216D3A110057110B /* EQNAreaCheck.h */,
8CF4F4D7216D3A110057110B /* EQNAreaCheck.m */,
);
path = Models;
sourceTree = "<group>";
@@ -1026,13 +1054,13 @@
DCDE0BD824E58CCE00209778 /* EQNMainTabBarController.m */,
DC886A5B24E92D5500F7A5D3 /* EQNBaseViewController.h */,
DC886A5C24E92D5500F7A5D3 /* EQNBaseViewController.m */,
8C5EA23B2177B51C002DC156 /* SegnalazioniViewController.h */,
8C5EA23C2177B51C002DC156 /* SegnalazioniViewController.m */,
DC3CE508250EB78C005A7DD5 /* Shared */,
DC47D1B9252A0C08004119F6 /* Alerts */,
DCB528252560171A005288E5 /* Reports */,
DCD3E3BE24D1555F007C78D4 /* InApp */,
DCEFF21024F57163009D3FE1 /* Settings */,
DC141968250E769B0059E060 /* Seismic Networks */,
DCB5281F256015EB005288E5 /* Simulator */,
);
path = Controllers;
sourceTree = "<group>";
@@ -1144,7 +1172,6 @@
8CBD3DBE2149B9AD0070C963 /* Sources */,
8CBD3DBF2149B9AD0070C963 /* Frameworks */,
8CBD3DC02149B9AD0070C963 /* Resources */,
7E813A93FDCDA54E246F0BC7 /* [CP] Copy Pods Resources */,
8CADAAA521B98C550044E256 /* Embed App Extensions */,
213FE27D012BFA5BA1F850E2 /* [CP] Embed Pods Frameworks */,
DCF07F9824D40DB600DCCA63 /* ShellScript */,
@@ -1264,7 +1291,6 @@
DC958D412535742D00D73D4A /* star6f_red2.png in Resources */,
DC958D032535742D00D73D4A /* star4_yellow2.png in Resources */,
DC958D0C2535742D00D73D4A /* star3_yellow2.png in Resources */,
8C483CA621FBC06D00259FD2 /* alerta_japanese.m4r in Resources */,
DC958D172535742D00D73D4A /* triangle2_purple2.png in Resources */,
DC958D142535742D00D73D4A /* star4r_purple2.png in Resources */,
DC958D342535742D00D73D4A /* triangle2_red2.png in Resources */,
@@ -1302,7 +1328,6 @@
DC958D2D2535742D00D73D4A /* dyamond_round_red2.png in Resources */,
DC958D3F2535742D00D73D4A /* star3_white2.png in Resources */,
DC958CE72535742D00D73D4A /* esa_green2.png in Resources */,
8C483CAA21FBC1E900259FD2 /* alerta_mexico.m4r in Resources */,
DC958D122535742D00D73D4A /* triround_inner_red2.png in Resources */,
DC958CEF2535742D00D73D4A /* penta_green2.png in Resources */,
DC958D3E2535742D00D73D4A /* star6_green2.png in Resources */,
@@ -1361,9 +1386,7 @@
buildActionMask = 2147483647;
files = (
8C4DD4F9228237E000AE77ED /* InfoPlist.strings in Resources */,
8C483CA921FBC1E900259FD2 /* alerta_mexico.m4r in Resources */,
8CBD3DD52149B9AD0070C963 /* LaunchScreen.storyboard in Resources */,
8C483CA521FBC06D00259FD2 /* alerta_japanese.m4r in Resources */,
8C10B0B92281FE7F00125C9F /* Localizable.strings in Resources */,
8C6CBAE521597E79005C426A /* GoogleService-Info.plist in Resources */,
DC958D672535788E00D73D4A /* alert_sound.wav in Resources */,
@@ -1380,8 +1403,6 @@
files = (
8CF12CDC21DE49B600613AC5 /* MainInterface.storyboard in Resources */,
8C10B0BB2281FE7F00125C9F /* Localizable.strings in Resources */,
8C483CA721FBC06D00259FD2 /* alerta_japanese.m4r in Resources */,
8C483CAB21FBC1E900259FD2 /* alerta_mexico.m4r in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -1396,18 +1417,30 @@
inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Earthquake Network/Pods-Earthquake Network-frameworks.sh",
"${BUILT_PRODUCTS_DIR}/DZNEmptyDataSet/DZNEmptyDataSet.framework",
"${BUILT_PRODUCTS_DIR}/FirebaseCore/FirebaseCore.framework",
"${BUILT_PRODUCTS_DIR}/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.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",
"${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework",
"${BUILT_PRODUCTS_DIR}/Protobuf/Protobuf.framework",
"${BUILT_PRODUCTS_DIR}/Solar/Solar.framework",
"${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework",
);
name = "[CP] Embed Pods Frameworks";
outputPaths = (
"${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}/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",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBLPromises.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Protobuf.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Solar.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/nanopb.framework",
);
@@ -1434,26 +1467,6 @@
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
7E813A93FDCDA54E246F0BC7 /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Earthquake Network/Pods-Earthquake Network-resources.sh",
"${PODS_ROOT}/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle",
"${PODS_ROOT}/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle",
);
name = "[CP] Copy Pods Resources";
outputPaths = (
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleMaps.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GooglePlaces.bundle",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Earthquake Network/Pods-Earthquake Network-resources.sh\"\n";
showEnvVarsInLog = 0;
};
DCF07F9824D40DB600DCCA63 /* ShellScript */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
@@ -1555,6 +1568,7 @@
8C4E34422152B5E8008B0D2A /* EQNRilevamento.m in Sources */,
8C7A3B66225A5EA40045B266 /* NSDictionary+EQNExtensions.m in Sources */,
8CF66053214C12DC009F4314 /* EQNMath.m in Sources */,
DC0AE1A325381D4100111307 /* EQNAdsUtility.m in Sources */,
DCF4A54524F8DB8300B17326 /* SettingDateTableViewCell.swift in Sources */,
DC7EEE4A252A11C9004B4A2A /* AlertsSmartphoneNetworkTableViewCell.swift in Sources */,
DC7EEE4F252A1634004B4A2A /* AlertsPriorityServiceTableViewCell.swift in Sources */,
@@ -1568,11 +1582,13 @@
DC105641251E7ECE002579BB /* UIFont+Extensions.swift in Sources */,
8CA46BA12194532E00C63C16 /* SismaAnnotation.m in Sources */,
DCB28CEE24FB8400001F557E /* SettingsViewController.swift in Sources */,
DCB528212560161C005288E5 /* AlertSimulatorViewController.swift in Sources */,
DCC76BD8251F56050005C4DC /* SeismicCardSettingsViewController.swift in Sources */,
DC3CE50A250EB7A8005A7DD5 /* EQNGenericPickerViewController.swift in Sources */,
8C602246218D9DB200C799C2 /* PastquakesDettagliMappa.m in Sources */,
DCEFF21A24F587E3009D3FE1 /* SettingItem.swift in Sources */,
8C8EBBA721540039002784BA /* EQNUser.m in Sources */,
DC553AF625692E37000B521B /* StoryboardInitializable.swift in Sources */,
8CADAA9421B2627D0044E256 /* LogViewController.m in Sources */,
DC3BA11124D1A9C90062EE7F /* SubscriptionsViewController.swift in Sources */,
DC646F27252B694A000AA5FD /* AlertsSeismicNotificationExpandedTableViewCell.swift in Sources */,
@@ -1585,6 +1601,9 @@
files = (
8C7CD64821F7D0F800835812 /* ReteSismicaAnnotation.m in Sources */,
8C465D9F21F7BE0600F04673 /* Assets.xcassets in Sources */,
DC0AE1B92538204100111307 /* EQNSegnalazione.m in Sources */,
DC0AE1B52538202300111307 /* EQNUtility.m in Sources */,
DC0AE1BA2538204100111307 /* EQNPastquakes.m in Sources */,
8C465D9E21F7BD8700F04673 /* PastquakesAnnotation.m in Sources */,
8CF12CD921DE49B600613AC5 /* NotificationViewController.m in Sources */,
);
@@ -1664,12 +1683,12 @@
buildSettings = {
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 44;
CURRENT_PROJECT_VERSION = 48;
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 = 3.0;
MARKETING_VERSION = 3.2.0;
PRODUCT_BUNDLE_IDENTIFIER = com.finazzi.distquake.EQNNotificationService;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "Earthquake Network Extensions - Development";
@@ -1686,12 +1705,12 @@
buildSettings = {
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 44;
CURRENT_PROJECT_VERSION = 48;
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 = 3.0;
MARKETING_VERSION = 3.2.0;
PRODUCT_BUNDLE_IDENTIFIER = com.finazzi.distquake.EQNNotificationService;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "Earthquake Network Extensions - Development";
@@ -1824,14 +1843,14 @@
CODE_SIGN_ENTITLEMENTS = "Earthquake Network/Earthquake Network.entitlements";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 44;
CURRENT_PROJECT_VERSION = 48;
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 = 3.0;
MARKETING_VERSION = 3.2.0;
PRODUCT_BUNDLE_IDENTIFIER = com.finazzi.distquake;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE = "";
@@ -1852,13 +1871,13 @@
CODE_SIGN_ENTITLEMENTS = "Earthquake Network/Earthquake Network.entitlements";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 44;
CURRENT_PROJECT_VERSION = 48;
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 = 3.0;
MARKETING_VERSION = 3.2.0;
PRODUCT_BUNDLE_IDENTIFIER = com.finazzi.distquake;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE = "";
@@ -1874,12 +1893,12 @@
buildSettings = {
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 44;
CURRENT_PROJECT_VERSION = 48;
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 = 3.0;
MARKETING_VERSION = 3.2.0;
PRODUCT_BUNDLE_IDENTIFIER = com.finazzi.distquake.EQNNotificationContent;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "Earthquake Network Extensions - Development";
@@ -1896,12 +1915,12 @@
buildSettings = {
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 44;
CURRENT_PROJECT_VERSION = 48;
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 = 3.0;
MARKETING_VERSION = 3.2.0;
PRODUCT_BUNDLE_IDENTIFIER = com.finazzi.distquake.EQNNotificationContent;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "Earthquake Network Extensions - Development";
+1 -3
View File
@@ -19,7 +19,6 @@
#import "EQNNotificheReteSismiche.h"
#import "EQNMainTabBarController.h"
@import GoogleMaps;
@import Firebase;
@import UserNotifications;
@import GoogleMobileAds;
@@ -33,7 +32,6 @@
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// start 3rd party SDKs and custom managers
[GMSServices provideAPIKey:GOOGLE_MAP_KEY];
[GADMobileAds.sharedInstance startWithCompletionHandler:^(GADInitializationStatus *status) {
NSLog(@"[AppDelegate] GADMobileAds started with status: %@", status);
}];
@@ -139,7 +137,7 @@
- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
NSURL *url = [EQNGeneratoreURLServer urlPosizione];
[[ServerRequest defaultServerConnectionSingleton] inviaInformazioniAlServerWithURL:url richiesta:posizione success:^(id result) {
[[ServerRequest defaultServerConnectionSingleton] inviaInformazioniAlServerWithURL:url richiesta:EQNTipoChiamataPosizione success:^(id result) {
completionHandler(UIBackgroundFetchResultNewData);
} failure:^(NSError *error) {
completionHandler(UIBackgroundFetchResultFailed);
@@ -176,7 +176,7 @@ typedef NS_ENUM(NSInteger, AllerteTableRow) {
- (void)actionShareApp
{
NSString *appName = [NSProcessInfo processInfo].processName;
NSString *content = [NSString stringWithFormat:@"%@%@ %@",NSLocalizedString(@"Scarica ", @""), appName, EQNAppStoreUrl];
NSString *content = [NSString stringWithFormat:@"%@ %@ %@",NSLocalizedString(@"Scarica", @""), appName, EQNAppStoreUrl];
UIActivityViewController* activityViewController = [[UIActivityViewController alloc] initWithActivityItems:@[content]
applicationActivities:nil];
@@ -195,11 +195,11 @@ typedef NS_ENUM(NSInteger, AllerteTableRow) {
[self presentViewController:controller animated:YES completion:nil];
}
- (void)actionComingSoon
- (void)actionOpenSimulator
{
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Coming soon..." message:@"🚀" preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil) style:UIAlertActionStyleDefault handler:nil]];
[self presentViewController:alert animated:YES completion:nil];
AlertSimulatorViewController *controller = [[AlertSimulatorViewController alloc] init];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:controller];
[self presentViewController:navController animated:YES completion:nil];
}
- (void)actionHowItWorks
@@ -222,7 +222,7 @@ typedef NS_ENUM(NSInteger, AllerteTableRow) {
}
NSURL *url = [EQNGeneratoreURLServer urlAlertPushTest];
[[ServerRequest defaultServerConnectionSingleton] inviaInformazioniAlServerWithURL:url richiesta:alertPushTest success:^(id result) {
[[ServerRequest defaultServerConnectionSingleton] inviaInformazioniAlServerWithURL:url richiesta:EQNTipoChiamataAlertPushTest success:^(id result) {
// nope
} failure:^(NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
@@ -281,7 +281,7 @@ typedef NS_ENUM(NSInteger, AllerteTableRow) {
[weakSelf actionTestPush];
};
cell.onTapSimulator = ^{
[weakSelf actionComingSoon];
[weakSelf actionOpenSimulator];
};
cell.onTapHowItWorks = ^{
[weakSelf actionHowItWorks];
@@ -8,6 +8,7 @@
import UIKit
import SafariServices
import StoreKit
class PurchaseProVersionViewController: UIViewController {
@@ -8,6 +8,7 @@
import UIKit
import SafariServices
import StoreKit
class SubscriptionDetailViewController: UIViewController {
@@ -7,6 +7,7 @@
//
import UIKit
import StoreKit
class SubscriptionProductTableViewCell: EQNInsetTableViewCell {
@@ -7,6 +7,7 @@
//
import UIKit
import StoreKit
class SubscriptionsActiveTableViewCell: EQNInsetTableViewCell {
@@ -7,6 +7,7 @@
//
import UIKit
import StoreKit
class SubscriptionsViewController: UITableViewController {
@@ -254,3 +255,13 @@ class SubscriptionsViewController: UITableViewController {
}
}
}
extension SubscriptionsViewController: StoryboardInitializable {
static var storyboardName: String {
"Main"
}
static var storyboardControllerId: String {
"subscriptionsController"
}
}
@@ -153,7 +153,7 @@ static NSString * const SegueIdentifierMap = @"ShowMap";
}
// ask for user confirmation
UIAlertController *alert = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Attenzione ", @"") message:NSLocalizedString(@"manual_sure", nil) preferredStyle:UIAlertControllerStyleAlert];
UIAlertController *alert = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Attenzione", @"") message:NSLocalizedString(@"manual_sure", nil) preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"manual_yes", nil) style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
[self executeSendReportWithMagnitude:sender.tag];
}]];
@@ -178,13 +178,13 @@ static NSString * const SegueIdentifierMap = @"ShowMap";
NSURL *url = [EQNGeneratoreURLServer urlInvioMessagioTerremoto:magnitude withAdress:address];
[[ServerRequest defaultServerConnectionSingleton] inviaInformazioniAlServerWithURL:url richiesta:segnalazzioneTerremoto success:^(id result) {
[[ServerRequest defaultServerConnectionSingleton] inviaInformazioniAlServerWithURL:url richiesta:EQNTipoChiamataSegnalazioneTerremoto success:^(id result) {
[self.userDefoult setObject:result forKey:CODE_MESSAGE_EQN];
[self.userDefoult setObject:[NSDate date] forKey:DATA_MESSAGE_EQN];
dispatch_async(dispatch_get_main_queue(), ^{
UIAlertController *alert = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Segnalazione ", @"")
UIAlertController *alert = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Segnalazione", @"")
message:NSLocalizedString(@"La tua segnalazione è stata inviata correttamente", @"")
preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil) style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
@@ -212,7 +212,7 @@ static NSString * const SegueIdentifierMap = @"ShowMap";
UITextField * messaggio = alertController.textFields.firstObject;
NSURL *url = [EQNGeneratoreURLServer urlInvioCommentoTerremoto:messaggio.text codeMessage:[self.userDefoult objectForKey:CODE_MESSAGE_EQN]];
[[ServerRequest defaultServerConnectionSingleton] inviaInformazioniAlServerWithURL:url richiesta:commentoTerremoto success:^(id result) {
[[ServerRequest defaultServerConnectionSingleton] inviaInformazioniAlServerWithURL:url richiesta:EQNTipoChiamataCommentoTerremoto success:^(id result) {
dispatch_async(dispatch_get_main_queue(), ^{
UIAlertController *alert = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Messaggio" , @"")
@@ -8,9 +8,10 @@
#import "ReteSismiDettagliMappa.h"
#import "SismaAnnotation.h"
#import "EQNAdsUtility.h"
@interface ReteSismiDettagliMappa ()
@property(nonatomic, strong) GADBannerView *bannerView;
@property (nonatomic, strong) GADBannerView *bannerView;
@end
@implementation ReteSismiDettagliMappa
@@ -33,7 +34,7 @@
- (void)setupUI
{
self.mapView.delegate = self;
self.bannerView = [EQNUtility ottieniBannerWithController:self position:YES];
self.bannerView = [EQNAdsUtility ottieniBannerWithController:self position:YES];
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"back"]
style:UIBarButtonItemStyleDone
@@ -183,7 +183,7 @@ class SeismicNetworksViewController: EQNBaseViewController, UITableViewDelegate,
self.createCalendarEvent(for: seismic)
} failure: {
let alert = UIAlertController(title: NSLocalizedString("Attenzione", comment: ""),
message: "Non è possibile aprire il calendario, assicurarsi di aver impostato i permessi corretti",
message: NSLocalizedString("calendar_missing_permission", comment: ""),
preferredStyle: .alert)
alert.addAction(UIAlertAction(title: NSLocalizedString("OK", comment: ""), style: .default))
self.present(alert, animated: true)
@@ -84,7 +84,7 @@ class SeismicSettingsViewController: UIViewController {
@IBAction func confirmCountryTapped(_ sender: UIButton) {
guard let network = selectedNetwork else {
let alert = UIAlertController(title: NSLocalizedString("Attenzione ", comment: ""),
let alert = UIAlertController(title: NSLocalizedString("Attenzione", comment: ""),
message: NSLocalizedString("Non hai seleziato nessuna nazione", comment: ""),
preferredStyle: .alert)
alert.addAction(UIAlertAction(title: NSLocalizedString("OK", comment: ""), style: .cancel, handler: { [unowned self] (action) in
@@ -95,7 +95,7 @@ class SeismicSettingsViewController: UIViewController {
}
// ask confirm to change settings for notifications
let alert = UIAlertController(title: NSLocalizedString("Attenzione ", comment: ""),
let alert = UIAlertController(title: NSLocalizedString("Attenzione", comment: ""),
message: NSLocalizedString("official_select_message", comment: ""),
preferredStyle: .alert)
alert.addAction(UIAlertAction(title: NSLocalizedString("Annulla", comment: ""), style: .cancel))
@@ -32,7 +32,7 @@
+ (void)saveSettings
{
[[ServerRequest defaultServerConnectionSingleton] inviaInformazioniAlServerWithURL:[EQNGeneratoreURLServer urlInvioImpostazioniNotifiche] richiesta:impostazioniNotifiche success:^(id result){
[[ServerRequest defaultServerConnectionSingleton] inviaInformazioniAlServerWithURL:[EQNGeneratoreURLServer urlInvioImpostazioniNotifiche] richiesta:EQNTipoChiamataImpostazioniNotifiche success:^(id result){
NSLog(@"Settings saved successfully");
} failure:^(NSError *error){
NSLog(@"Settings saved failed. Error: %@", error.localizedDescription);
@@ -0,0 +1,252 @@
//
// AlertSimulatorViewController.swift
// Earthquake Network
//
// Created by Busi Andrea on 14/11/2020.
// Copyright © 2020 Earthquake Network. All rights reserved.
//
import UIKit
import MapKit
class AlertSimulatorViewController: UIViewController, MKMapViewDelegate {
struct MapCircle {
let identifier: String
let distance: CLLocationDistance
let color: UIColor
}
// MARK: - Internal
private let mapCircles = [
MapCircle(identifier: "circle_internal", distance: 50_000, color: AppTheme.Colors.red),
MapCircle(identifier: "circle_external", distance: 750_000, color: AppTheme.Colors.green)
]
private lazy var viewfinderView: UIView = {
let view = UIView()
view.translatesAutoresizingMaskIntoConstraints = false
view.backgroundColor = .clear
view.isUserInteractionEnabled = false
// add central vertiacl and horizontal lines
let viewfinderVertical = UIView()
view.addSubview(viewfinderVertical)
viewfinderVertical.translatesAutoresizingMaskIntoConstraints = false
viewfinderVertical.backgroundColor = AppTheme.Colors.lightBlue
viewfinderVertical.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
viewfinderVertical.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
viewfinderVertical.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
viewfinderVertical.widthAnchor.constraint(equalToConstant: 2.0).isActive = true
let viewfinderHorizontal = UIView()
view.addSubview(viewfinderHorizontal)
viewfinderHorizontal.translatesAutoresizingMaskIntoConstraints = false
viewfinderHorizontal.backgroundColor = AppTheme.Colors.lightBlue
viewfinderHorizontal.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
viewfinderHorizontal.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
viewfinderHorizontal.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
viewfinderHorizontal.heightAnchor.constraint(equalToConstant: 2.0).isActive = true
return view
}()
private lazy var mapView: MKMapView = {
let map = MKMapView()
map.translatesAutoresizingMaskIntoConstraints = false
map.showsUserLocation = true
map.delegate = self
return map
}()
private lazy var calculateButton: UIButton = {
let button = EQNRoundedButton(type: .custom)
button.backgroundColor = .lightGray
button.setTitleColor(AppTheme.Colors.darkGray, for: .normal)
button.translatesAutoresizingMaskIntoConstraints = false
button.setTitle(NSLocalizedString("globe_simulation_button", comment: "").uppercased(), for: .normal)
button.addTarget(self, action: #selector(calculateTapped(_:)), for: .touchUpInside)
return button
}()
// MARK: - View Lifecycle
override func viewDidLoad() {
super.viewDidLoad()
let closeButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(closeTapped(_:)))
navigationItem.rightBarButtonItem = closeButton
setupUI()
configureMap()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// show an alert view functionality details
let alert = UIAlertController(title: NSLocalizedString("main_simulator", comment: ""), message: NSLocalizedString("globe_simulation", comment: ""), preferredStyle: .alert)
alert.addAction(UIAlertAction(title: NSLocalizedString("main_understood", comment: ""), style: .default))
present(alert, animated: true)
}
// MARK: - Private
private func setupUI() {
view.addSubview(mapView)
view.addSubview(viewfinderView)
view.addSubview(calculateButton)
mapView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
mapView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
mapView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
mapView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
viewfinderView.topAnchor.constraint(equalTo: mapView.topAnchor).isActive = true
viewfinderView.bottomAnchor.constraint(equalTo: mapView.bottomAnchor).isActive = true
viewfinderView.leftAnchor.constraint(equalTo: mapView.leftAnchor).isActive = true
viewfinderView.rightAnchor.constraint(equalTo: mapView.rightAnchor).isActive = true
calculateButton.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20.0).isActive = true
calculateButton.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20.0).isActive = true
calculateButton.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -10.0).isActive = true
calculateButton.heightAnchor.constraint(equalToConstant: 40.0).isActive = true
}
private func configureMap() {
guard let lastPosition = EQNUser.default().lastPosition else { return }
let span = MKCoordinateSpan(latitudeDelta: 2.0, longitudeDelta: 2.0)
let region = MKCoordinateRegion(center: lastPosition.coordinate, span: span)
mapView.setCenter(lastPosition.coordinate, animated: false)
mapView.setRegion(region, animated: true)
mapCircles.forEach { (mapCircle) in
addCircle(location: lastPosition, radius: mapCircle.distance, id: mapCircle.identifier)
}
}
private func addCircle(location: CLLocation, radius: CLLocationDistance, id: String) {
let circle = MKCircle(center: location.coordinate, radius: radius)
circle.title = id
mapView.addOverlay(circle)
}
// MARK: - Actions
@objc func closeTapped(_ sender: Any) {
dismiss(animated: true)
}
@objc func calculateTapped(_ sender: Any) {
guard let lastPosition = EQNUser.default().lastPosition,
let circleMin = mapCircles.sorted(by: { $0.distance < $1.distance }).first,
let circleMax = mapCircles.sorted(by: { $0.distance > $1.distance }).first else { return }
let location = CLLocation(latitude: mapView.centerCoordinate.latitude, longitude: mapView.centerCoordinate.longitude)
let distance = lastPosition.distance(from: location)
// check for a valid point selected by the user
if distance < circleMin.distance || distance > circleMax.distance {
let message = distance < circleMin.distance ? "globe_simulation_outside" : "globe_simulation_inside"
let alert = UIAlertController(title: NSLocalizedString("Attenzione", comment: ""), message: NSLocalizedString(message, comment: ""), preferredStyle: .alert)
alert.addAction(UIAlertAction(title: NSLocalizedString("Ok", comment: ""), style: .cancel, handler: nil))
present(alert, animated: true)
return
}
let url = EQNGeneratoreURLServer.urlAlertSimulator()
ServerRequest.default().inviaInformazioniAlServer(with: url, richiesta: .alertSimulator) { (result) in
if let result = result as? String {
DispatchQueue.main.async {
self.elaborateServerResponse(result, distance: distance)
}
}
} failure: { (error) in
DispatchQueue.main.async {
let alert = UIAlertController(title: NSLocalizedString("Attenzione", comment: ""), message: error?.localizedDescription, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: NSLocalizedString("Ok", comment: ""), style: .cancel, handler: nil))
self.present(alert, animated: true)
return
}
}
}
private func elaborateServerResponse(_ response: String, distance: CLLocationDistance) {
let isTop10k = EQNPurchaseUtility.isTop10kEnabled()
let isTop100k = EQNPurchaseUtility.isTop100kEnabled()
// server response (like '3411#12')
let split = response.split(separator: "#")
let people: Int
let popleTop10k: Int
if split.count > 1 {
//caso top10k=0 e top100k=0
people = Int(split[0]) ?? 0
popleTop10k = Int(split[1]) ?? 0
} else {
//caso top10k=1 oppure top100k=1
people = Int(split[0]) ?? 0
popleTop10k = 0
}
let distanceKm = distance / 1000
let delay = round(Double(people) / 1000.0 * 0.15) //calcolo il ritardo di allerta dovuto alla coda di utenti
let leadTime = round(Double(distanceKm) / 8.0 - 3.0) //calcolo il tempo di allerta teorico nel caso di 0 utenti in coda
let actualTime = leadTime - delay //calcolo il tempo di allerta per l'utente
//il messaggio mostrato all'utente cambia in base al fatto di possedere un abbonamento ed al tempo di allerta calcolato
//il messaggio include tag html perché cambio il colore di parte delle stringa, non so se si fa così anche in iOS
var message = ""
if (isTop10k) {
if (people == 0) {
message = String(format: NSLocalizedString("globe_simulation_message6", comment: ""), "TOP 10K", leadTime)
} else {
message = String(format: NSLocalizedString("globe_simulation_message4", comment: ""), "TOP 10K", leadTime, Double(people))
}
} else if (isTop100k) {
message = String(format: NSLocalizedString("globe_simulation_message5", comment: ""), "TOP 100K", leadTime, Double(people), "TOP 10K")
} else {
if (leadTime / actualTime < 1.4) {
message = String(format: NSLocalizedString("globe_simulation_message3", comment: ""), leadTime, Double(people), Double(popleTop10k))
} else {
if (actualTime > 0) {
message = String(format: NSLocalizedString("globe_simulation_message1", comment: ""), leadTime, Double(people), actualTime, Double(popleTop10k))
} else {
let updatedActualTime = actualTime * -1;
message = String(format: NSLocalizedString("globe_simulation_message2", comment: ""), leadTime, Double(people), updatedActualTime, Double(popleTop10k))
}
}
}
let alert = UIAlertController(title: NSLocalizedString("main_simulator", comment: ""), message: message, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: NSLocalizedString("globe_simulation_priority", comment: ""), style: .default) { (action) in
self.navigateToSubscriptions()
})
alert.addAction(UIAlertAction(title: NSLocalizedString("Ok", comment: ""), style: .cancel, handler: nil))
present(alert, animated: true)
}
private func navigateToSubscriptions() {
let controller = SubscriptionsViewController.makeController()
navigationController?.pushViewController(controller, animated: true)
}
// MARK: MKMapViewDelegate
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
if let overlay = overlay as? MKCircle, let mapCircle = mapCircles.first(where: { $0.identifier == overlay.title }) {
let circle = MKCircleRenderer(overlay: overlay)
circle.strokeColor = mapCircle.color
circle.fillColor = AppTheme.Colors.green.withAlphaComponent(0.1)
circle.lineWidth = 2.0
return circle
}
return MKOverlayRenderer(overlay: overlay)
}
}
+23 -35
View File
@@ -37,7 +37,7 @@ static NSString * const EQNServerUrlOfferTimeRemaining = @"https://srv.earthquak
static NSString * const EQNServerUrlAvailableSubscriptionsCounter = @"https://srv.earthquakenetwork.it/distquake_count_top_redis.php";
/// Carica le impostazioni delle notifiche definite dall'utente
static NSString * const EQNServerUrlUploadSettings = @"https://srv.earthquakenetwork.it/distquake_upload_settings_ios.php";
// URL registrazione server
// URL EQNTipoChiamataRegistrazione server
static NSString * const EQNServerUrlRegistration = @"https://srv.earthquakenetwork.it/distquake_upload_gcm_regid2.php";
// URL posizione server
static NSString * const EQNServerUrlUserLocation = @"https://srv.earthquakenetwork.it/distquake_upload_gcm_latlon.php";
@@ -56,6 +56,8 @@ static NSString * const EQNServerUrlSendUserReport = @"https://srv.earthquakenet
static NSString * const EQNServerUrlSendUserReportMessage = @"https://srv.earthquakenetwork.it/distquake_upload_manual_message.php";
/// Effettua un test delle notifiche push
static NSString * const EQNServerUrlTestAlarm = @"https://srv.earthquakenetwork.it/distquake_upload_testalarm.php";
/// Simulatore per calcolo pre-allerta
static NSString * const EQNServerUrlAlertSimulator = @"https://srv.earthquakenetwork.it/distquake_download_alertposition.php";
#pragma mark - UserDefaults Keys
@@ -79,18 +81,6 @@ static NSTimeInterval const EQNSendReportDelayBetweenMessages = 5.0;
/// Tempo di attesa (minuti) per l'invio di due commenti
static NSTimeInterval const EQNSendReportDelayBetweenComments = 30.0;
// colori celle tableview rete sismi
#define COLORE_CELLA_MAGNITUTE_LEGGERA [UIColor colorWithRed:208.0/255.0 green:234.0/255.0 blue:201.0/255.0 alpha:1.0]
#define COLORE_CELLA_MAGNITUTE_LEGGERA_ETI [UIColor colorWithRed:215.0/255.0 green:253.0/255.0 blue:210.0/255.0 alpha:1.0]
#define COLORE_CELLA_MAGNITUTE_MEDIA [UIColor colorWithRed:254.0/255.0 green:252.0/255.0 blue:203.0/255.0 alpha:1.0]
#define COLORE_CELLA_MAGNITUTE_MEDIA_ETI [UIColor colorWithRed:255.0/255.0 green:255.0/255.0 blue:245.0/255.0 alpha:1.0]
#define COLORE_CELLA_MAGNITUTE_FORTE [UIColor colorWithRed:254.0/255.0 green:186.0/255.0 blue:186.0/255.0 alpha:1.0]
#define COLORE_CELLA_MAGNITUTE_FORTE_ETI [UIColor colorWithRed:252.0/255.0 green:219.0/255.0 blue:219.0/255.0 alpha:1.0]
#define COLORE_CELLA_MAGNITUTE_FORTE_TESTO [UIColor colorWithRed:240.0/255.0 green:0.0/255.0 blue:14.0/255.0 alpha:1.0]
#define COLORE_CELLA_MAGNITUTE_MEDIA_TESTO [UIColor colorWithRed:238.0/255.0 green:185.0/255.0 blue:14.0/255.0 alpha:1.0]
#define COLORE_CELLA_MAGNITUTE_LEGGERA_TESTO [UIColor colorWithRed:26.0/255.0 green:144.0/255.0 blue:20.0/255.0 alpha:1.0]
// rete Smartphone
#define IDENTIFIER_ANNOTATION_RETESMARTPHONE @"IDENTIFIER_ANNOTATION_RETESMARTPHONE"
// pastequakes
@@ -123,30 +113,28 @@ typedef enum : NSInteger {
} EQNTipoDettagliMappa;
// Chiave googleMaps
#define GOOGLE_MAP_KEY @"AIzaSyDc2V2vpBmbSnAisiN18rY17Dm7lzVWNAg"
#define MESSAGGIO @"MESSAGGIO_ERRORE"
typedef enum : NSInteger {
registrazione = 0,
posizione,
calibrazione,
rilevamento,
downloadDati,
areaCheck,
pastquakes,
utentiDisponibili,
tempoDisponibile,
segnalazioneManuale,
tsunami,
segnalazzioneTerremoto,
commentoTerremoto,
impostazioniNotifiche,
offerTimeRemaining,
alertPushTest
} EQNTipoChiamata;
/// Sections inside the app
typedef NS_ENUM(NSInteger, EQNTipoChiamata) {
EQNTipoChiamataRegistrazione = 0,
EQNTipoChiamataPosizione,
EQNTipoChiamataCalibrazione,
EQNTipoChiamataRilevamento,
EQNTipoChiamataDownloadDati,
EQNTipoChiamataAreaCheck,
EQNTipoChiamataPastquakes,
EQNTipoChiamataUtentiDisponibili,
EQNTipoChiamataTempoDisponibile,
EQNTipoChiamataSegnalazioneManuale,
EQNTipoChiamataTsunami,
EQNTipoChiamataSegnalazioneTerremoto,
EQNTipoChiamataCommentoTerremoto,
EQNTipoChiamataImpostazioniNotifiche,
EQNTipoChiamataOfferTimeRemaining,
EQNTipoChiamataAlertPushTest,
EQNTipoChiamataAlertSimulator
};
// chiavi rMax e rMin
@@ -12,3 +12,5 @@
#import "ReteSismiDettagliMappa.h"
#import "SettingsBaseViewController.h"
#import "PastquakesAnnotation.h"
#import "EQNGeneratoreURLServer.h"
#import "ServerRequest.h"
@@ -0,0 +1,25 @@
//
// StoryboardInitializable.swift
//
// Created by Busi Andrea on 10/11/2020.
//
import Foundation
protocol StoryboardInitializable where Self: UIViewController {
static var storyboardName: String { get }
static var storyboardControllerId: String { get }
static func makeController() -> Self
}
extension StoryboardInitializable {
static func makeController() -> Self {
let storyboard = UIStoryboard(name: storyboardName, bundle: Bundle(for: Self.self))
guard let controller = storyboard.instantiateViewController(withIdentifier: storyboardControllerId) as? Self else {
fatalError("Unable to instantiate controller with anem \(storyboardControllerId)")
}
return controller
}
}
@@ -0,0 +1,24 @@
//
// EQNAdsUtility.h
// Earthquake Network
//
// Created by Busi Andrea on 15/10/2020.
// Copyright © 2020 Earthquake Network. All rights reserved.
//
#import <Foundation/Foundation.h>
@import GoogleMobileAds;
NS_ASSUME_NONNULL_BEGIN
@interface EQNAdsUtility : NSObject
/// Creates Ad-sense banner to show on a given controller
/// This method returns nil if the user has a Pro version, no banner has to be shown
/// @param controller Controller
/// @param isButton Is button
+ (nullable GADBannerView *)ottieniBannerWithController:(UIViewController *)controller position:(BOOL)isButton;
@end
NS_ASSUME_NONNULL_END
@@ -0,0 +1,45 @@
//
// EQNAdsUtility.m
// Earthquake Network
//
// Created by Busi Andrea on 15/10/2020.
// Copyright © 2020 Earthquake Network. All rights reserved.
//
#import "EQNAdsUtility.h"
@implementation EQNAdsUtility
#pragma mark - Public
+ (GADBannerView *)ottieniBannerWithController:(UIViewController *)controller position:(BOOL)isButton
{
if ([EQNPurchaseUtility isProVersionEnabled]) {
return nil;
}
GADBannerView *bannerView = [[GADBannerView alloc]
initWithAdSize:kGADAdSizeBanner];
bannerView.adUnitID = EQN_ADMOB_ANNUNCIO_IDA;
bannerView.rootViewController = controller;
bannerView.backgroundColor = [UIColor whiteColor];
[bannerView loadRequest:[GADRequest request]];
[self addBanner:bannerView toController:controller isTopAnchored:isButton];
return bannerView;
}
#pragma mark - Private
+ (void)addBanner:(UIView *)bannerView toController:(UIViewController *)controller isTopAnchored:(BOOL)isButton
{
bannerView.translatesAutoresizingMaskIntoConstraints = NO;
[controller.view addSubview:bannerView];
[[bannerView.centerXAnchor constraintEqualToAnchor:controller.view.centerXAnchor] setActive:YES];
NSLayoutAnchor *parentAnchor = isButton ? controller.view.safeAreaLayoutGuide.bottomAnchor : controller.view.safeAreaLayoutGuide.topAnchor;
NSLayoutAnchor *bannerAnchor = isButton ? bannerView.bottomAnchor : bannerView.topAnchor;
[[bannerAnchor constraintEqualToAnchor:parentAnchor] setActive:YES];
}
@end
@@ -3,16 +3,20 @@
// Earthquake Network
//
// Created by Luca Beretta on 09/10/18.
// Copyright © 2018 Luca Beretta. All rights reserved.
// Copyright © 2020 Earthquake Network. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface EQNAreaCheck : NSObject
@property (nonatomic, strong) NSString *total;
@property (nonatomic, strong) NSString *active;
-(id)initWithInfo:(NSArray *)info;
- (instancetype)initWithInfo:(NSArray *)info;
@end
NS_ASSUME_NONNULL_END
@@ -3,37 +3,39 @@
// Earthquake Network
//
// Created by Luca Beretta on 09/10/18.
// Copyright © 2018 Luca Beretta. All rights reserved.
// Copyright © 2020 Earthquake Network. All rights reserved.
//
#import "EQNAreaCheck.h"
@implementation EQNAreaCheck
-(id)initWithInfo:(NSArray *)info{
#pragma mark - Init
- (instancetype)initWithInfo:(NSArray *)info
{
self = [super init];
if(self != nil) {
_total = info[0][@"total"];
_active = info[1][@"active"];
if (self) {
self.total = info[0][@"total"];
self.active = info[1][@"active"];
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)encoder {
//Encode properties, other class variables, etc
#pragma mark - NSEncoding
- (void)encodeWithCoder:(NSCoder *)encoder
{
[encoder encodeObject:self.total forKey:@"total"];
[encoder encodeObject:self.active forKey:@"active"];
}
- (id)initWithCoder:(NSCoder *)decoder {
if((self = [super init])) {
//decode properties, other class vars
- (id)initWithCoder:(NSCoder *)decoder
{
self = [super init];
if (self) {
self.total = [decoder decodeObjectForKey:@"total"];
self.active = [decoder decodeObjectForKey:@"active"];
}
return self;
}
@@ -65,11 +65,23 @@ public class EQNPurchaseUtility: NSObject {
/// Check if user has bought pro app version
/// Pro version is enabled also if a yearly subscription is enabled
@objc public static func isProVersionEnabled() -> Bool {
var hasProVersion = false
VersioneProProducts.Identifier.identifierForProVersion.forEach { (identifier) in
hasProVersion = hasProVersion || UserDefaults.standard.bool(forKey: identifier)
VersioneProProducts.Identifier.identifierForProVersion.reduce(false) { (result, identifier) -> Bool in
return result || UserDefaults.standard.bool(forKey: identifier)
}
}
/// Check if user has bought Top 10k subscription
@objc public static func isTop10kEnabled() -> Bool {
VersioneProProducts.Identifier.identifiersForTop10k.reduce(false) { (result, identifier) -> Bool in
return result || UserDefaults.standard.bool(forKey: identifier)
}
}
/// Check if user has bought Top 100k subscription
@objc public static func isTop100kEnabled() -> Bool {
VersioneProProducts.Identifier.identifiersForTop100k.reduce(false) { (result, identifier) -> Bool in
return result || UserDefaults.standard.bool(forKey: identifier)
}
return hasProVersion
}
/// Remove saved in-app purchases flags.
@@ -13,7 +13,6 @@
#import "EQNGeneratoreURLServer.h"
#import "EQNUtility.h"
#import "EQNManager.h"
#import <CoreLocation/CoreLocation.h>
@implementation EQNUser
@@ -105,7 +104,7 @@
- (void)inviaregistrazioneServer:(NSString *)token withPosition:(CLLocation *)location
{
[[ServerRequest defaultServerConnectionSingleton] inviaInformazioniAlServerWithURL:[EQNGeneratoreURLServer urlRegistrazione] richiesta:registrazione success:^(id result) {
[[ServerRequest defaultServerConnectionSingleton] inviaInformazioniAlServerWithURL:[EQNGeneratoreURLServer urlRegistrazione] richiesta:EQNTipoChiamataRegistrazione success:^(id result) {
self.user_ID = [self convertUserIdIntoString:result];
[self saveUserInfo];
@@ -119,7 +118,7 @@
{
NSLog(@"URLPosizione %@", [EQNGeneratoreURLServer urlPosizione]);
[[ServerRequest defaultServerConnectionSingleton] inviaInformazioniAlServerWithURL:[EQNGeneratoreURLServer urlPosizione] richiesta:posizione success:^(id result) {
[[ServerRequest defaultServerConnectionSingleton] inviaInformazioniAlServerWithURL:[EQNGeneratoreURLServer urlPosizione] richiesta:EQNTipoChiamataPosizione success:^(id result) {
NSLog(@"inviato");
@@ -131,7 +130,7 @@
- (void)downloadOfferTimeRemainingWithCompletion:(_Nonnull timeRemainingCompletion)completionHandler
{
NSURL *url = [EQNGeneratoreURLServer urlDownloadOfferTimeRemaining];
[[ServerRequest defaultServerConnectionSingleton] inviaInformazioniAlServerWithURL:url richiesta:offerTimeRemaining success:^(id result) {
[[ServerRequest defaultServerConnectionSingleton] inviaInformazioniAlServerWithURL:url richiesta:EQNTipoChiamataOfferTimeRemaining success:^(id result) {
NSInteger timeRemaining = 0;
if ([result isKindOfClass:[NSNumber class]]) {
NSNumber *timeRemainingNumber = (NSNumber *)result;
+11 -10
View File
@@ -7,9 +7,8 @@
//
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "Costanti.h"
@import GoogleMobileAds;
@class EQNGenericValue;
@@ -28,16 +27,18 @@ NS_ASSUME_NONNULL_BEGIN
/// @param timeDifference Time differnce
+ (NSString *)formattedStringForTimeDifference:(NSInteger)timeDifference;
+(NSArray *)applicaFiltroWithTime:(EQNFiltriMappa )filtro withList:(NSArray *)list;
+(NSString *)clearStringMessaggi:(NSString *)messaggio;
+(NSInteger )getDifferenceMinute:(NSDate *)date;
/// Apply a map filter to a given set of annotations
/// @param filtro Filter to apply
/// @param list Annotations
+ (NSArray *)applicaFiltroWithTime:(EQNFiltriMappa)filtro withList:(NSArray *)list;
/// Clear a given string from unwanted characters
/// @param messaggio Cleaned string
+ (NSString *)clearStringMessaggi:(NSString *)messaggio;
/// Creates Ad-sense banner to show on a given controller
/// This method returns nil if the user has a Pro version, no banner has to be shown
/// @param controller Controller
/// @param isButton Is button
+ (nullable GADBannerView *)ottieniBannerWithController:(UIViewController *)controller position:(BOOL)isButton;
/// Calculate time difference (in minutes) between the given date and the current timestamp
/// @param date Difference (in minutes)
+ (NSInteger)getDifferenceMinute:(NSDate *)date;
/// Store an array of custom objects to NSUserDefaults
/// @param array Array to store
+34 -75
View File
@@ -48,8 +48,37 @@
return [NSString stringWithFormat:format, (long)finalValue];
}
+(NSDate *)impostaFiltroWithTime:(EQNFiltriMappa )filtro{
+ (NSArray *)applicaFiltroWithTime:(EQNFiltriMappa )filtro withList:(NSArray *)list
{
NSDate *date = [self impostaFiltroWithTime:filtro];
NSMutableArray *temp = [NSMutableArray array];
for (id object in list) {
if ([object isKindOfClass:[EQNPastquakes class]]) {
EQNPastquakes *anPasq = (EQNPastquakes *)object;
if ([anPasq.date compare:date] == NSOrderedDescending) {
[temp addObject:anPasq];
NSLog(@"\n\naggiunto %@ filtro %@", anPasq.date, date);
} else {
NSLog(@"\n\nNon aggiunto %@ filtro %@", anPasq.date, date);
}
} else if ([object isKindOfClass:[EQNSegnalazione class]]){
EQNSegnalazione *anSegn = (EQNSegnalazione *)object;
if ([anSegn.date compare:date] == NSOrderedDescending) {
[temp addObject:anSegn];
NSLog(@"\n\naggiunto %@ filtro %@", anSegn.date, date);
} else {
NSLog(@"\n\nNon aggiunto %@ filtro %@", anSegn.date, date);
}
}
}
NSLog(@"filtrati %lu tutti %lu", (unsigned long)temp.count, (unsigned long)list.count);
return temp;
}
+ (NSDate *)impostaFiltroWithTime:(EQNFiltriMappa)filtro
{
unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute;
NSDate *now = [NSDate date];
@@ -85,49 +114,10 @@
}
return [gregorian dateFromComponents:comps];
}
+(NSArray *)applicaFiltroWithTime:(EQNFiltriMappa )filtro withList:(NSArray *)list {
NSDate *date = [self impostaFiltroWithTime:filtro];
NSMutableArray *temp = [NSMutableArray array];
for (id object in list) {
if ([object isKindOfClass:[EQNPastquakes class]]) {
EQNPastquakes *anPasq = (EQNPastquakes *)object;
if ([anPasq.date compare:date] == NSOrderedDescending) {
[temp addObject:anPasq];
NSLog(@"\n\naggiunto %@ filtro %@", anPasq.date, date);
}
else{
NSLog(@"\n\nNon aggiunto %@ filtro %@", anPasq.date, date);
}
} else if ([object isKindOfClass:[EQNSegnalazione class]]){
EQNSegnalazione *anSegn = (EQNSegnalazione *)object;
if ([anSegn.date compare:date] == NSOrderedDescending) {
[temp addObject:anSegn];
NSLog(@"\n\naggiunto %@ filtro %@", anSegn.date, date);
}
else{
NSLog(@"\n\nNon aggiunto %@ filtro %@", anSegn.date, date);
}
}
}
NSLog(@"filtrati %lu tutti %lu", (unsigned long)temp.count, (unsigned long)list.count);
return temp;
}
+(NSString *)clearStringMessaggi:(NSString *)messaggio{
+ (NSString *)clearStringMessaggi:(NSString *)messaggio
{
NSString *clearString = [messaggio stringByReplacingOccurrencesOfString:@" " withString:@""];
clearString = [clearString stringByReplacingOccurrencesOfString:@"[" withString:@""];
clearString = [clearString stringByReplacingOccurrencesOfString:@"]" withString:@""];
@@ -136,13 +126,11 @@
clearString = [clearString stringByReplacingOccurrencesOfString:@">" withString:@""];
clearString = [clearString stringByReplacingOccurrencesOfString:@"/" withString:@""];
clearString = [clearString stringByReplacingOccurrencesOfString:@"span" withString:@""];
return clearString;
}
+(NSInteger )getDifferenceMinute:(NSDate *)date{
+ (NSInteger)getDifferenceMinute:(NSDate *)date
{
NSDate *now = [NSDate date];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSDateComponents *components = [calendar components:NSCalendarUnitMinute
@@ -151,35 +139,6 @@
options:0];
return components.minute;
}
+ (GADBannerView *)ottieniBannerWithController:(UIViewController *)controller position:(BOOL)isButton
{
if ([EQNPurchaseUtility isProVersionEnabled]) {
return nil;
}
GADBannerView *bannerView = [[GADBannerView alloc]
initWithAdSize:kGADAdSizeBanner];
bannerView.adUnitID = EQN_ADMOB_ANNUNCIO_IDA;
bannerView.rootViewController = controller;
bannerView.backgroundColor = [UIColor whiteColor];
[bannerView loadRequest:[GADRequest request]];
[self addBanner:bannerView toController:controller isTopAnchored:isButton];
return bannerView;
}
+ (void)addBanner:(UIView *)bannerView toController:(UIViewController *)controller isTopAnchored:(BOOL)isButton
{
bannerView.translatesAutoresizingMaskIntoConstraints = NO;
[controller.view addSubview:bannerView];
[[bannerView.centerXAnchor constraintEqualToAnchor:controller.view.centerXAnchor] setActive:YES];
NSLayoutAnchor *parentAnchor = isButton ? controller.view.safeAreaLayoutGuide.bottomAnchor : controller.view.safeAreaLayoutGuide.topAnchor;
NSLayoutAnchor *bannerAnchor = isButton ? bannerView.bottomAnchor : bannerView.topAnchor;
[[bannerAnchor constraintEqualToAnchor:parentAnchor] setActive:YES];
}
#pragma mark - Store/load data
@@ -54,6 +54,14 @@ public struct VersioneProProducts {
Subscription100kYearly, Subscription100kYearlyDiscounted
]
static let identifiersForTop10k: Set<ProductIdentifier> = [
Subscription10kMonthly, Subscription10kYearly, Subscription10kYearlyDiscounted
]
static let identifiersForTop100k: Set<ProductIdentifier> = [
Subscription100kMonthly, Subscription100kYearly, Subscription100kYearlyDiscounted
]
static let identifierForSubscriptions: Set<ProductIdentifier> = [
Subscription10kMonthly, Subscription100kMonthly,
Subscription10kYearly, Subscription10kYearlyDiscounted,
@@ -0,0 +1,30 @@
//
// EQNGeneratoreURLServer.h
// Earthquake Network
//
// Created by Luca Beretta on 19/09/18.
// Copyright © 2018 Luca Beretta. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "EQNCalibrazione.h"
#import "EQNRilevamento.h"
NS_ASSUME_NONNULL_BEGIN
@interface EQNGeneratoreURLServer : NSObject
+ (NSURL *)urlDownloadDati;
+ (NSURL *)urlRegistrazione;
+ (NSURL *)urlPosizione;
+ (NSURL *)urlMessagioStatoSmartPhone:(EQNCalibrazione *)calibrazione rilevamento:(EQNRilevamento *)rilevamento;
+ (NSURL *)urlInvioMessagioTerremoto:(NSInteger )magnitudo withAdress:(NSString *)address;
+ (NSURL *)urlInvioCommentoTerremoto:(NSString *)commento codeMessage:(NSString *)code;
+ (NSURL *)urlInvioImpostazioniNotifiche;
+ (NSURL *)urlDownloadOfferTimeRemaining;
+ (NSURL *)urlAlertPushTest;
+ (NSURL *)urlAlertSimulator;
@end
NS_ASSUME_NONNULL_END
@@ -18,34 +18,33 @@
@implementation EQNGeneratoreURLServer
+(NSURL *)urlDownloadDati{
#pragma mark - Public
+ (NSURL *)urlDownloadDati
{
NSString *stringUrl = [NSString stringWithFormat:@"%@",EQNServerUrlDownloadSmartphoneNetwork];
return [NSURL URLWithString:stringUrl];
}
+(NSURL *)urlRegistrazione{
+ (NSURL *)urlRegistrazione
{
NSString *primaRegistrazione = @"0";
if ([EQNUser defaultUser].registrato){
if ([EQNUser defaultUser].registrato) {
primaRegistrazione = @"1";
NSLog(@"Utente registrato");
}
NSString *stringUrl = [NSString stringWithFormat:@"%@?u_id=%@&r_id=%@&lat=%f&lon=%f&ios=1", EQNServerUrlRegistration, primaRegistrazione, [EQNUser defaultUser].tokenUser, [EQNUser defaultUser].lastPosition.coordinate.latitude, [EQNUser defaultUser].lastPosition.coordinate.longitude ];
NSString *stringUrl = [NSString stringWithFormat:@"%@?u_id=%@&r_id=%@&lat=%f&lon=%f&ios=1", EQNServerUrlRegistration, primaRegistrazione, [EQNUser defaultUser].tokenUser, [EQNUser defaultUser].lastPosition.coordinate.latitude, [EQNUser defaultUser].lastPosition.coordinate.longitude];
return [NSURL URLWithString:stringUrl];
}
+(NSURL *)urlPosizione{
NSString *stringUrl = [NSString stringWithFormat:@"%@?u_id=%@&lat=%f&lon=%f", EQNServerUrlUserLocation, [EQNUser defaultUser].user_ID, [EQNUser defaultUser].lastPosition.coordinate.latitude, [EQNUser defaultUser].lastPosition.coordinate.longitude ];
+ (NSURL *)urlPosizione
{
NSString *stringUrl = [NSString stringWithFormat:@"%@?u_id=%@&lat=%f&lon=%f", EQNServerUrlUserLocation, [EQNUser defaultUser].user_ID, [EQNUser defaultUser].lastPosition.coordinate.latitude, [EQNUser defaultUser].lastPosition.coordinate.longitude];
return [NSURL URLWithString:stringUrl];
}
+(NSURL *)urlMessagioStatoSmartPhone:(EQNCalibrazione *)calibrazione rilevamento:(EQNRilevamento *)rilevamento{
+ (NSURL *)urlMessagioStatoSmartPhone:(EQNCalibrazione *)calibrazione rilevamento:(EQNRilevamento *)rilevamento
{
NSString *e_t = @"0";
NSString *a_max = @"0";
@@ -60,41 +59,42 @@
NSString *acc = @"10";
NSString *d_not = @"0";
NSString *calib = @"0";
if (calibrazione.stato == calibrato)
if (calibrazione.stato == calibrato) {
calib = @"1";
}
NSString *ch = @"0";
if ([EQNUser defaultUser].inCarica)
if ([EQNUser defaultUser].inCarica) {
ch = @"1";
}
NSString *s_on = @"0";
if ([EQNUser defaultUser].monitorOn)
if ([EQNUser defaultUser].monitorOn) {
s_on = @"1";
}
NSString *tru = @"0";
NSString *upd = @"0";
if ([EQNUser defaultUser].distanza > DISTANZA_METRI_SEGNALAZIONE)
if ([EQNUser defaultUser].distanza > DISTANZA_METRI_SEGNALAZIONE) {
upd = @"1";
}
NSString *ver = [self ottieniVersioneComeIntero];
NSString *os = @"1";
NSString *stringUrl = [NSString stringWithFormat:@"%@?e_t=%@&u_id=%@&lat=%@&lon=%@&acc=%@&a_max=%@&d_not=%@&cal=%@&ch=%@&s_on=%@&tru=%@&upd=%@&ver=%@&os=%@", EQNServerUrlCalibration,e_t,u_id,lat,lon,acc,a_max,d_not,calib,ch,s_on,tru,upd,ver,os];
return [NSURL URLWithString:stringUrl];
}
+(NSString *)ottieniVersioneComeIntero{
+ (NSString *)ottieniVersioneComeIntero
{
NSNumber * versone = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
int versioneItero = [versone intValue];
return [NSString stringWithFormat:@"%i", versioneItero];
}
+(NSURL *)urlInvioMessagioTerremoto:(NSInteger )magnitudo withAdress:(NSString *)address{
+ (NSURL *)urlInvioMessagioTerremoto:(NSInteger )magnitudo withAdress:(NSString *)address
{
NSString *lat = [NSString stringWithFormat:@"%f", [EQNUser defaultUser].lastPosition.coordinate.latitude];
NSString *lon = [NSString stringWithFormat:@"%f", [EQNUser defaultUser].lastPosition.coordinate.longitude];
NSDate *date = [NSDate date];
@@ -107,25 +107,18 @@
if (url) {
return url;
}
else{
stringUrl = [NSString stringWithFormat:@"%@?u_id=%@&lat=%@&lon=%@&mag=%ld&hod=%@", EQNServerUrlSendUserReport, [EQNUser defaultUser].user_ID, lat, lon, (long)magnitudo, ora];
return [NSURL URLWithString:stringUrl];
}
stringUrl = [NSString stringWithFormat:@"%@?u_id=%@&lat=%@&lon=%@&mag=%ld&hod=%@", EQNServerUrlSendUserReport, [EQNUser defaultUser].user_ID, lat, lon, (long)magnitudo, ora];
return [NSURL URLWithString:stringUrl];
}
+(NSURL *)urlInvioCommentoTerremoto:(NSString *)commento codeMessage:(NSString *)code{
+ (NSURL *)urlInvioCommentoTerremoto:(NSString *)commento codeMessage:(NSString *)code
{
NSString *codeEscaped = [code stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet ]];
NSString* codeEscaped = [code stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet ]];
NSString* commentEscaped = [commento stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet ]];
NSString *commentEscaped = [commento stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet ]];
NSString *stringUrl = [NSString stringWithFormat:@"%@?u_id=%@&e_code=%@&message=%@", EQNServerUrlSendUserReportMessage, [EQNUser defaultUser].user_ID, codeEscaped, commentEscaped];
return [NSURL URLWithString: stringUrl];
}
+ (NSURL *)urlInvioImpostazioniNotifiche
@@ -242,7 +235,6 @@
return [NSURL URLWithString:stringUrl];
}
+ (NSURL *)urlDownloadOfferTimeRemaining
@@ -253,12 +245,22 @@
+ (NSURL *)urlAlertPushTest
{
EQNGenericValue *radius = [EQNData magitudoForteFor:[EQNNotificheReteSismiche sharedInstance].energiaTerremotiForti];
EQNGenericValue *radius = [EQNData raggioSismaFor:[EQNAllertaSismica sharedInstance].raggioSismiLievi];
CLLocationCoordinate2D lastPosition = [EQNUser defaultUser].lastPosition.coordinate;
NSString *stringUrl = [NSString stringWithFormat:@"%@?u_id=%@&radius=%@&lat=%f&lon=%f", EQNServerUrlTestAlarm, [EQNUser defaultUser].user_ID, radius.value, lastPosition.latitude, lastPosition.longitude ];
return [NSURL URLWithString:stringUrl];
}
+ (NSURL *)urlAlertSimulator
{
CLLocationCoordinate2D userLastPosition = [EQNUser defaultUser].lastPosition.coordinate;
CLLocationDistance distance = 100;
NSInteger top10k = EQNPurchaseUtility.isTop10kEnabled ? 1 : 0;
NSInteger top100k = EQNPurchaseUtility.isTop100kEnabled ? 1 : 0;
NSString *stringUrl = [NSString stringWithFormat:@"%@?lat=%f&lon=%f&dis=%f&top10k=%lu&top100k=%lu", EQNServerUrlAlertSimulator, userLastPosition.latitude, userLastPosition.longitude, distance, (long)top10k, (long)top100k];
return [NSURL URLWithString:stringUrl];
}
@end
@@ -20,7 +20,7 @@ typedef void (^errorCompletionHandler)(NSError * _Nullable error);
@property (nonatomic) BOOL isConnect;
+ (instancetype)defaultServerConnectionSingleton;
+ (instancetype)defaultServerConnectionSingleton NS_SWIFT_NAME(default());
- (void)inviaInformazioniAlServerWithURL:(NSURL *)url richiesta:(EQNTipoChiamata)chiamata success:(successCompletionHandler)onSuccess failure:(errorCompletionHandler)onFailure;
@@ -109,9 +109,12 @@
switch (httpResp.statusCode) {
case 200:
switch (chiamata) {
case posizione:
case EQNTipoChiamataPosizione:
onSuccess(@"success");
break;
case EQNTipoChiamataAlertSimulator:
onSuccess([NSString stringWithFormat:@"%@", JSON]);
break;
default:
onSuccess(JSON);
break;
@@ -128,16 +131,15 @@
}
switch (chiamata) {
case segnalazzioneTerremoto:
case EQNTipoChiamataSegnalazioneTerremoto:
onSuccess([EQNUtility clearStringMessaggi:newStr]);
break;
case rilevamento:
case EQNTipoChiamataRilevamento:
onSuccess([EQNUtility clearStringMessaggi:newStr]);
break;
case calibrazione:
onSuccess(newStr);
break;
case impostazioniNotifiche:
case EQNTipoChiamataCalibrazione:
case EQNTipoChiamataImpostazioniNotifiche:
case EQNTipoChiamataAlertSimulator:
onSuccess(newStr);
default:
// don't call the callback
@@ -3,7 +3,7 @@
<device id="retina6_1" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17125"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17126"/>
<capability name="Named colors" minToolsVersion="9.0"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="System colors in document resources" minToolsVersion="11.0"/>
@@ -1007,7 +1007,7 @@ In più sostieni il progetto di ricerca il quale non riceve finanziamenti estern
<!--Subscriptions View Controller-->
<scene sceneID="9hc-If-3Tb">
<objects>
<tableViewController modalPresentationStyle="fullScreen" id="cXN-cY-DjM" customClass="SubscriptionsViewController" customModule="Earthquake_Network" customModuleProvider="target" sceneMemberID="viewController">
<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">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
@@ -2001,7 +2001,7 @@ Sisma rilevato da 10 smartphone</string>
<rect key="frame" x="8" y="68" width="382" height="40"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="BjK-4E-Vhw" customClass="EQNRoundedButton" customModule="Earthquake_Network" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="382" height="40"/>
<rect key="frame" x="0.0" y="0.0" width="187" height="40"/>
<color key="backgroundColor" white="1" alpha="0.5" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<state key="normal" title="TEST ALERT 🚨">
<color key="titleColor" name="Gray (dark)"/>
@@ -2010,8 +2010,8 @@ Sisma rilevato da 10 smartphone</string>
<action selector="testAlertTapped" destination="vSa-gk-t22" eventType="touchUpInside" id="HNp-eo-vpW"/>
</connections>
</button>
<button hidden="YES" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="qkR-Lg-s4B" customClass="EQNRoundedButton" customModule="Earthquake_Network" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="0.0" height="40"/>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="qkR-Lg-s4B" customClass="EQNRoundedButton" customModule="Earthquake_Network" customModuleProvider="target">
<rect key="frame" x="195" y="0.0" width="187" height="40"/>
<color key="backgroundColor" white="1" alpha="0.5" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<state key="normal" title="SIMULATOR ⏱">
<color key="titleColor" name="Gray (dark)"/>
@@ -2107,13 +2107,13 @@ Sisma rilevato da 10 smartphone</string>
<stackView opaque="NO" contentMode="scaleToFill" distribution="equalSpacing" alignment="center" spacing="4" translatesAutoresizingMaskIntoConstraints="NO" id="0lY-aw-fec">
<rect key="frame" x="11.5" y="0.0" width="106.5" height="25"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Last 24h:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="hbH-vC-Yma">
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Last 24h:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="hbH-vC-Yma">
<rect key="frame" x="0.0" y="0.0" width="89" height="25"/>
<fontDescription key="fontDescription" type="system" pointSize="22"/>
<color key="textColor" name="Gray (dark)"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="0" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="BRv-IS-2fA">
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="0" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="BRv-IS-2fA">
<rect key="frame" x="93" y="0.0" width="13.5" height="25"/>
<fontDescription key="fontDescription" type="system" pointSize="22"/>
<color key="textColor" name="Gray (dark)"/>
@@ -2283,17 +2283,17 @@ Sisma rilevato da 10 smartphone</string>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" distribution="fillProportionally" translatesAutoresizingMaskIntoConstraints="NO" id="zHS-h1-Tdo">
<stackView opaque="NO" contentMode="scaleToFill" verticalHuggingPriority="251" verticalCompressionResistancePriority="751" axis="vertical" distribution="equalSpacing" translatesAutoresizingMaskIntoConstraints="NO" id="zHS-h1-Tdo">
<rect key="frame" x="8" y="34" width="284" height="102"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Be the first to be alerted when a quake is detected real time." textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="1mF-xh-GVj">
<rect key="frame" x="0.0" y="0.0" width="284" height="51"/>
<rect key="frame" x="0.0" y="0.0" width="284" height="42.5"/>
<fontDescription key="fontDescription" style="UICTFontTextStyleBody"/>
<color key="textColor" name="Gray (dark)"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="A user has subscribed to the service only %d minute ago!" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="3dQ-Eh-0Iw">
<rect key="frame" x="0.0" y="51" width="284" height="51"/>
<rect key="frame" x="0.0" y="59.5" width="284" height="42.5"/>
<fontDescription key="fontDescription" style="UICTFontTextStyleBody"/>
<color key="textColor" name="Red"/>
<nil key="highlightedColor"/>
@@ -8,16 +8,15 @@
#import <UIKit/UIKit.h>
#import "Costanti.h"
#import <MapKit/MapKit.h>
#import <GoogleMaps/GoogleMaps.h>
#import "EQNSegnalazione.h"
#import "EQNManager.h"
#import "ReteSismicaAnnotation.h"
#import "PickerViewController.h"
#import "EQNUtility.h"
#import "EQNPastquakes.h"
#import "PickerViewController.h"
@import MapKit;
@interface DettagliMappaViewController : UIViewController <MKMapViewDelegate, PickerViewDelegate>
@interface DettagliMappaViewController : UIViewController <MKMapViewDelegate>
@property (nonatomic, assign) EQNTipoDettagliMappa tipoMappa;
@property (nonatomic, strong) IBOutlet MKMapView *mapView;
@@ -8,9 +8,7 @@
#import "DettagliMappaViewController.h"
@interface DettagliMappaViewController ()
@interface DettagliMappaViewController () <PickerViewDelegate>
@property (nonatomic, strong) PickerViewController *pikerViewController;
@property (nonatomic, strong) NSMutableArray *annotationArray;
@@ -8,11 +8,12 @@
#import "PastquakesDettagliMappa.h"
#import "PastquakesAnnotation.h"
#import "EQNAdsUtility.h"
@interface PastquakesDettagliMappa () <MKMapViewDelegate>
@property (nonatomic, strong) NSMutableArray *annotationArray;
@property(nonatomic, strong) GADBannerView *bannerView;
@property (nonatomic, strong) GADBannerView *bannerView;
@end
@@ -23,7 +24,7 @@
- (void)viewDidLoad
{
self.filtroArray = @[NSLocalizedString(@"Ultimo anno", @""), NSLocalizedString(@"Ultimo mese", @""),NSLocalizedString(@"Ultima settimana", @""),NSLocalizedString(@"Ultimo giorno", @""),NSLocalizedString(@"Ultim\'ora", @"")];
self.filtroArray = @[NSLocalizedString(@"Ultimo anno", @""), NSLocalizedString(@"Ultimo mese", @""),NSLocalizedString(@"Ultima settimana", @""),NSLocalizedString(@"Ultimo giorno", @""),NSLocalizedString(@"Ultim'ora", @"")];
[super viewDidLoad];
// Do any additional setup after loading the view.
@@ -39,7 +40,7 @@
[self.buttonAzione addTarget:self action:@selector(visualizzaPikerFiltro:) forControlEvents:UIControlEventTouchDown];
[self applicaFiltroWithTime:@(2)];
self.bannerView = [EQNUtility ottieniBannerWithController:self position:NO];
self.bannerView = [EQNAdsUtility ottieniBannerWithController:self position:NO];
}
- (void)creaMarcherWithSegnalazione:(id)segnalazione
@@ -8,10 +8,12 @@
#import "SegnalazioniUtenteDettagliMappa.h"
#import "ReteSismicaAnnotation.h"
#import "EQNAdsUtility.h"
@interface SegnalazioniUtenteDettagliMappa ()
@property (nonatomic, strong) NSMutableArray *annotationArray;
@property(nonatomic, strong) GADBannerView *bannerView;
@property (nonatomic, strong) GADBannerView *bannerView;
@end
@@ -44,7 +46,7 @@
[self.buttonAzione addTarget:self action:@selector(visualizzaPikerFiltro:) forControlEvents:UIControlEventTouchDown];
[self applicaFiltroWithTime:@(0)];
self.bannerView = [EQNUtility ottieniBannerWithController:self position:NO];
self.bannerView = [EQNAdsUtility ottieniBannerWithController:self position:NO];
}
@@ -1,40 +1,15 @@
/*
Localizable.strings
Earthquake Network
Created by Luca Beretta on 07/05/2019.
Copyright © 2019 Luca Beretta. All rights reserved.
*/
/* No comment provided by engineer. */
" 10000 persone allertate." = " 10,000 people alerted.";
/* No comment provided by engineer. */
" 100000 persone allertate." = " 100,000 people alerted.";
/* No comment provided by engineer. */
"(Ora tua)" = "(Your time)";
/* No comment provided by engineer. */
"Abbonamenti annuali" = "Annual subscriptions";
/* No comment provided by engineer. */
"Abbonamenti mensili" = "Monthly subscriptions";
/* No comment provided by engineer. */
"Abbonamento annuale, priorità 10000 persone " = "Annual subscription, priority 10,000 people";
/* No comment provided by engineer. */
"Abbonamento annuale, priorità 100000 persone " = "Annual subscription, priority 100,000 people ";
/* No comment provided by engineer. */
"Abbonamento mensile, priorità 10000 persone " = "Monthly subscription, priority 10,000 people ";
/* No comment provided by engineer. */
"Abbonamento mensile, priorità 100000 persone " = "Monthly subscription, priority 100,000 people ";
/* voce menu */
"Abilitato" = "Enabled";
/* titolo impostazioni notifiche */
"Alerta sismica" = "Seismic alert";
@@ -44,250 +19,63 @@
/* No comment provided by engineer. */
"Altro" = "Other";
/* pulsanti orrizontale */
"ALTRO" = "OTHER";
/* No comment provided by engineer. */
"Annulla" = "Cancel";
/* The name of the app to display in a navigation bar along with a placeholder for the SDK version number */
"App.NameAndVersion" = "App.NameAndVersion";
/* titolo impostazioni notifiche
voce menu */
"Area di interesse" = "Area of interest";
/* No comment provided by engineer. */
"Attenzione" = "Attention";
/* No comment provided by engineer. */
"Attenzione " = "Attention ";
/* Back */
"Back" = "Back";
/* pulsanti orrizontale */
"CHAT" = "CHAT";
/* No comment provided by engineer. */
"chiudi" = "close";
/* pulsante chiudi impostazioni */
"Chiudi" = "Close";
/* No comment provided by engineer. */
"CHIUDI" = "CLOSE";
/* titolo pulsante notifica rete smartphone */
"CONDIVIDI" = "SHARE APP";
/* allerta acquisto o restor pro */
"Conferma" = "Confirm";
/* No comment provided by engineer. */
"Conferma nazione" = "Confirm country";
/* No comment provided by engineer. */
"CONFIG" = "CONFIG";
/* No comment provided by engineer. */
"Copertura" = "Coverage";
/* No comment provided by engineer. */
"dalla tua posizione" = "from your location";
/* No comment provided by engineer. */
"Data" = "Date";
/* No comment provided by engineer. */
"Data(Ora tua):" = "Date(Your time):";
/* Prompt to enter text for autocomplete demo */
"Demo.Content.Autocomplete.EnterTextPrompt" = "Demo.Content.Autocomplete.EnterTextPrompt";
/* Format string for 'autocomplete failed with error' message */
"Demo.Content.Autocomplete.FailedErrorMessage" = "Demo.Content.Autocomplete.FailedErrorMessage";
/* Button title for 'show autocomplete widget' */
"Demo.Content.Autocomplete.ShowWidgetButton" = "Demo.Content.Autocomplete.ShowWidgetButton";
/* Button title for the 'BlueColors' styled autocomplete widget. */
"Demo.Content.Autocomplete.Styling.Colors.BlueColors" = "Demo.Content.Autocomplete.Styling.Colors.BlueColors";
/* Button title for the 'Hot Dog Stand' styled autocomplete widget. */
"Demo.Content.Autocomplete.Styling.Colors.HotDogStand" = "Demo.Content.Autocomplete.Styling.Colors.HotDogStand";
/* Button title for the 'WhiteOnBlack' styled autocomplete widget. */
"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack" = "Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack";
/* Button title for the 'Yellow and Brown' styled autocomplete widget. */
"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown" = "Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown";
/* String for 'autocomplete canceled message' */
"Demo.Content.Autocomplete.WasCanceledMessage" = "Demo.Content.Autocomplete.WasCanceledMessage";
/* Button title for the 'Modal' view of the place picker. */
"Demo.Content.PlacePicker.ViewController.Modal" = "Demo.Content.PlacePicker.ViewController.Modal";
/* Button title for the 'Navigation' view of the place picker. */
"Demo.Content.PlacePicker.ViewController.Navigation" = "Demo.Content.PlacePicker.ViewController.Navigation";
/* Button title for the 'Popover' view of the place picker. */
"Demo.Content.PlacePicker.ViewController.Popover" = "Demo.Content.PlacePicker.ViewController.Popover";
/* Title of the autocomplete demo section */
"Demo.Section.Title.Autocomplete" = "Demo.Section.Title.Autocomplete";
/* Title of the 'Programmatic' demo section */
"Demo.Section.Title.Programmatic" = "Demo.Section.Title.Programmatic";
/* Title of the full-screen autocomplete demo for display in a list or nav header */
"Demo.Title.Autocomplete.FullScreen" = "Demo.Title.Autocomplete.FullScreen";
/* Title of the pushed autocomplete demo for display in a list or nav header */
"Demo.Title.Autocomplete.Push" = "Demo.Title.Autocomplete.Push";
/* Title of the Styling autocomplete demo for display in a list or nav header */
"Demo.Title.Autocomplete.Styling" = "Demo.Title.Autocomplete.Styling";
/* Title of the UISearchController autocomplete demo for display in a list or nav header */
"Demo.Title.Autocomplete.UISearchController" = "Demo.Title.Autocomplete.UISearchController";
/* Title of the UISearchDisplayController autocomplete demo for display in a list or nav header */
"Demo.Title.Autocomplete.UISearchDisplayController" = "Demo.Title.Autocomplete.UISearchDisplayController";
/* Title of the UITextField autocomplete demo for display in a list or nav header */
"Demo.Title.Autocomplete.UITextField" = "Demo.Title.Autocomplete.UITextField";
/* Title of the photos demo for display in a list or nav header */
"Demo.Title.Photos" = "Demo.Title.Photos";
/* Title of the 'select place' button within the photos demo */
"Demo.Title.Photos.SelectPlace" = "Demo.Title.Photos.SelectPlace";
/* Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. */
"Demo.Title.PlacePicker.ViewController" = "Demo.Title.PlacePicker.ViewController";
/* pulsante abbonamenti */
"DETTAGLI" = "DETAILS";
/* voce menu */
"Dettagli importanti sulla rilevazione dei sismi" = "Important details on earthquake detection";
/* voce menu */
"Dettagli importanti sulla rilevazione di sismi" = "Important details on earthquake detection";
/* No comment provided by engineer. */
"Dispositivi attivi" = "smartphones monitoring in real time for earthquakes. To improve detection share the app with your family and friends, thanks!";
/* No comment provided by engineer. */
"Dispositivi totali" = "At this time, in your area there are";
/* item tabelle */
"Dispositivo affidabile" = "Reliable device";
/* voce menu */
"Distanza" = "Distance";
/* pulsanti orrizontale */
"E-MAIL/SMS" = "E-MAIL/SMS";
/* voce menu */
"Energia sisma" = "Earthquake energy";
/* No comment provided by engineer. */
"Errore sconosciuto" = "Unknown error";
/* messaggio errore richiesta apikey impianto */
"Errore! Impossibile accedere all'impianto" = "Errore! Impossibile accedere all'impianto";
/* No comment provided by engineer. */
"Esci" = "Exit";
/* No comment provided by engineer. */
"Età massima" = "Maximum age";
/* No comment provided by engineer. */
"Filtro" = "Filter";
/* No comment provided by engineer. */
"Gestisci le reti sismiche" = "Manage seismic networks";
/* No comment provided by engineer. */
"Il messaggio è già stato in viato, al momento non è possibile inviare una nuova segnalazione" = "The report has already been sent, at the moment it is not possible to send a new report";
/* voce menu */
"Imposta volume" = "Set volume";
/* voce menu */
"Intervallo allarme" = "Alarm interval";
/* voce menu */
"Intervallo notifiche" = "Notification interval";
/* voce elenco aree tsunami */
"Isole Hawaii" = "Hawaii Islands";
/* No comment provided by engineer. */
"Isole Hawaii" = "Hawaii Islands";
/* No comment provided by engineer. */
"La magnitudo sarà calcola e cominicata dalla rete sismica nazionale e comparirà nella sezione Reti Sismiche dell'app." = "The magnitude will be calculated and reported by the national seismic network and will appear in the Seismic Networks section of the app.";
/* No comment provided by engineer. */
"La tua posizione geografica è sconosciuta e non è possibile segnalare il sisma" = "Your location is unknown and the earthquake cannot be reported";
/* No comment provided by engineer. */
"La tua segnalazione è stata inviata correttamente" = "Your report has been sent correctly";
/* voce menu */
"Lista notifiche" = "Notification list";
/* item tabelle */
"Lista priorità - NUOVA!" = "Priority service";
/* voce menu */
"Magnitudo" = "Magnitude";
/* No comment provided by engineer. */
"MAPPA" = "MAP";
/* No comment provided by engineer. */
"Mappa" = "Map";
/* Maps SDK Demos */
"Maps SDK Demos" = "Maps SDK Demos";
/* voce elenco aree tsunami */
"Mar dei Caraibi" = "Carribean Sea";
/* No comment provided by engineer. */
"Messaggio" = "Message";
/* item tabelle */
"messaggio per utenti" = "message for users";
/* No comment provided by engineer. */
"METEO" = "WEATHER";
/* voce menu */
"Modifica impostazioni" = "Change settings";
/* No comment provided by engineer. */
"Mondo" = "Globe";
/* messaggio assenza connesione */
"Nessuna connessione" = "No Internet connection";
/* No comment provided by engineer. */
"Nessuna sottoscrizione attiva. Nella lista delle persone da allertare " = "No active subscription.";
/* No comment provided by engineer. */
"Non hai seleziato nessuna nazione" = "You have not selected any country";
/* voce menu */
"Notifica anche sismi per i quali non è possibile stimare l'intensità" = "Also notifies earthquakes for which it is not possible to estimate the intensity";
/* voce menu */
"Notifica sismi di qualsiasi magnitudo se la distanza è inferiore a 50 km" = "Notify earthquakes of any magnitude if the distance is less than 50 km";
@@ -306,41 +94,15 @@
voce menu */
"Notifiche sismi" = "Earthquake notifications";
/* titolo impostazioni notifiche
voce menu */
"Notifiche sismi rilevati in tempo reale" = "Notifications of earthquake detected in real-time";
/* titolo impostazioni notifiche
voce menu */
"Notifiche tsunami" = "Tsunami notifications";
/* voce elenco aree tsunami */
"Oceano Pacifico" = "Pacific Ocean";
/* No comment provided by engineer. */
"OK" = "OK";
/* No comment provided by engineer. */
"Onda sismica in" = "Seismic wave in";
/* No comment provided by engineer. */
"oppure" = "otherwise";
/* voce menu */
"Ora di fine" = "Ending time";
/* voce menu */
"Ora di inizio" = "Starting time";
/* No comment provided by engineer. */
"ora fa" = "hour ago";
/* voce menu */
"Ora fine" = "Ending time";
/* voce menu */
"Ora inizio" = "Starting time";
/* No comment provided by engineer. */
"pagerai al mese:" = "you will pay per month:";
@@ -350,9 +112,6 @@
/* No comment provided by engineer. */
"Profondità" = "Depth";
/* No comment provided by engineer. */
"Puoi entrare a fare parte delle liste di priorità prime" = "You can join the priority list of the first";
/* voce elenco raggio sismi */
"Qualsiasi distanza" = "Any distance";
@@ -368,12 +127,6 @@
/* voce menu */
"Raggio sismi lievi" = "Radius mild earthquakes";
/* No comment provided by engineer. */
"Repubblica Domenicana" = "Dominican Republic";
/* item tabelle */
"Rete smartphone" = "Smartphone Network";
/* titolo impostazioni notifiche
voce menu */
"Reti sismiche" = "Seismic networks";
@@ -384,102 +137,32 @@
/* voce menu */
"Ricevi le notifiche dei sismi segnalati manualmente dagli utenti" = "Receive notifications of earthquakes manually reported by users";
/* voce menu */
"Ricevi le notifiche in tempo reale dei sismi rilevati dalla rete smartphone" = "Receive real-time notifications of earthquakes detected by the smartphone network";
/* voce menu */
"Ricevi le notifiche per i messaggi rilasciati dal Pacific Tsunami Warning Center" = "Receive notifications for messages released by the Pacific Tsunami Warning Center";
/* voce menu */
"Ricevi le notifiche solo in un intervallo del giorno" = "Receive notifications only in a range of day";
/* titolo navigation bar */
"Rilevatore Terremoti" = "Earthquake Network";
/* Samples */
"Samples" = "Samples";
/* No comment provided by engineer. */
"Scarica" = "Download";
/* No comment provided by engineer. */
"Scarica " = "Download ";
/* No comment provided by engineer. */
"Se vuoi filtrare la lista dei sismi, seleziona la nazione in cui vivi" = "If you want to filter the list of earthquakes, select the country where you live";
/* No comment provided by engineer. */
"secondi" = "seconds";
/* No comment provided by engineer. */
"Segnalazione " = "Report ";
/* No comment provided by engineer. */
"Sei abbonato: priorità 10000 persone, rinnovo annuale " = "You are subscribed to the 10'000 priority list, annual renewal ";
/* No comment provided by engineer. */
"Sei abbonato: priorità 10000 persone, rinnovo mensile " = "You are subscribed to the 10'000 priority list, monthly renewal ";
/* No comment provided by engineer. */
"Sei abbonato: priorità 100000 persone, rinnovo annuale " = "You are subscribed to the 100'000 priority list, annual renewal ";
/* No comment provided by engineer. */
"Sei abbonato: priorità 100000 persone, rinnovo mensile " = "You are subscribed to the 100'000 priority list, monthly renewal ";
"Segnalazione" = "Report";
/* No comment provided by engineer. */
"Seleziona" = "Select";
/* No comment provided by engineer. */
"sending" = "sending";
/* voce menu */
"Sismi da notificare" = "Earthquakes to report";
/* item tabelle */
"Sismi rilevati da smartphone" = "Earthquakes detected by smartphones";
/* voce menu */
"Sismi senza intensità" = "Earthquakes without intensity";
/* messaggio errore richiesta dev_cmd */
"Sì è verificato un errore sulla centralina" = "Sì è verificato un errore sulla centralina";
/* voce menu */
"Solo sismi forti" = "Only strong earthquakes";
/* descrizione Top 10K */
"sottoscrizioni ancora disponibiliper essere allertato in meno di 1 secondo dal rilevamento del sistema" = "subscriptions still available to be alerted in less than 1 second from the earthquake";
/* descrizione Top 100K */
"sottoscrizioni ancora disponibiliper essere allertato in meno di 5 secondi dal rilevamento del sistema" = "subscriptions still available to be alerted in less than 5 seconds from the earthquake";
/* pulsanti orrizontale */
"SPONSOR" = "SPONSOR";
/* voce menu */
"Terremoti forti" = "Strong earthquakes";
/* voce menu */
"Terremoti vicini" = "Nearby earthquakes";
/* voce menu */
"Testa allarme" = "Test alarm";
"testo utenti1" = "Is this app useful for you? Vote and support the app with 5 stars at";
"testo utenti2" = "thanks! Real time detection of quakes works better if the app is installed on many devices. Share the app with family and friends to improve detection.";
/* titolo impostazioni notifiche
voce menu */
"Tipo messaggio" = "Message type";
/* voce menu */
"Tono di allarme" = "Alarm tone";
/* No comment provided by engineer. */
"TRENS" = "TREND";
/* pulsanti orrizontale */
"TSUNAMI" = "TSUNAMI";
/* No comment provided by engineer. */
"Ultim\'ora" = "Last hour";
"Ultim'ora" = "Last hour";
/* No comment provided by engineer. */
"Ultima settimana" = "Last week";
@@ -493,42 +176,13 @@
/* No comment provided by engineer. */
"Ultimo mese" = "Last month";
/* No comment provided by engineer. */
"Un anno" = "One year";
/* No comment provided by engineer. */
"un anno" = "one year";
/* No comment provided by engineer. */
"Un mese" = "One month";
/* voce menu */
"Un sisma è simulato. Dovresti ricevere l'allerta e l'allarme dovrebbe suonare. Se attive, ricordati di disabilitare l'invio della mail automatiche ai tuoi contatti per non allarmarli" = "Un sisma è simulato. Dovresti ricevere l'allerta e l'allarme dovrebbe suonare. Se attive, ricordati di disabilitare l'invio della mail automatiche ai tuoi contatti per non allarmarli";
/* No comment provided by engineer. */
"Un\'ora" = "One hour";
/* No comment provided by engineer. */
"Una settimana" = "One week";
/* messaggio errore inserimento credenziali */
"Username e Password sbagliati" = "Username e Password sbagliati";
/* titolo pulsante notifica rete smartphone */
"VEDI IN TWITTER" = "SEE ON TWITTER";
/* etichetta versione app */
"Versione" = "Version";
/* item tabelle */
"Versione PRO" = "PRO version";
/* titolo impostazioni notifiche */
"Vibrazioni e suono" = "Sound and vibration";
/* titolo pulsante notifica rete smartphone */
"VOTA L'APP" = "Vote the app";
// Nazioni
"Stati Uniti" = "United States";
"Italia" = "Italy";
"Spagna" = "Spain";
@@ -551,16 +205,12 @@
"India" = "India";
"Altro" = "Other";
/// notifiche
// notifiche
"Allerta sismica in tempo reale" = "Real time seismic alert";
"Segnalazione utente" = "User report";
"Segnalazione da rete sismica" = "Seismic network report";
/// notifiche body
// notifiche body
"Rilevato sisma debole a" = "Mild quake detected at %@";
"Rilevato sisma forte a" = "Strong quake detected at %@";
"Rilevato sisma a" = "Quake detected at %@";
@@ -573,8 +223,7 @@
"Area di interesse: Oceano Pacifico" = "Area of interest: Pacific Ocean";
"Sisma rilevato da" = "earthquake detected by";
/// Voci menu
// Voci menu
"Impostazioni" = "Settings";
"Informazioni" = "Information";
"F.A.Q." = "F.A.Q.";
@@ -595,14 +244,10 @@
"purchase_pro_restore" = "Restore";
"purchase_pro_restore_alert_title" = "Restore completed";
"purchase_pro_restore_alert_message" = "You have restored the product you purchased";
"inapp_available_10k" = "Top 10K: %lu subscriptions still available to be alerted in less than 1 second since the detection of the quake";
"inapp_available_100k" = "Top 100K: %lu subscriptions still available to be alerted in less than 1 second since the detection of the quake";
"• Il pagamento verrà addebitato sull'account iTunes alla conferma dell'acquisto\n\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\n• L'abbonamento verrà addebitato per il rinnovo entro 24 ore prima della fine del periodo corrente e identificato il costo del rinnovo\n\n• Le sottoscrizioni possono essere gestite dall'utente e il rinnovo automatico può essere disattivato accedendo alle Impostazioni account dell'utente dopo l'acquisto." = "";
// settings
"Magnitudo >= 0.0" = "Magnitude >= 0.0";
"Magnitudo >= 0.5" = "Magnitude >= 0.5";
@@ -626,7 +271,6 @@
"Non attivare allarmi o notifiche in questo lasso di tempo" = "Do not disturb with alert or notifications in this time frame";
// Filtri sismi
"Magnitudo minima" = "Minumum magnitude";
"Distanza massima" = "Maximum distance";
"Periodo temporale" = "Time frame";
@@ -660,6 +304,7 @@
"share_notified" = "Reported through the app Earthquake Network. Download the app from https://sismo.app/download/ to receive real time alerts of #earthquake @SismoDetector";
"manual_sure" = "Do you really want to notify an earthquake?";
"manual_yes" = "Yes";
"calendar_missing_permission" = "The calendar cannot be opened, make sure you have set the correct permissions.";
// Segnalazioni
"manual_sendmessage" = "Send a message that the other users can read about the earthquake that you reported";
@@ -673,6 +318,10 @@
"permission_location_no" = "You have chosen to prevent the app from reading the location of the device. You will NOT receive real-time notifications and alerts";
"permission_location_no_background" = "You have chosen to prevent the app from reading the location of your device when the app is in the background. Notifications and real time alerts may NOT be received";
// Notifica
"alert_wave" = "Seismic wave in";
"alert_seconds" = "seconds";
// Varie
"minutes_one" = "%lu minute ago";
"minutes_other" = "%lu minutes ago";
@@ -680,3 +329,17 @@
"hours_other" = "%lu hours ago";
"days_one" = "%lu day ago";
"days_other" = "%lu days ago";
// Simulatore
"main_simulator" = "Simulator";
"globe_simulation_button" = "Compute warning time";
"globe_simulation" = "If the earthquake epicentre is outside the red disk and the quake is immediately detected by the smartphones, you will receive the alert more than 5 seconds in advance. Select on map the possible epicentre in order to compute the warning time.";
"globe_simulation_inside" = "Select a location inside the green disk";
"globe_simulation_outside" = "Select a location outside the red disk";
"globe_simulation_message1" = "With this epicentre, you should receive the alert %.0f seconds in advance. However, %.0f people will be alerted before you. The warning time will be of %.0f seconds. By subscribing now to the TOP 10K priority service, only %.0f people will be alerted before you (in order of distance from the epicenter)";
"globe_simulation_message2" = "With this epicentre, you should receive the alert %.0f seconds in advance. However, %.0f people will be alerted before you. You will receive the alert %.0f seconds after the seismic waves. By subscribing now to the TOP 10K priority service, only %.0f people will be alerted before you (in order of distance from the epicenter)";
"globe_simulation_message3" = "With this epicentre, you should receive the alert %.0f seconds in advance. However, %.0f people will be alerted before you. By subscribing now to the TOP 10K priority service, only %.0f people will be alerted before you (in order of distance from the epicenter)";
"globe_simulation_message4" = "With this epicentre, thanks to the %@ priority service you should receive the alert %.0f seconds in advance. Only %.0f people will be alerted before you.";
"globe_simulation_message5" = "With this epicentre, thanks to the %@ priority service you should receive the alert %.0f seconds in advance. %.0f people will be alerted before you. To increase the warning time you can subscribe to the %@ priority service";
"globe_simulation_message6" = "With this epicentre, thanks to the %@ priority service you should receive the alert %.0f seconds in advance. You will be the first to be alerted!";
"globe_simulation_priority" = "Priority service";
@@ -4,30 +4,12 @@
/* No comment provided by engineer. */
" 100000 persone allertate." = " 100.000 personas alertadas.";
/* No comment provided by engineer. */
"(Ora tua)" = "(Tu hora)";
/* No comment provided by engineer. */
"Abbonamenti annuali" = "Suscripciones anuales";
/* No comment provided by engineer. */
"Abbonamenti mensili" = "Suscripciones mensuales";
/* No comment provided by engineer. */
"Abbonamento annuale, priorità 10000 persone " = "Suscripción anual, prioridad 10.000 personas ";
/* No comment provided by engineer. */
"Abbonamento annuale, priorità 100000 persone " = "Suscripción anual, prioridad 100.000 personas ";
/* No comment provided by engineer. */
"Abbonamento mensile, priorità 10000 persone " = "Suscripción mensual, prioridad 10.000 personas ";
/* No comment provided by engineer. */
"Abbonamento mensile, priorità 100000 persone " = "Suscripción mensual, prioridad 100.000 personas ";
/* voce menu */
"Abilitato" = "Activado";
/* titolo impostazioni notifiche */
"Alerta sismica" = "Alerta sismica";
@@ -37,252 +19,63 @@
/* No comment provided by engineer. */
"Altro" = "Otro";
/* pulsanti orrizontale */
"ALTRO" = "OTRO";
/* No comment provided by engineer. */
"Annulla" = "Cancelar";
/* The name of the app to display in a navigation bar along with a placeholder for the SDK version number */
"App.NameAndVersion" = "App.NameAndVersion";
/* titolo impostazioni notifiche
voce menu */
"Area di interesse" = "Área de interés";
/* No comment provided by engineer. */
"Attenzione" = "Atención";
/* No comment provided by engineer. */
"Attenzione " = "Atención ";
/* Back */
"Back" = "Espalda";
/* pulsanti orrizontale */
"CHAT" = "CHAT";
/* No comment provided by engineer. */
"chiudi" = "cerra";
/* pulsante chiudi impostazioni */
"Chiudi" = "Cerra";
/* No comment provided by engineer. */
"CHIUDI" = "CERRA";
/* titolo pulsante notifica rete smartphone */
"CONDIVIDI" = "COMPARTA APP";
/* allerta acquisto o restor pro */
"Conferma" = "Confirmar";
/* No comment provided by engineer. */
"Conferma nazione" = "Confirmar pais";
/* No comment provided by engineer. */
"CONFIG" = "CONFIG";
/* No comment provided by engineer. */
"Copertura" = "Cobertura";
/* No comment provided by engineer. */
"dalla tua posizione" = "desde tu ubicación";
/* No comment provided by engineer. */
"Data" = "Fecha";
/* No comment provided by engineer. */
"Data(Ora tua):" = "Fecha(Tu tiempo):";
/* Prompt to enter text for autocomplete demo */
"Demo.Content.Autocomplete.EnterTextPrompt" = "Demo.Content.Autocomplete.EnterTextPrompt";
/* Format string for 'autocomplete failed with error' message */
"Demo.Content.Autocomplete.FailedErrorMessage" = "Demo.Content.Autocomplete.FailedErrorMessage";
/* Button title for 'show autocomplete widget' */
"Demo.Content.Autocomplete.ShowWidgetButton" = "Demo.Content.Autocomplete.ShowWidgetButton";
/* Button title for the 'BlueColors' styled autocomplete widget. */
"Demo.Content.Autocomplete.Styling.Colors.BlueColors" = "Demo.Content.Autocomplete.Styling.Colors.BlueColors";
/* Button title for the 'Hot Dog Stand' styled autocomplete widget. */
"Demo.Content.Autocomplete.Styling.Colors.HotDogStand" = "Demo.Content.Autocomplete.Styling.Colors.HotDogStand";
/* Button title for the 'WhiteOnBlack' styled autocomplete widget. */
"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack" = "Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack";
/* Button title for the 'Yellow and Brown' styled autocomplete widget. */
"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown" = "Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown";
/* String for 'autocomplete canceled message' */
"Demo.Content.Autocomplete.WasCanceledMessage" = "Demo.Content.Autocomplete.WasCanceledMessage";
/* Button title for the 'Modal' view of the place picker. */
"Demo.Content.PlacePicker.ViewController.Modal" = "Demo.Content.PlacePicker.ViewController.Modal";
/* Button title for the 'Navigation' view of the place picker. */
"Demo.Content.PlacePicker.ViewController.Navigation" = "Demo.Content.PlacePicker.ViewController.Navigation";
/* Button title for the 'Popover' view of the place picker. */
"Demo.Content.PlacePicker.ViewController.Popover" = "Demo.Content.PlacePicker.ViewController.Popover";
/* Title of the autocomplete demo section */
"Demo.Section.Title.Autocomplete" = "Demo.Section.Title.Autocomplete";
/* Title of the 'Programmatic' demo section */
"Demo.Section.Title.Programmatic" = "Demo.Section.Title.Programmatic";
/* Title of the full-screen autocomplete demo for display in a list or nav header */
"Demo.Title.Autocomplete.FullScreen" = "Demo.Title.Autocomplete.FullScreen";
/* Title of the pushed autocomplete demo for display in a list or nav header */
"Demo.Title.Autocomplete.Push" = "Demo.Title.Autocomplete.Push";
/* Title of the Styling autocomplete demo for display in a list or nav header */
"Demo.Title.Autocomplete.Styling" = "Demo.Title.Autocomplete.Styling";
/* Title of the UISearchController autocomplete demo for display in a list or nav header */
"Demo.Title.Autocomplete.UISearchController" = "Demo.Title.Autocomplete.UISearchController";
/* Title of the UISearchDisplayController autocomplete demo for display in a list or nav header */
"Demo.Title.Autocomplete.UISearchDisplayController" = "Demo.Title.Autocomplete.UISearchDisplayController";
/* Title of the UITextField autocomplete demo for display in a list or nav header */
"Demo.Title.Autocomplete.UITextField" = "Demo.Title.Autocomplete.UITextField";
/* Title of the photos demo for display in a list or nav header */
"Demo.Title.Photos" = "Demo.Title.Photos";
/* Title of the 'select place' button within the photos demo */
"Demo.Title.Photos.SelectPlace" = "Demo.Title.Photos.SelectPlace";
/* Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. */
"Demo.Title.PlacePicker.ViewController" = "Demo.Title.PlacePicker.ViewController";
/* pulsante abbonamenti */
"DETTAGLI" = "DETALLES";
/* voce menu */
"Dettagli importanti sulla rilevazione dei sismi" = "Detalles importantes sobre la detección de sismos";
/* voce menu */
"Dettagli importanti sulla rilevazione di sismi" = "Detalles importantes sobre la detección de sismos";
/* No comment provided by engineer. */
"Dispositivi attivi" = "smartphones que están monitoreando los sismos en tiempo real. Para mejorar la detección comparta la app con tus amigos y familia, gracias!";
/* No comment provided by engineer. */
"Dispositivi totali" = "En este momento, en tu área hay";
/* item tabelle */
"Dispositivo affidabile" = "Dispositivo confiable";
/* voce menu */
"Distanza" = "Distancia";
/* pulsanti orrizontale */
"E-MAIL/SMS" = "E-MAIL/SMS";
/* voce menu */
"Energia sisma" = "Energía del sismos";
/* No comment provided by engineer. */
"Errore sconosciuto" = "Error desconocido";
/* messaggio errore richiesta apikey impianto */
"Errore! Impossibile accedere all'impianto" = "Errore! Impossibile accedere all'impianto";
/* No comment provided by engineer. */
"Esci" = "Salida";
/* No comment provided by engineer. */
"Età massima" = "Edad maxima";
/* No comment provided by engineer. */
"Filtro" = "Filtro";
/* No comment provided by engineer. */
"Gestisci le reti sismiche" = "Gestionar redes sísmicas";
"GESTISCI LE RETI SISMICHE" = "Gestionar redes sísmicas";
/* No comment provided by engineer. */
"Il messaggio è già stato in viato, al momento non è possibile inviare una nuova segnalazione" = "El informe ya ha sido enviado, por el momento no es posible enviar un nuevo informe.";
/* voce menu */
"Imposta volume" = "Ajustar el volumen";
/* voce menu */
"Intervallo allarme" = "Intervalo de alarma";
/* voce menu */
"Intervallo notifiche" = "Intervalo de notificación";
/* voce elenco aree tsunami */
"Isole Hawaii" = "Islas hawai";
/* No comment provided by engineer. */
"Isole Hawaii" = "Islas hawai";
/* No comment provided by engineer. */
"La magnitudo sarà calcola e cominicata dalla rete sismica nazionale e comparirà nella sezione Reti Sismiche dell'app." = "La magnitud será calculada e informada por la red sísmica nacional y aparecerá en la sección redes sísmicas de la aplicación.";
/* No comment provided by engineer. */
"La tua posizione geografica è sconosciuta e non è possibile segnalare il sisma" = "Tu ubicación es desconocida y el sismos no puede ser reportado";
/* No comment provided by engineer. */
"La tua segnalazione è stata inviata correttamente" = "Tu informe ha sido enviado correctamente";
/* voce menu */
"Lista notifiche" = "Lista de notificaciones";
/* item tabelle */
"Lista priorità - NUOVA!" = "Servicio prioritario";
/* voce menu */
"Magnitudo" = "Magnitud";
/* No comment provided by engineer. */
"MAPPA" = "MAPA";
/* No comment provided by engineer. */
"Mappa" = "Mapa";
/* Maps SDK Demos */
"Maps SDK Demos" = "Maps SDK Demos";
/* voce elenco aree tsunami */
"Mar dei Caraibi" = "Mar Caribe";
/* No comment provided by engineer. */
"Messaggio" = "Mensaje";
/* item tabelle */
"messaggio per utenti" = "mensaje para los usuarios";
/* No comment provided by engineer. */
"METEO" = "TIEMPO";
/* voce menu */
"Modifica impostazioni" = "Cambiar ajustes";
/* No comment provided by engineer. */
"Mondo" = "Globo";
/* messaggio assenza connesione */
"Nessuna connessione" = "No hay conexión a internet";
/* No comment provided by engineer. */
"Nessuna sottoscrizione attiva. Nella lista delle persone da allertare " = "No hay suscripción activa.";
/* No comment provided by engineer. */
"Non hai seleziato nessuna nazione" = "No has seleccionado ningún país";
/* voce menu */
"Notifica anche sismi per i quali non è possibile stimare l'intensità" = "También notifica sismos para los que no es posible estimar la intensidad.";
/* voce menu */
"Notifica sismi di qualsiasi magnitudo se la distanza è inferiore a 50 km" = "Notificar sismos de cualquier magnitud si la distancia es inferior a 50 km";
@@ -301,41 +94,15 @@
voce menu */
"Notifiche sismi" = "Notificaciones de sismos";
/* titolo impostazioni notifiche
voce menu */
"Notifiche sismi rilevati in tempo reale" = "Notificaciones de sismos detectados en tiempo real.";
/* titolo impostazioni notifiche
voce menu */
"Notifiche tsunami" = "Notificaciones de tsunami";
/* voce elenco aree tsunami */
"Oceano Pacifico" = "Oceano Pacifico";
/* No comment provided by engineer. */
"OK" = "OK";
/* No comment provided by engineer. */
"Onda sismica in" = "Onda sísmica en";
/* No comment provided by engineer. */
"oppure" = "de otra manera";
/* voce menu */
"Ora di fine" = "Hora de inicio";
/* voce menu */
"Ora di inizio" = "Hora de fine";
/* No comment provided by engineer. */
"ora fa" = "hora";
/* voce menu */
"Ora fine" = "Hora de fine";
/* voce menu */
"Ora inizio" = "Hora de inicio";
/* No comment provided by engineer. */
"pagerai al mese:" = "pagaras por mes:";
@@ -345,9 +112,6 @@
/* No comment provided by engineer. */
"Profondità" = "Profundidad";
/* No comment provided by engineer. */
"Puoi entrare a fare parte delle liste di priorità prime" = "Puedes unirte a la lista de priorida de las primeras";
/* voce elenco raggio sismi */
"Qualsiasi distanza" = "Cualquier distancia";
@@ -363,12 +127,6 @@
/* voce menu */
"Raggio sismi lievi" = "Radio sismos leves";
/* No comment provided by engineer. */
"Repubblica Domenicana" = "Republica Dominicana";
/* item tabelle */
"Rete smartphone" = "Red smartphone";
/* titolo impostazioni notifiche
voce menu */
"Reti sismiche" = "Redes sismicas";
@@ -379,102 +137,32 @@
/* voce menu */
"Ricevi le notifiche dei sismi segnalati manualmente dagli utenti" = "Recibe notificaciones de sismos reportados manualmente por los usuarios.";
/* voce menu */
"Ricevi le notifiche in tempo reale dei sismi rilevati dalla rete smartphone" = "Recibe notificaciones en tiempo real de los sismos detectados por la red de teléfonos inteligentes.";
/* voce menu */
"Ricevi le notifiche per i messaggi rilasciati dal Pacific Tsunami Warning Center" = "Recibe notificaciones de mensajes publicados por el Pacific Tsunami Warning Center";
/* voce menu */
"Ricevi le notifiche solo in un intervallo del giorno" = "Recibe notificaciones solo";
/* titolo navigation bar */
"Rilevatore Terremoti" = "Sismo Detector";
/* Samples */
"Samples" = "Samples";
/* No comment provided by engineer. */
"Scarica" = "Download";
/* No comment provided by engineer. */
"Scarica " = "Download ";
/* No comment provided by engineer. */
"Se vuoi filtrare la lista dei sismi, seleziona la nazione in cui vivi" = "Si desea filtrar la lista de sismos, selecciona el país donde vive.";
/* No comment provided by engineer. */
"secondi" = "segundos";
/* No comment provided by engineer. */
"Segnalazione " = "Informe ";
/* No comment provided by engineer. */
"Sei abbonato: priorità 10000 persone, rinnovo annuale " = "Estás suscrito a la lista de prioridades de 10'000, renovación anual ";
/* No comment provided by engineer. */
"Sei abbonato: priorità 10000 persone, rinnovo mensile " = "Estás suscrito a la lista de prioridades de 10'000, renovación mensual ";
/* No comment provided by engineer. */
"Sei abbonato: priorità 100000 persone, rinnovo annuale " = "Estás suscrito a la lista de prioridades de 100'000, renovación anual ";
/* No comment provided by engineer. */
"Sei abbonato: priorità 100000 persone, rinnovo mensile " = "Estás suscrito a la lista de prioridades de 100'000, renovación mensual ";
"Segnalazione" = "Informe";
/* No comment provided by engineer. */
"Seleziona" = "Seleccionar";
/* No comment provided by engineer. */
"sending" = "enviando";
/* voce menu */
"Sismi da notificare" = "Sismos para informar";
/* item tabelle */
"Sismi rilevati da smartphone" = "Sismos detectados por smartphones";
/* voce menu */
"Sismi senza intensità" = "Sismos sin intensidad";
/* messaggio errore richiesta dev_cmd */
"Sì è verificato un errore sulla centralina" = "Sì è verificato un errore sulla centralina";
/* voce menu */
"Solo sismi forti" = "Solo sismos fuertes";
/* descrizione Top 10K */
"sottoscrizioni ancora disponibiliper essere allertato in meno di 1 secondo dal rilevamento del sistema" = "suscripciones aún disponibles para ser alertados en menos de 1 segundo desde el sismo";
/* descrizione Top 100K */
"sottoscrizioni ancora disponibiliper essere allertato in meno di 5 secondi dal rilevamento del sistema" = "suscripciones aún disponibles para ser alertados en menos de 5 segundos desde el sismo";
/* pulsanti orrizontale */
"SPONSOR" = "SPONSOR";
/* voce menu */
"Terremoti forti" = "Sismos fuertes";
/* voce menu */
"Terremoti vicini" = "Sismos cercanos";
/* voce menu */
"Testa allarme" = "Prueba alarma";
"testo utenti1" = "Esta app es útil para ti? Vota la app con 5 estrellas en";
"testo utenti2" = "gracias! Más personas tiene instalada la app, mejor funcionarán las alertas. Comparta la app para mejorar la detección en tiempo real.";
/* titolo impostazioni notifiche
voce menu */
"Tipo messaggio" = "Tipo de mensaje";
/* voce menu */
"Tono di allarme" = "Tono de alarma";
/* No comment provided by engineer. */
"TRENS" = "TENDENCIA";
/* pulsanti orrizontale */
"TSUNAMI" = "TSUNAMI";
/* No comment provided by engineer. */
"Ultim\'ora" = "Ultima hora";
"Ultim'ora" = "Ultima hora";
/* No comment provided by engineer. */
"Ultima settimana" = "Ultima semana";
@@ -488,45 +176,13 @@
/* No comment provided by engineer. */
"Ultimo mese" = "Ultimo mes";
/* No comment provided by engineer. */
"Un anno" = "Un año";
/* No comment provided by engineer. */
"un anno" = "un año";
/* No comment provided by engineer. */
"Un mese" = "Un mes";
/* voce menu */
"Un sisma è simulato. Dovresti ricevere l'allerta e l'allarme dovrebbe suonare. Se attive, ricordati di disabilitare l'invio della mail automatiche ai tuoi contatti per non allarmarli" = "Un sisma è simulato. Dovresti ricevere l'allerta e l'allarme dovrebbe suonare. Se attive, ricordati di disabilitare l'invio della mail automatiche ai tuoi contatti per non allarmarli";
/* No comment provided by engineer. */
"Un\'ora" = "Una hora";
/* No comment provided by engineer. */
"Una settimana" = "Una semana";
/* messaggio errore inserimento credenziali */
"Username e Password sbagliati" = "Username e Password sbagliati";
/* titolo pulsante notifica rete smartphone */
"VEDI IN TWITTER" = "VER EN TWITTER";
/* No comment provided by engineer. */
"Velocità vento: " = "Velocidad viento: ";
/* etichetta versione app */
"Versione" = "Versión";
/* item tabelle */
"Versione PRO" = "Versión PRO";
/* titolo impostazioni notifiche */
"Vibrazioni e suono" = "Sonido y vibracion";
/* titolo pulsante notifica rete smartphone */
"VOTA L'APP" = "Vota la app";
// Nazioni
"Stati Uniti" = "Estados Unidos";
"Italia" = "Italia";
"Spagna" = "España";
@@ -549,16 +205,12 @@
"India" = "India";
"Altro" = "Otro";
/// notifiche
// notifiche
"Allerta sismica in tempo reale" = "Alerta sísmica en tiempo real";
"Segnalazione utente" = "Informe de usuario";
"Segnalazione da rete sismica" = "Informe de red sísmica";
"Allerta tsunami" = "Alerta de tsunami";
/// notifiche body
// notifiche body
"Rilevato sisma debole a" = "Sismo leve detectado en %@";
"Rilevato sisma forte a" = "Sismo fuerte detectado en %@";
"Rilevato sisma a" = "Sismo detectado en %@";
@@ -571,8 +223,7 @@
"Area di interesse: Oceano Pacifico" = "Área de interés: Océano Pacífico";
"Sisma rilevato da" = "terremoto detectado por";
/// Voci menu
// Voci menu
"Impostazioni" = "Ajustes";
"Informazioni" = "Información";
"F.A.Q." = "F.A.Q.";
@@ -593,7 +244,6 @@
"purchase_pro_restore" = "Reiniciar";
"purchase_pro_restore_alert_title" = "Restauración completada";
"purchase_pro_restore_alert_message" = "Has restaurado el producto que compraste";
"inapp_available_10k" = "Top 10K: %d suscripciones aún disponibles para recibir la alerta en menos de 1 segundo a partir de la detección del sismo";
"inapp_available_100k" = "Top 100K: %d suscripciones aún disponibles para recibir la alerta en menos de 1 segundo a partir de la detección del sismo";
@@ -616,13 +266,11 @@
"Magnitudo >= 7.0" = "Magnitud >= 7.0";
"Magnitudo >= 7.5" = "Magnitud >= 7.5";
"Suona un allarme quando un sisma è rilevato dalla rete smartphone" = "Activa una alarma cuando la red de teléfonos inteligentes detecta un sismo";
"Attiva l'allerta anche su i sismi per i quali non è possibile stimare l'intensità" = "También activa la alerta de sismos para los cuales no es posible estimar la intensidad.";
"Non attivare allarmi o notifiche in questo lasso di tempo" = "No molestar con alertas o notificaciones en este período de tiempo";
// Filtri sismi
"Magnitudo minima" = "Magnitud mínima";
"Distanza massima" = "Distancia maxima";
"Periodo temporale" = "Periodo de tiempo";
@@ -656,6 +304,7 @@
"share_notified" = "Reportado a través de la app Sismo Detector. Descarga la app desde https://sismo.app/download/ para recibir alertas de #sismo en tiempo real @SismoDetector";
"manual_sure" = "¿Estas seguro de querer reportar un sismo?";
"manual_yes" = "Sí";
"calendar_missing_permission" = "El calendario no se puede abrir, asegúrese de haber configurado los permisos correctos.";
// Segnalazioni
"manual_sendmessage" = "Enviar un mensaje que los demás usuarios puedan leer sobre el sismo que has notificado";
@@ -669,6 +318,10 @@
"permission_location_no" = "Ha elegido evitar que la aplicación lea la ubicación de tu dispositivo. NO recibirá notificaciones y alertas en tiempo real";
"permission_location_no_background" = "Ha elegido evitar que la aplicación lea la ubicación de tu dispositivo cuando la aplicación está en segundo plano. Por lo tanto, NO se garantiza la recepción de notificaciones y alertas en tiempo real";
// Notifica
"alert_wave" = "Onda sísmica en";
"alert_seconds" = "segundos";
// Varie
"minutes_one" = "%lu minuto";
"minutes_other" = "%lu minutos";
@@ -676,3 +329,17 @@
"hours_other" = "%lu horas";
"days_one" = "%lu día";
"days_other" = "%lu días";
// Simulatore
"main_simulator" = "Simulador";
"globe_simulation_button" = "Calcular el tiempo de alerta";
"globe_simulation" = "Si el epicentro del sismo está fuera del disco rojo y los smartphones lo detectan de inmediato, recibirá la alerta con más de 5 segundos de anticipación. Seleccionas en el mapa el posible epicentro para calcular el tiempo de alerta.";
"globe_simulation_inside" = "Seleccionas una ubicación dentro del disco verde";
"globe_simulation_outside" = "Seleccionas una ubicación fuera del disco rojo";
"globe_simulation_message1" = "Con este epicentro, deberías recibir la alerta %.0f segundos antes. Sin embargo, %.0f personas serán alertadas antes que tú. El tiempo de aviso será de %.0f segundos. Al suscribirse hoy al servicio de prioridad TOP 10K, solo %.0f personas recibirán la alerta antes que usted (en orden de distancia del epicentro)";
"globe_simulation_message2" = "Con este epicentro, deberías recibir la alerta %.0f segundos antes. Sin embargo, %.0f personas serán alertadas antes que tú. Recibirá la alerta %.0f segundos después de las ondas sísmicas. Al suscribirse hoy al servicio de prioridad TOP 10K, solo %.0f personas recibirán la alerta antes que usted (en orden de distancia del epicentro)";
"globe_simulation_message3" = "Con este epicentro, deberías recibir la alerta %.0f segundos antes. Sin embargo, %.0f personas serán alertadas antes que tú. Al suscribirse hoy al servicio de prioridad TOP 10K, solo %.0f personas recibirán la alerta antes que usted (en orden de distancia del epicentro)";
"globe_simulation_message4" = "Con este epicentro, gracias al servicio de prioridad %@, deberías recibir la alerta %.0f segundos antes. Solo %.0f personas serán alertadas antes que tú";
"globe_simulation_message5" = "Con este epicentro, gracias al servicio de prioridad %@, deberías recibir la alerta %.0f segundos antes. %.0f personas serán alertadas antes que tú. Para aumentar el tiempo de advertencia, puede suscribirse al servicio de prioridad %@";
"globe_simulation_message6" = "Con este epicentro, gracias al servicio de prioridad %@, deberías recibir la alerta %.0f segundos antes. ¡Serás la primera persona en ser alertada!";
"globe_simulation_priority" = "Servicio prioritario";
@@ -1,11 +1,8 @@
/* No comment provided by engineer. */
" 10000 persone allertate." = " 10\'000 persone allertate.";
" 10000 persone allertate." = " 10'000 persone allertate.";
/* No comment provided by engineer. */
" 100000 persone allertate." = " 100\'000 persone allertate.";
/* No comment provided by engineer. */
"(Ora tua)" = "(Ora tua)";
" 100000 persone allertate." = " 100'000 persone allertate.";
/* No comment provided by engineer. */
"Abbonamenti annuali" = "Abbonamenti annuali";
@@ -13,21 +10,6 @@
/* No comment provided by engineer. */
"Abbonamenti mensili" = "Abbonamenti mensili";
/* No comment provided by engineer. */
"Abbonamento annuale, priorità 10000 persone " = "Abbonamento annuale, priorità 10\'000 persone ";
/* No comment provided by engineer. */
"Abbonamento annuale, priorità 100000 persone " = "Abbonamento annuale, priorità 100\'000 persone ";
/* No comment provided by engineer. */
"Abbonamento mensile, priorità 10000 persone " = "Abbonamento mensile, priorità 10\'000 persone ";
/* No comment provided by engineer. */
"Abbonamento mensile, priorità 100000 persone " = "Abbonamento mensile, priorità 100\'000 persone ";
/* voce menu */
"Abilitato" = "Abilitato";
/* titolo impostazioni notifiche */
"Alerta sismica" = "Alerta sismica";
@@ -37,250 +19,63 @@
/* No comment provided by engineer. */
"Altro" = "Altro";
/* pulsanti orrizontale */
"ALTRO" = "ALTRO";
/* No comment provided by engineer. */
"Annulla" = "Annulla";
/* The name of the app to display in a navigation bar along with a placeholder for the SDK version number */
"App.NameAndVersion" = "App.NameAndVersion";
/* titolo impostazioni notifiche
voce menu */
"Area di interesse" = "Area di interesse";
/* No comment provided by engineer. */
"Attenzione" = "Attenzione";
/* No comment provided by engineer. */
"Attenzione " = "Attenzione ";
/* Back */
"Back" = "Back";
/* pulsanti orrizontale */
"CHAT" = "CHAT";
/* No comment provided by engineer. */
"chiudi" = "chiudi";
/* pulsante chiudi impostazioni */
"Chiudi" = "Chiudi";
/* No comment provided by engineer. */
"CHIUDI" = "CHIUDI";
/* titolo pulsante notifica rete smartphone */
"CONDIVIDI" = "CONDIVIDI APP";
/* allerta acquisto o restor pro */
"Conferma" = "Conferma";
/* No comment provided by engineer. */
"Conferma nazione" = "Conferma nazione";
/* No comment provided by engineer. */
"CONFIG" = "CONFIG";
/* No comment provided by engineer. */
"Copertura" = "Copertura";
/* No comment provided by engineer. */
"dalla tua posizione" = "dalla tua posizione";
/* No comment provided by engineer. */
"Data" = "Data";
/* No comment provided by engineer. */
"Data(Ora tua):" = "Data(Ora tua):";
/* Prompt to enter text for autocomplete demo */
"Demo.Content.Autocomplete.EnterTextPrompt" = "Demo.Content.Autocomplete.EnterTextPrompt";
/* Format string for 'autocomplete failed with error' message */
"Demo.Content.Autocomplete.FailedErrorMessage" = "Demo.Content.Autocomplete.FailedErrorMessage";
/* Button title for 'show autocomplete widget' */
"Demo.Content.Autocomplete.ShowWidgetButton" = "Demo.Content.Autocomplete.ShowWidgetButton";
/* Button title for the 'BlueColors' styled autocomplete widget. */
"Demo.Content.Autocomplete.Styling.Colors.BlueColors" = "Demo.Content.Autocomplete.Styling.Colors.BlueColors";
/* Button title for the 'Hot Dog Stand' styled autocomplete widget. */
"Demo.Content.Autocomplete.Styling.Colors.HotDogStand" = "Demo.Content.Autocomplete.Styling.Colors.HotDogStand";
/* Button title for the 'WhiteOnBlack' styled autocomplete widget. */
"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack" = "Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack";
/* Button title for the 'Yellow and Brown' styled autocomplete widget. */
"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown" = "Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown";
/* String for 'autocomplete canceled message' */
"Demo.Content.Autocomplete.WasCanceledMessage" = "Demo.Content.Autocomplete.WasCanceledMessage";
/* Button title for the 'Modal' view of the place picker. */
"Demo.Content.PlacePicker.ViewController.Modal" = "Demo.Content.PlacePicker.ViewController.Modal";
/* Button title for the 'Navigation' view of the place picker. */
"Demo.Content.PlacePicker.ViewController.Navigation" = "Demo.Content.PlacePicker.ViewController.Navigation";
/* Button title for the 'Popover' view of the place picker. */
"Demo.Content.PlacePicker.ViewController.Popover" = "Demo.Content.PlacePicker.ViewController.Popover";
/* Title of the autocomplete demo section */
"Demo.Section.Title.Autocomplete" = "Demo.Section.Title.Autocomplete";
/* Title of the 'Programmatic' demo section */
"Demo.Section.Title.Programmatic" = "Demo.Section.Title.Programmatic";
/* Title of the full-screen autocomplete demo for display in a list or nav header */
"Demo.Title.Autocomplete.FullScreen" = "Demo.Title.Autocomplete.FullScreen";
/* Title of the pushed autocomplete demo for display in a list or nav header */
"Demo.Title.Autocomplete.Push" = "Demo.Title.Autocomplete.Push";
/* Title of the Styling autocomplete demo for display in a list or nav header */
"Demo.Title.Autocomplete.Styling" = "Demo.Title.Autocomplete.Styling";
/* Title of the UISearchController autocomplete demo for display in a list or nav header */
"Demo.Title.Autocomplete.UISearchController" = "Demo.Title.Autocomplete.UISearchController";
/* Title of the UISearchDisplayController autocomplete demo for display in a list or nav header */
"Demo.Title.Autocomplete.UISearchDisplayController" = "Demo.Title.Autocomplete.UISearchDisplayController";
/* Title of the UITextField autocomplete demo for display in a list or nav header */
"Demo.Title.Autocomplete.UITextField" = "Demo.Title.Autocomplete.UITextField";
/* Title of the photos demo for display in a list or nav header */
"Demo.Title.Photos" = "Demo.Title.Photos";
/* Title of the 'select place' button within the photos demo */
"Demo.Title.Photos.SelectPlace" = "Demo.Title.Photos.SelectPlace";
/* Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. */
"Demo.Title.PlacePicker.ViewController" = "Demo.Title.PlacePicker.ViewController";
/* pulsante abbonamenti */
"DETTAGLI" = "DETTAGLI";
/* voce menu */
"Dettagli importanti sulla rilevazione dei sismi" = "Dettagli importanti sulla rilevazione dei sismi";
/* voce menu */
"Dettagli importanti sulla rilevazione di sismi" = "Dettagli importanti sulla rilevazione dei sismi";
/* No comment provided by engineer. */
"Dispositivi attivi" = "smartphone che stanno monitorando in tempo reale eventuali sismi. Condividi la app per migliorare il rilevamento.";
/* No comment provided by engineer. */
"Dispositivi totali" = "In questo momento, nella tua zona ci sono";
/* item tabelle */
"Dispositivo affidabile" = "Dispositivo affidabile";
/* voce menu */
"Distanza" = "Distanza";
/* pulsanti orrizontale */
"E-MAIL/SMS" = "E-MAIL/SMS";
/* voce menu */
"Energia sisma" = "Energia sisma";
/* No comment provided by engineer. */
"Errore sconosciuto" = "Errore sconosciuto";
/* messaggio errore richiesta apikey impianto */
"Errore! Impossibile accedere all'impianto" = "Errore! Impossibile accedere all'impianto";
/* No comment provided by engineer. */
"Esci" = "Esci";
/* No comment provided by engineer. */
"Età massima" = "Età massima";
/* No comment provided by engineer. */
"Filtro" = "Filtro";
/* No comment provided by engineer. */
"Gestisci le reti sismiche" = "Gestisci le reti sismiche";
/* No comment provided by engineer. */
"Il messaggio è già stato in viato, al momento non è possibile inviare una nuova segnalazione" = "La segnalazione è già stata inviata, al momento non è possibile inviare una nuova segnalazione";
/* voce menu */
"Imposta volume" = "Imposta volume";
/* voce menu */
"Intervallo allarme" = "Intervallo allarme";
/* voce menu */
"Intervallo notifiche" = "Intervallo notifiche";
/* voce elenco aree tsunami */
"Isole Hawaii" = "Isole Hawaii";
/* No comment provided by engineer. */
"Isole Hawaii" = "Isole Hawaii";
/* No comment provided by engineer. */
"La magnitudo sarà calcola e cominicata dalla rete sismica nazionale e comparirà nella sezione Reti Sismiche dell'app." = "La magnitudo sarà calcola e cominicata dalla rete sismica nazionale e comparirà nella sezione Reti Sismiche dell\'app.";
/* No comment provided by engineer. */
"La tua posizione geografica è sconosciuta e non è possibile segnalare il sisma" = "La tua posizione geografica è sconosciuta e non è possibile segnalare il sisma";
/* No comment provided by engineer. */
"La tua segnalazione è stata inviata correttamente" = "La tua segnalazione è stata inviata correttamente";
/* voce menu */
"Lista notifiche" = "Lista notifiche";
/* item tabelle */
"Lista priorità - NUOVA!" = "Servizio priorità";
/* voce menu */
"Magnitudo" = "Magnitudo";
/* No comment provided by engineer. */
"MAPPA" = "MAPPA";
/* No comment provided by engineer. */
"Mappa" = "Mappa";
/* Maps SDK Demos */
"Maps SDK Demos" = "Maps SDK Demos";
/* voce elenco aree tsunami */
"Mar dei Caraibi" = "Mar dei Caraibi";
/* No comment provided by engineer. */
"Messaggio" = "Messaggio";
/* item tabelle */
"messaggio per utenti" = "messaggio per utenti";
/* No comment provided by engineer. */
"METEO" = "METEO";
/* voce menu */
"Modifica impostazioni" = "Modifica impostazioni";
/* No comment provided by engineer. */
"Mondo" = "Mondo";
/* messaggio assenza connesione */
"Nessuna connessione" = "Nessuna connessione";
/* No comment provided by engineer. */
"Nessuna sottoscrizione attiva. Nella lista delle persone da allertare " = "Nessuna sottoscrizione attiva.";
/* No comment provided by engineer. */
"Non hai seleziato nessuna nazione" = "Non hai seleziato nessuna nazione";
/* voce menu */
"Notifica anche sismi per i quali non è possibile stimare l'intensità" = "Notifica anche sismi per i quali non è possibile stimare l\'intensità";
/* voce menu */
"Notifica sismi di qualsiasi magnitudo se la distanza è inferiore a 50 km" = "Notifica sismi di qualsiasi magnitudo se la distanza è inferiore a 50 km";
@@ -299,53 +94,24 @@
voce menu */
"Notifiche sismi" = "Notifiche sismi";
/* titolo impostazioni notifiche
voce menu */
"Notifiche sismi rilevati in tempo reale" = "Notifiche sismi rilevati in tempo reale";
/* titolo impostazioni notifiche
voce menu */
"Notifiche tsunami" = "Notifiche tsunami";
/* voce elenco aree tsunami */
"Oceano Pacifico" = "Oceano Pacifico";
/* No comment provided by engineer. */
"OK" = "OK";
/* No comment provided by engineer. */
"Onda sismica in" = "Onda sismica in";
/* No comment provided by engineer. */
"oppure" = "oppure";
/* voce menu */
"Ora di fine" = "Ora di fine";
/* voce menu */
"Ora di inizio" = "Ora di inizio";
/* No comment provided by engineer. */
"ora fa" = "ora fa";
/* voce menu */
"Ora fine" = "Ora fine";
/* voce menu */
"Ora inizio" = "Ora inizio";
/* No comment provided by engineer. */
"pagerai al mese:" = "pagerai al mese:";
/* No comment provided by engineer. */
"pagerai all'anno:" = "pagerai all\'anno:";
"pagerai all'anno:" = "pagerai all'anno:";
/* No comment provided by engineer. */
"Profondità" = "Profondità";
/* No comment provided by engineer. */
"Puoi entrare a fare parte delle liste di priorità prime" = "Puoi entrare a fare parte della lista di priorità delle prime";
/* voce elenco raggio sismi */
"Qualsiasi distanza" = "Qualsiasi distanza";
@@ -361,12 +127,6 @@
/* voce menu */
"Raggio sismi lievi" = "Raggio sismi lievi";
/* No comment provided by engineer. */
"Repubblica Domenicana" = "Repubblica Domenicana";
/* item tabelle */
"Rete smartphone" = "Rete smartphone";
/* titolo impostazioni notifiche
voce menu */
"Reti sismiche" = "Reti sismiche";
@@ -377,103 +137,32 @@
/* voce menu */
"Ricevi le notifiche dei sismi segnalati manualmente dagli utenti" = "Ricevi le notifiche dei sismi segnalati manualmente dagli utenti";
/* voce menu */
"Ricevi le notifiche in tempo reale dei sismi rilevati dalla rete smartphone" = "Ricevi le notifiche in tempo reale dei sismi rilevati dalla rete smartphone";
/* voce menu */
"Ricevi le notifiche per i messaggi rilasciati dal Pacific Tsunami Warning Center" = "Ricevi le notifiche per i messaggi rilasciati dal Pacific Tsunami Warning Center";
/* voce menu */
"Ricevi le notifiche solo in un intervallo del giorno" = "Ricevi le notifiche solo in un intervallo del giorno";
/* titolo navigation bar */
"Rilevatore Terremoti" = "Rilevatore Terremoto";
/* Samples */
"Samples" = "Samples";
/* No comment provided by engineer. */
"Scarica" = "Scarica";
/* No comment provided by engineer. */
"Scarica " = "Scarica ";
/* No comment provided by engineer. */
"Se vuoi filtrare la lista dei sismi, seleziona la nazione in cui vivi" = "Se vuoi filtrare la lista dei sismi, seleziona la nazione in cui vivi";
/* No comment provided by engineer. */
"secondi" = "secondi";
/* No comment provided by engineer. */
"Segnalazione " = "Segnalazione ";
/* No comment provided by engineer. */
"Sei abbonato: priorità 10000 persone, rinnovo annuale " = "Sei abbonato: priorità 10000 persone, rinnovo annuale ";
/* No comment provided by engineer. */
"Sei abbonato: priorità 10000 persone, rinnovo mensile " = "Sei abbonato: priorità 10000 persone, rinnovo mensile ";
/* No comment provided by engineer. */
"Sei abbonato: priorità 100000 persone, rinnovo annuale " = "Sei abbonato: priorità 100000 persone, rinnovo annuale ";
/* No comment provided by engineer. */
"Sei abbonato: priorità 100000 persone, rinnovo mensile " = "Sei abbonato: priorità 100000 persone, rinnovo mensile ";
"Segnalazione" = "Segnalazione";
/* No comment provided by engineer. */
"Seleziona" = "Seleziona";
/* No comment provided by engineer. */
"sending" = "sending";
/* voce menu */
"Sismi da notificare" = "Sismi da notificare";
/* item tabelle */
"Sismi rilevati da smartphone" = "Sismi rilevati da smartphone";
/* voce menu */
"Sismi senza intensità" = "Sismi senza intensità";
/* messaggio errore richiesta dev_cmd */
"Sì è verificato un errore sulla centralina" = "Sì è verificato un errore sulla centralina";
/* voce menu */
"Solo sismi forti" = "Solo sismi forti";
/* descrizione Top 10K */
"sottoscrizioni ancora disponibiliper essere allertato in meno di 1 secondo dal rilevamento del sistema" = "sottoscrizioni ancora disponibiliper essere allertato in meno di 1 secondo dal rilevamento del sistema";
/* descrizione Top 100K */
"sottoscrizioni ancora disponibiliper essere allertato in meno di 5 secondi dal rilevamento del sistema" = "sottoscrizioni ancora disponibiliper essere allertato in meno di 5 secondi dal rilevamento del sistema";
/* pulsanti orrizontale */
"SPONSOR" = "SPONSOR";
/* voce menu */
"Terremoti forti" = "Sismi forti";
/* voce menu */
"Terremoti vicini" = "Sismi vicini";
/* voce menu */
"Testa allarme" = "Testa allarme";
"testo utenti1" = "Trovi questa app utile? Vota e supporta la app con 5 stelle su";
"testo utenti2" = "grazie! La rilevazione in tempo reale funziona se la app è installata su un numero sufficiente di smartphone. Condividi l'app per migliorare il rilevamento.";
/* titolo impostazioni notifiche
voce menu */
"Tipo messaggio" = "Tipo messaggio";
/* voce menu */
"Tono di allarme" = "Tono di allarme";
/* No comment provided by engineer. */
"TRENS" = "TREND";
/* pulsanti orrizontale */
"TSUNAMI" = "TSUNAMI";
/* No comment provided by engineer. */
"Ultim\'ora" = "Ultim\'ora";
"Ultim'ora" = "Ultim'ora";
/* No comment provided by engineer. */
"Ultima settimana" = "Ultima settimana";
@@ -487,42 +176,13 @@
/* No comment provided by engineer. */
"Ultimo mese" = "Ultimo mese";
/* No comment provided by engineer. */
"Un anno" = "Un anno";
/* No comment provided by engineer. */
"un anno" = "un anno";
/* No comment provided by engineer. */
"Un mese" = "Un mese";
/* voce menu */
"Un sisma è simulato. Dovresti ricevere l'allerta e l'allarme dovrebbe suonare. Se attive, ricordati di disabilitare l'invio della mail automatiche ai tuoi contatti per non allarmarli" = "Un sisma è simulato. Dovresti ricevere l\'allerta e l\'allarme dovrebbe suonare. Se attive, ricordati di disabilitare l\'invio della mail automatiche ai tuoi contatti per non allarmarli";
/* No comment provided by engineer. */
"Un\'ora" = "Un\'ora";
/* No comment provided by engineer. */
"Una settimana" = "Una settimana";
/* messaggio errore inserimento credenziali */
"Username e Password sbagliati" = "Username e Password sbagliati";
/* titolo pulsante notifica rete smartphone */
"VEDI IN TWITTER" = "VEDI IN TWITTER";
/* etichetta versione app */
"Versione" = "Versione";
/* item tabelle */
"Versione PRO" = "Versione PRO";
/* titolo impostazioni notifiche */
"Vibrazioni e suono" = "Vibrazioni e suono";
/* titolo pulsante notifica rete smartphone */
"VOTA L'APP" = "VOTA L\'APP";
// Nazioni
"Stati Uniti" = "Stati Uniti";
"Italia" = "Italia";
"Spagna" = "Spagna";
@@ -545,15 +205,12 @@
"India" = "India";
"Altro" = "Altro";
/// notifiche titolo
// notifiche titolo
"Allerta sismica in tempo reale" = "Allerta sismica in tempo reale";
"Segnalazione utente" = "Segnalazione utente";
"Segnalazione da rete sismica" = "Segnalazione da rete sismica";
/// notifiche body
// notifiche body
"Rilevato sisma debole a" = "Rilevato sisma debole a %@";
"Rilevato sisma forte a" = "Rilevato sisma forte a %@";
"Rilevato sisma a" = "Rilevato sisma a %@";
@@ -566,7 +223,7 @@
"Area di interesse: Oceano Pacifico" = "Area di interesse: Oceano Pacifico";
"Sisma rilevato da" = "Sisma rilevato da";
/// Voci menu
// Voci menu
"Impostazioni" = "Impostazioni";
"Informazioni" = "Informazioni";
"F.A.Q." = "F.A.Q.";
@@ -587,7 +244,6 @@
"purchase_pro_restore" = "Ripristina";
"purchase_pro_restore_alert_title" = "Ripristino effettuato";
"purchase_pro_restore_alert_message" = "Hai ripristinato il prodotto da te acquistato";
"inapp_available_10k" = "Top 10K: %lu sottoscrizioni ancora disponibili per essere allertato in meno di 1 secondo dal rilevamento del sisma";
"inapp_available_100k" = "Top 100K: %lu sottoscrizioni ancora disponibili per essere allertato in meno di 5 secondi dal rilevamento del sisma";
@@ -610,11 +266,10 @@
"Magnitudo >= 7.5" = "Magnitudo >= 7.5";
"Suona un allarme quando un sisma è rilevato dalla rete smartphone" = "Suona un allarme quando un sisma è rilevato dalla rete smartphone";
"Attiva l'allerta anche su i sismi per i quali non è possibile stimare l'intensità" = "Attiva l\'allerta anche sui sismi per i quali non è possibile stimare l\'intensità";
"Attiva l'allerta anche su i sismi per i quali non è possibile stimare l'intensità" = "Attiva l'allerta anche sui sismi per i quali non è possibile stimare l'intensità";
"Non attivare allarmi o notifiche in questo lasso di tempo" = "Non attivare allarmi o notifiche in questo lasso di tempo";
// Filtri sismi
"Magnitudo minima" = "Magnitudo minima";
"Distanza massima" = "Distanza massima";
"Periodo temporale" = "Periodo temporale";
@@ -648,6 +303,7 @@
"share_notified" = "Segnalato tramite la app Rilevatore Terremoto. Scarica la app da https://sismo.app/download/ per ricevere allerte #terremoto in tempo reale @SismoDetector";
"manual_sure" = "Vuoi davvero segnalare un sisma?";
"manual_yes" = "Sì";
"calendar_missing_permission" = "Non è possibile aprire il calendario, assicurarsi di aver impostato i permessi corretti.";
// Segnalazioni
"manual_sendmessage" = "Invia un messaggio che gli altri utenti possono leggere sul sisma che hai segnalato";
@@ -661,6 +317,10 @@
"permission_location_no" = "Hai scelto di impedire alla app di leggere la posizione del tuo dispositivo. NON riceverai notifiche ed allerte in tempo reale.";
"permission_location_no_background" = "Hai scelto di impedire alla app di leggere la posizione del tuo dispositivo quando la app è in background. NON è quindi garantita la ricezione di notifiche ed allerte in tempo reale.";
// Notifica
"alert_wave" = "Onda sismica in";
"alert_seconds" = "secondi";
// Varie
"minutes_one" = "%lu minuto fa";
"minutes_other" = "%lu minuti fa";
@@ -668,3 +328,17 @@
"hours_other" = "%lu ore fa";
"days_one" = "%lu giorno fa";
"days_other" = "%lu giorni fa";
// Simulatore
"main_simulator" = "Simulatore";
"globe_simulation_button" = "Calcola pre-allerta";
"globe_simulation" = "Se l'epicentro del sisma è al di fuori del cerchio rosso ed è rilevato immediatamente dagli smartphone, potrai ricevere l'allerta con più di 5 secondi di anticipo. Seleziona su mappa il possibile epicentro del sisma per calcolare il tempo di pre-allerta.";
"globe_simulation_inside" = "Seleziona un punto dentro il cerchio verde";
"globe_simulation_outside" = "Seleziona un punto fuori dal cerchio rosso";
"globe_simulation_message1" = "Con epicentro nella posizione scelta, dovresti ricevere l'allerta con %.0f secondi di anticipo. Tuttavia, prima di te devono essere allertate %.0f persone. Il tempo di preavviso sarà di %.0f secondi. Iscrivendoti oggi al servizio di priorità TOP 10K, solamente %.0f persone saranno allertate prima di te (in ordine di distanza dall'epicentro)";
"globe_simulation_message2" = "Con epicentro nella posizione scelta, dovresti ricevere l'allerta con %.0f secondi di anticipo. Tuttavia, prima di te devono essere allertate %.0f persone. L'allerta sarà ricevuta con %.0f secondi di ritardo. Iscrivendoti oggi al servizio di priorità TOP 10K, solamente %.0f persone saranno allertate prima di te (in ordine di distanza dall'epicentro)";
"globe_simulation_message3" = "Con epicentro nella posizione scelta, dovresti ricevere l'allerta con %.0f secondi di anticipo. Tuttavia, prima di te devono essere allertate %.0f persone. Iscrivendoti oggi al servizio di priorità TOP 10K, solamente %.0f persone saranno allertate prima di te (in ordine di distanza dall'epicentro)";
"globe_simulation_message4" = "Con epicentro nella posizione scelta, grazie al servizio prioritario %@ dovresti ricevere l'allerta con %.0f secondi di anticipo. Prima di te devono essere allertate solo %.0f persone.";
"globe_simulation_message5" = "Con epicentro nella posizione scelta, grazie al servizio prioritario %@ dovresti ricevere l'allerta con %.0f secondi di anticipo. Prima di te devono essere allertate %.0f persone. Puoi aumentare il tempo di pre-allerta iscrivendoti al servizio di priorità %@";
"globe_simulation_message6" = "Con epicentro nella posizione scelta, grazie al servizio prioritario %@ dovresti ricevere l'allerta con %.0f secondi di anticipo. Sarai il primo ad essere allertato!";
"globe_simulation_priority" = "Servizio priorità";
@@ -1,25 +0,0 @@
//
// EQNGeneratoreURLServer.h
// Earthquake Network
//
// Created by Luca Beretta on 19/09/18.
// Copyright © 2018 Luca Beretta. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "EQNCalibrazione.h"
#import "EQNRilevamento.h"
@interface EQNGeneratoreURLServer : NSObject
+(NSURL *)urlDownloadDati;
+(NSURL *)urlRegistrazione;
+(NSURL *)urlPosizione;
+(NSURL *)urlMessagioStatoSmartPhone:(EQNCalibrazione *)calibrazione rilevamento:(EQNRilevamento *)rilevamento;
+(NSURL *)urlInvioMessagioTerremoto:(NSInteger )magnitudo withAdress:(NSString *)address;
+(NSURL *)urlInvioCommentoTerremoto:(NSString *)commento codeMessage:(NSString *)code;
+(NSURL *)urlInvioImpostazioniNotifiche;
+(NSURL *)urlDownloadOfferTimeRemaining;
+(NSURL *)urlAlertPushTest;
@end
@@ -62,7 +62,7 @@
- (void)scaricaDatiReteSmartphone
{
[[ServerRequest defaultServerConnectionSingleton] inviaInformazioniAlServerWithURL:[NSURL URLWithString:EQNServerUrlDownloadSmartphoneNetwork] richiesta:downloadDati success:^(id result) {
[[ServerRequest defaultServerConnectionSingleton] inviaInformazioniAlServerWithURL:[NSURL URLWithString:EQNServerUrlDownloadSmartphoneNetwork] richiesta:EQNTipoChiamataDownloadDati success:^(id result) {
self.rete_smartphone = [[EQNReteSmartphone alloc] initWithInfo:result];
@@ -74,7 +74,7 @@
- (void)scaricaAreaCheck
{
[[ServerRequest defaultServerConnectionSingleton] inviaInformazioniAlServerWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@?lat=%f&lon=%f", EQNServerUrlDownloadAreaCheck, [EQNUser defaultUser].lastPosition.coordinate.latitude, [EQNUser defaultUser].lastPosition.coordinate.longitude]] richiesta:areaCheck success:^(id result) {
[[ServerRequest defaultServerConnectionSingleton] inviaInformazioniAlServerWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@?lat=%f&lon=%f", EQNServerUrlDownloadAreaCheck, [EQNUser defaultUser].lastPosition.coordinate.latitude, [EQNUser defaultUser].lastPosition.coordinate.longitude]] richiesta:EQNTipoChiamataAreaCheck success:^(id result) {
self.area_check = [[EQNAreaCheck alloc] initWithInfo:result];
@@ -87,7 +87,7 @@
- (void)scaricaPastquakes
{
[[ServerRequest defaultServerConnectionSingleton] inviaInformazioniAlServerWithURL:[NSURL URLWithString:EQNServerUrlDownloadPastQuakes] richiesta:pastquakes success:^(id result) {
[[ServerRequest defaultServerConnectionSingleton] inviaInformazioniAlServerWithURL:[NSURL URLWithString:EQNServerUrlDownloadPastQuakes] richiesta:EQNTipoChiamataPastquakes success:^(id result) {
NSMutableArray *arryTemp = [NSMutableArray array];
for (NSDictionary *dic in result) {
@@ -103,7 +103,7 @@
- (void)scaricaSegnalazioniManuali
{
[[ServerRequest defaultServerConnectionSingleton] inviaInformazioniAlServerWithURL:[NSURL URLWithString:EQNServerUrlDownloadUserReports] richiesta:segnalazioneManuale success:^(id result) {
[[ServerRequest defaultServerConnectionSingleton] inviaInformazioniAlServerWithURL:[NSURL URLWithString:EQNServerUrlDownloadUserReports] richiesta:EQNTipoChiamataSegnalazioneManuale success:^(id result) {
NSMutableArray *array = [NSMutableArray array];
NSArray *tempArray = (NSArray *)result;
@@ -147,7 +147,7 @@
NSURL *url = [NSURL URLWithString:urlString];
NSLog(@"[EQNManager] Url utilizzato per download reti sismiche: %@", url.absoluteURL);
[[ServerRequest defaultServerConnectionSingleton] inviaInformazioniAlServerWithURL:url richiesta:downloadDati success:^(id result) {
[[ServerRequest defaultServerConnectionSingleton] inviaInformazioniAlServerWithURL:url richiesta:EQNTipoChiamataDownloadDati success:^(id result) {
NSMutableArray *array = [NSMutableArray array];
for (NSDictionary *dic in result) {
@@ -345,10 +345,10 @@
- (void)iniviaMessaggioAlServer:(EQNRilevamento *)anRilevamento
{
EQNTipoChiamata tipo = calibrazione;
EQNTipoChiamata tipo = EQNTipoChiamataCalibrazione;
EQNCalibrazione *anCalibrazione = [self.calibrazione copy];
if (anRilevamento.rilievo == positivo){
tipo = rilevamento;
tipo = EQNTipoChiamataRilevamento;
[self annullaCalibrazione];
}
-2
View File
@@ -7,8 +7,6 @@ target 'Earthquake Network' do
pod 'Firebase/Core'
pod 'Firebase/Messaging'
pod 'Firebase/Crashlytics'
pod 'GoogleMaps'
pod 'GooglePlaces'
pod 'Google-Mobile-Ads-SDK'
pod 'DZNEmptyDataSet'
pod 'Solar'
+89 -106
View File
@@ -1,103 +1,94 @@
PODS:
- DZNEmptyDataSet (1.8.1)
- Firebase/Core (6.33.0):
- Firebase/Core (7.1.0):
- Firebase/CoreOnly
- FirebaseAnalytics (= 6.8.3)
- Firebase/CoreOnly (6.33.0):
- FirebaseCore (= 6.10.3)
- Firebase/Crashlytics (6.33.0):
- FirebaseAnalytics (= 7.1.0)
- Firebase/CoreOnly (7.1.0):
- FirebaseCore (= 7.1.0)
- Firebase/Crashlytics (7.1.0):
- Firebase/CoreOnly
- FirebaseCrashlytics (~> 4.6.1)
- Firebase/Messaging (6.33.0):
- FirebaseCrashlytics (~> 7.1.0)
- Firebase/Messaging (7.1.0):
- Firebase/CoreOnly
- FirebaseMessaging (~> 4.7.0)
- FirebaseAnalytics (6.8.3):
- FirebaseCore (~> 6.10)
- FirebaseInstallations (~> 1.6)
- GoogleAppMeasurement (= 6.8.3)
- GoogleUtilities/AppDelegateSwizzler (~> 6.7)
- GoogleUtilities/MethodSwizzler (~> 6.7)
- GoogleUtilities/Network (~> 6.7)
- "GoogleUtilities/NSData+zlib (~> 6.7)"
- nanopb (~> 1.30906.0)
- FirebaseCore (6.10.3):
- FirebaseCoreDiagnostics (~> 1.6)
- GoogleUtilities/Environment (~> 6.7)
- GoogleUtilities/Logger (~> 6.7)
- FirebaseCoreDiagnostics (1.7.0):
- GoogleDataTransport (~> 7.4)
- GoogleUtilities/Environment (~> 6.7)
- GoogleUtilities/Logger (~> 6.7)
- nanopb (~> 1.30906.0)
- FirebaseCrashlytics (4.6.1):
- FirebaseCore (~> 6.10)
- FirebaseInstallations (~> 1.6)
- GoogleDataTransport (~> 7.2)
- nanopb (~> 1.30906.0)
- FirebaseMessaging (~> 7.1.0)
- FirebaseAnalytics (7.1.0):
- FirebaseCore (~> 7.0)
- FirebaseInstallations (~> 7.0)
- GoogleAppMeasurement (= 7.1.0)
- GoogleUtilities/AppDelegateSwizzler (~> 7.0)
- GoogleUtilities/MethodSwizzler (~> 7.0)
- GoogleUtilities/Network (~> 7.0)
- "GoogleUtilities/NSData+zlib (~> 7.0)"
- nanopb (~> 2.30906.0)
- FirebaseCore (7.1.0):
- FirebaseCoreDiagnostics (~> 7.0)
- GoogleUtilities/Environment (~> 7.0)
- GoogleUtilities/Logger (~> 7.0)
- FirebaseCoreDiagnostics (7.1.0):
- GoogleDataTransport (~> 8.0)
- GoogleUtilities/Environment (~> 7.0)
- GoogleUtilities/Logger (~> 7.0)
- nanopb (~> 2.30906.0)
- FirebaseCrashlytics (7.1.0):
- FirebaseCore (~> 7.0)
- FirebaseInstallations (~> 7.0)
- GoogleDataTransport (~> 8.0)
- nanopb (~> 2.30906.0)
- PromisesObjC (~> 1.2)
- FirebaseInstallations (1.7.0):
- FirebaseCore (~> 6.10)
- GoogleUtilities/Environment (~> 6.7)
- GoogleUtilities/UserDefaults (~> 6.7)
- FirebaseInstallations (7.1.0):
- FirebaseCore (~> 7.0)
- GoogleUtilities/Environment (~> 7.0)
- GoogleUtilities/UserDefaults (~> 7.0)
- PromisesObjC (~> 1.2)
- FirebaseInstanceID (4.7.0):
- FirebaseCore (~> 6.10)
- FirebaseInstallations (~> 1.6)
- GoogleUtilities/Environment (~> 6.7)
- GoogleUtilities/UserDefaults (~> 6.7)
- FirebaseMessaging (4.7.0):
- FirebaseCore (~> 6.10)
- FirebaseInstanceID (~> 4.7)
- GoogleUtilities/AppDelegateSwizzler (~> 6.7)
- GoogleUtilities/Environment (~> 6.7)
- GoogleUtilities/Reachability (~> 6.7)
- GoogleUtilities/UserDefaults (~> 6.7)
- Protobuf (>= 3.9.2, ~> 3.9)
- Google-Mobile-Ads-SDK (7.66.0):
- GoogleAppMeasurement (~> 6.0)
- FirebaseInstanceID (7.1.0):
- FirebaseCore (~> 7.0)
- FirebaseInstallations (~> 7.0)
- GoogleUtilities/Environment (~> 7.0)
- GoogleUtilities/UserDefaults (~> 7.0)
- FirebaseMessaging (7.1.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 (7.68.0):
- GoogleAppMeasurement (~> 7.0)
- GoogleUserMessagingPlatform (~> 1.1)
- GoogleAppMeasurement (6.8.3):
- GoogleUtilities/AppDelegateSwizzler (~> 6.7)
- GoogleUtilities/MethodSwizzler (~> 6.7)
- GoogleUtilities/Network (~> 6.7)
- "GoogleUtilities/NSData+zlib (~> 6.7)"
- nanopb (~> 1.30906.0)
- GoogleDataTransport (7.4.0):
- nanopb (~> 1.30906.0)
- GoogleMaps (3.10.0):
- GoogleMaps/Maps (= 3.10.0)
- GoogleMaps/Base (3.10.0)
- GoogleMaps/Maps (3.10.0):
- GoogleMaps/Base
- GooglePlaces (3.10.0):
- GoogleMaps/Base (= 3.10.0)
- GoogleUserMessagingPlatform (1.2.0)
- GoogleUtilities/AppDelegateSwizzler (6.7.2):
- GoogleAppMeasurement (7.1.0):
- GoogleUtilities/AppDelegateSwizzler (~> 7.0)
- GoogleUtilities/MethodSwizzler (~> 7.0)
- GoogleUtilities/Network (~> 7.0)
- "GoogleUtilities/NSData+zlib (~> 7.0)"
- nanopb (~> 2.30906.0)
- GoogleDataTransport (8.0.1):
- nanopb (~> 2.30906.0)
- GoogleUserMessagingPlatform (1.3.0)
- GoogleUtilities/AppDelegateSwizzler (7.1.0):
- GoogleUtilities/Environment
- GoogleUtilities/Logger
- GoogleUtilities/Network
- GoogleUtilities/Environment (6.7.2):
- GoogleUtilities/Environment (7.1.0):
- PromisesObjC (~> 1.2)
- GoogleUtilities/Logger (6.7.2):
- GoogleUtilities/Logger (7.1.0):
- GoogleUtilities/Environment
- GoogleUtilities/MethodSwizzler (6.7.2):
- GoogleUtilities/MethodSwizzler (7.1.0):
- GoogleUtilities/Logger
- GoogleUtilities/Network (6.7.2):
- GoogleUtilities/Network (7.1.0):
- GoogleUtilities/Logger
- "GoogleUtilities/NSData+zlib"
- GoogleUtilities/Reachability
- "GoogleUtilities/NSData+zlib (6.7.2)"
- GoogleUtilities/Reachability (6.7.2):
- "GoogleUtilities/NSData+zlib (7.1.0)"
- GoogleUtilities/Reachability (7.1.0):
- GoogleUtilities/Logger
- GoogleUtilities/UserDefaults (6.7.2):
- GoogleUtilities/UserDefaults (7.1.0):
- GoogleUtilities/Logger
- nanopb (1.30906.0):
- nanopb/decode (= 1.30906.0)
- nanopb/encode (= 1.30906.0)
- nanopb/decode (1.30906.0)
- nanopb/encode (1.30906.0)
- PromisesObjC (1.2.10)
- Protobuf (3.13.0)
- nanopb (2.30906.0):
- nanopb/decode (= 2.30906.0)
- nanopb/encode (= 2.30906.0)
- nanopb/decode (2.30906.0)
- nanopb/encode (2.30906.0)
- PromisesObjC (1.2.11)
- Solar (2.1.0)
DEPENDENCIES:
@@ -106,8 +97,6 @@ DEPENDENCIES:
- Firebase/Crashlytics
- Firebase/Messaging
- Google-Mobile-Ads-SDK
- GoogleMaps
- GooglePlaces
- Solar
SPEC REPOS:
@@ -124,37 +113,31 @@ SPEC REPOS:
- Google-Mobile-Ads-SDK
- GoogleAppMeasurement
- GoogleDataTransport
- GoogleMaps
- GooglePlaces
- GoogleUserMessagingPlatform
- GoogleUtilities
- nanopb
- PromisesObjC
- Protobuf
- Solar
SPEC CHECKSUMS:
DZNEmptyDataSet: 9525833b9e68ac21c30253e1d3d7076cc828eaa7
Firebase: 8db6f2d1b2c5e2984efba4949a145875a8f65fe5
FirebaseAnalytics: 5dd088bd2e67bb9d13dbf792d1164ceaf3052193
FirebaseCore: d889d9e12535b7f36ac8bfbf1713a0836a3012cd
FirebaseCoreDiagnostics: 770ac5958e1372ce67959ae4b4f31d8e127c3ac1
FirebaseCrashlytics: 5777d3462fb8c3ab9e80a2473bd7d667a2e8411c
FirebaseInstallations: 466c7b4d1f58fe16707693091da253726a731ed2
FirebaseInstanceID: ac5a82fcd21f804dbfc8f318eff9e1d7a9916e49
FirebaseMessaging: fc1f98b4592f8f2ea538169b1c317c6e76f81300
Google-Mobile-Ads-SDK: 7d7074359c040f5add4e0963bf860e14690060d0
GoogleAppMeasurement: 966e88df9d19c15715137bb2ddaf52373f111436
GoogleDataTransport: b7f406340a291370045a270c599e53c6fa6ec20f
GoogleMaps: 8c080862ff2748ece9929471b30feb56a6c5079d
GooglePlaces: 9a6f5f3a0c88da2aa1bf7426a65d3e004f5e69a1
GoogleUserMessagingPlatform: c85530d930ba509583aa5a6d50a10aca22cf8502
GoogleUtilities: 7f2f5a07f888cdb145101d6042bc4422f57e70b3
nanopb: 59317e09cf1f1a0af72f12af412d54edf52603fc
PromisesObjC: b14b1c6b68e306650688599de8a45e49fae81151
Protobuf: 3dac39b34a08151c6d949560efe3f86134a3f748
Firebase: 78e8dd2e39d653de6270432ad84fe8b59f7bf4e8
FirebaseAnalytics: 7f165a56dea86ddd5b8ce02af3bee982c683405c
FirebaseCore: 20046127eef0fcb8fa25df7fc12f7b97d4e48611
FirebaseCoreDiagnostics: 872cdb9b749b23346dddd5c1014d1babd2257de3
FirebaseCrashlytics: c722e4ca283272eb90eb5bc245fdc6588e2f22c2
FirebaseInstallations: 3de38553e86171b5f81d83cdeef63473d37bfdb0
FirebaseInstanceID: 61e8d10a4192a582c6239378169d10e504ca8d91
FirebaseMessaging: 076054895c9260f82c7304cc7709dbf19b8f3e4a
Google-Mobile-Ads-SDK: 29bbdb182d69ff606cc0301da1590b40be8d2205
GoogleAppMeasurement: 89e1a64593f968713b0506ba1b53b38a154bf9a5
GoogleDataTransport: e4085e6762f36a6141738f46b0153473ce57fb18
GoogleUserMessagingPlatform: 1d4b6946710d18cec34742054092e2c2bddae61f
GoogleUtilities: f734da554aade8cc7928a31c2f3311897933a1bd
nanopb: 1bf24dd71191072e120b83dd02d08f3da0d65e53
PromisesObjC: 8c196f5a328c2cba3e74624585467a557dcb482f
Solar: 2dc6e7cc39186cb0c8228fa08df76fb50c7d8f24
PODFILE CHECKSUM: e0786ee9478a544f2210d53b698dd2757fa7dbe8
PODFILE CHECKSUM: dd5131b6d7a83fb7c22ecc161ed4fc143eda0ac1
COCOAPODS: 1.9.3
COCOAPODS: 1.10.0