Uno dei miei sogni e' diventato realta', una distribuzione Linux, seppur minima, che gira direttamente su Ipad
Per usare al meglio iSh e' quasi obbligatorio l'uso della tastiera fisica
Il progetto si chiama https://ish.app/ e fa girare una ambiente Alpine Linux in shell con la possibilita' di installare software tramite apk (sono attivi solo i repository main e community, non il world)
il programma e' open source e si puo' installare al momento tramite TestFlight
Ecco un buon motivo per non usare Mac.
Sto usando un vecchio portatile MacBook Pro con installato El Capitan 10.11.6 (piu' recente sistema installabile). Per adesso lo ho usato quasi solo come macchina da scrivere ma adesso volevo provare ad usare Cordova ed avevo la necessita' di installare XCode
Primo problema: XCode per le versioni "vecchie" non si installa da Apple Store. Si deve scaricare il pacchetto a parte (e bisogna sapere quale e' il pacchetto giusto...nel mio caso XCode 7.3.1) ma per fare cio' bisogna anche essere sviluppatori registrati e quindi aver pagato l'abbonamento
Fatto cio' ho provato a compilare un semplice codice e ad installarlo sul telefono (un iPhone SE con iOS 11.4.1) ed e' saltato fuori l'errore Could not find Developer Disk Image...e quindi ??? . Tutto cio' nonostante avessi esplicitamente messo come target IOs 9.3 ovvero il massimo per XCode 7
Dopo un bel po' di giri su Internet ho scoperto che si possono scaricare le Developer Disk Image in modo non ufficiale (ma firmate) da questo sito
1) a differenza di Android Wear, Apple Watch non ha una connessione via cavo con cui effettuare la programmazione. La basetta magnetica infatti non ha dei pin ma effettua la ricarica in modalita' Wireless. Per questo motivo per inviare il programma allo smartwatch e' necessario che questo sia sempre accoppiato al telefono.
2) Come Android Wear, una applicazione per iWatch e' composta da due componenti. Una applicazione sul telefono (app companion) e l'applicazione sul telefono). Il progetto sara' quindi composto da due storyboard e da differenti assets
Assets della parte iWatch. Le icone sono differenti rispetto a quelle standard IOS
3) Per compilare il programma ed effettuare le prove sull'emulatore si deve cliccare in alto sulla lista dei dispositivi e selezionare lo scheme seguito da WatchKit App. Cio' ha come risultato che vengono aperti due emulatori (il primo per un IPhone 7 ed il secondo emulatore per lo smartwatch). Se invece si vuole effettuare il debug sul dispositivo fisico si deve selezionare il primo scheme (quello che riporta il solo telefono)..sara' il telefono via bluetooth ad inviare il programma verso lo smartwatch
4) il file che viene eseguito di default in un progetto IOS e' ViewController mentre in un progetto iWatch e' InterfaceController
5) anche comandi semplici come cambiare il testo di un pulsante segue sintassi differenti su IOs e su WatchKit
In questi giorni sta avendo diffusione il video di un giovane filmmaker che racconta le vicessitudini sul furto (voluto) di un telefono Android
Invece di utilizzare le applicazioni tipiche di Android e IOS per tracciare la posizione del telefono, e' stata impiegata un app specifica Cerberus....vale la pena darci un'occhio
Una prima differenza: su Play Store esiste una versione del software mentre sul sito se ne possono scaricare due versioni differente (la prima e' identica a quella del Play Store la seconda utilizza dei metodi piu' avanzati per nascondersi come app di sistema) Ovviamente per la prova ho utilizzato un telefono di prova settato su un account di prova..il software prende il controllo completo del telefono e quindi se cade nelle mani sbagliate sono guai. Cerbarus ha subito nella sua storia un leak delle informazioni degli utenti
Al momento attuale l'applicazione e' gratuita ma per una sola settimana ed per un solo dispositivo. Dopo l'abbonamento e' di 5 euro/anno
Schermata di installazione
Tutti i servizi passano dai server di Cerberus (di fatto non si ha una diretta interazione con il telefono remoto ma solo con l'interfaccia web ospitata sui server Cerberus). L'username e password di login sono le stesse per loggarsi sul sito e per configurare l'app
alcune funzioni richiedono che il terminale sia rootato
Un aspetto divertente e' che se si cerca di disinstallare l'applicazione nel modo standard il pulsante non e' cliccabile.
Altrettanto curiosamente non e' necessaria nessuna password per procedere...basta andare Impostazione/Sicurezza/Amministratori dispositivo e togliere la spunta a Cerberus. Dopo questa operazione l'applicazione e' disistallabile. A meno di un blocco remoto quindi chi ha in mano il telefono puo' sempre rimuovere il blocco
Nell'interfaccia web sulla sinistra si selezionano i comandi da inviare al terminale e sulla destra si ha il log
Si possono scattare foto da remoto ed acquisire l'audio ambientale
Visto che l'apk e' semplicemente ho provato a disassemblarlo con Jadx
Librerie offuscate
Come era facile da prevedere il codice principale e' stato offuscato ma si sono un po' di cose interessanti. Prima di tutto il file Manifest piu' mostruoso che si possa immaginare (la API di Google e' stata modificata)
Ovviamente,e per fortuna, per l'uso del software ci vuole almeno un accesso fisico al dispositivo e cio' ne limita l'uso non idoneo alla sua funzione principale. In definitiva comunque un buon software (se non fosse che la licenza d'uso permette agli sviluppatori di divulgare dati...e visto il controllo di informazioni che si possono raccogliere e' meglio stare attenti a non dare la propria chiave di casa in mani sconosciute)
Nel precedente post era stato mostrato come inviare notifiche push a client Android tramite il cloud di Firebase. Si puo' fare la stessa cosa anche con IOS ma e' un inferno e rimando al video linkato
dopo aver creato un progetto generico per prima cosa si devono aggiungere le librerie via Firebase
inizializzando Cocoapod
pod init
poi si edita il Podfile
----------------------------------
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'
target 'Notifica' do
# Uncomment the next line if you're using Swift or would like to use dynamic frameworks
# use_frameworks!
# Pods for Notifica
target 'NotificaTests' do
inherit! :search_paths
# Pods for testing
end
target 'NotificaUITests' do
inherit! :search_paths
# Pods for testing
end pod 'Firebase' pod 'Firebase/Messaging'
end
----------------------------------
poi si installano le librerie
pod install
e si apre il progetto
open Notifica.xcworkspace
per attivare le notifiche e' sufficiente modificare AppDelegate.m (in giallo sono selezionate le righe di interesse)
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
// Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
Si devono poi modificare le Capabilities del progetto attivando le Push Notification e Keyring Sharing
il problema principale e' quello di creare un certificato di autenticazione, aspetto che non e' presente sulla versione Android. La procedura e' spiegata nel dettaglio nel video e non e' esattamente banale
Un avvertimento: non e' possibile usare l'emulatore software di IOS, e' necessario utilizzare un dispositivo fisico
Per compilare i progetti Cordova su Android ed IOS di solito faccio creare lo scheletro del codice a Cordova ma poi intervengo con Android Studio e XCode per le modifiche
Android
Per prima cosa si devono modificare i file
sostituendomavenCentral() conjcenter()
e risincronizzando il progetto (altrimenti non si compila)
IOS
Un aspetto fastidioso di Cordova su IOS e' che la WebView fa a corprire parte della statusbar. Per evitare cio' la cosa piu' semplice e' nascondere la status bar aggiungendo a MainViewController.m la funzione
- (BOOL)prefersStatusBarHidden
{
return YES;
} Pinch to Zoom
Sia la rotazione del display che il pinch to zoom non sono abilitati di default in Cordova (e questo puo' essere molto fastidioso per utenti mobile abituati a questa funzionalita' praticamente ovunque)
Android
In Android devono essere aggiunta alla MainActivity le righe evidenziate in giallo
------------------------------
import android.os.Bundle;import org.apache.cordova.*;import android.webkit.WebSettings;
import android.webkit.WebView;public class MainActivity extends CordovaActivity
{
@Overridepublic void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// Set by <content src="index.html" /> in config.xmlloadUrl(launchUrl); WebView webView = (WebView) appView.getEngine().getView();
WebSettings ws = webView.getSettings();
ws.setSupportZoom(true);
ws.setBuiltInZoomControls(true);
}
}
------------------------------
IOS
In Ios si deve modificare il file config.xml in modo da abilitare il ViewPortScale
Con Apache Cordova e' possibile scrivere dati sulla memoria del dispositivo mobile ma, a causa delle enormi differenze della gestione dello storage nei vari sistemi operativi, non e' possibile avere una soluzione unica ma si devono effettuare adattamenti ad hoc
Per prima cosa si deve aggiungere il plugin File con il comando
cordova plugin add org.apache.cordova.file IOS
Il filesystem in IOS ovviamente non viene esposto e lo scambio dati avviene solo tramite ITunes
Il progetto Xcode di Cordova deve essere modificato come segue
1) deve essere aggiunto una chiave file info.plist Application supports Itunes file sharing = YES (UIFileSharingEnabled = YES)
2) deve essere aggiunto al file config.xml (dopo gli allow) il seguente codice
------------- <feature name="File">
3) il codice HTML5 deve essere leggermente modificato rispetto agli esempi di Cordova (in particolare si deve puntare sulla directory Documents che su IOS e' persistente ed in lettura/scrittura. Per un esempio si puo' leggere anche questo post
-------------
si dichiara in config.xml che si vuole usare il plugin
------------- <feature name="File"> <param name="android-package" value="org.apache.cordova.FileUtils" /> </feature> <feature name="FileTransfer"> <param name="android-package" value="org.apache.cordova.FileTransfer" /> </feature>
-------------
Si settano in permessi di scrittura in AndroidManifest.xml
------------- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
-------------
Di nuovo il codice HTML5 dell'esempio di Cordova in cui e' evidenziata in giallo la modifica per Android
------------- /* globals console,document,window,cordova */ document.addEventListener('deviceready', onDeviceReady, false); var logOb; function fail(e) { console.log("FileSystem Error"); console.dir(e); } function onDeviceReady() { window.resolveLocalFileSystemURL(cordova.file.externalRootDirectory, function(dir) { console.log("got main dir",dir); dir.getFile("log.txt", {create:true}, function(file) { console.log("got the file", file); logOb = file; writeLog("App started"); }); }); document.querySelector("#actionOne").addEventListener("touchend", function(e) { //Ok, normal stuff for actionOne here // //Now log it writeLog("actionOne fired"); }, false); document.querySelector("#actionTwo").addEventListener("touchend", function(e) { //Ok, normal stuff for actionTwo here // //Now log it writeLog("actionTwo fired"); }, false); } function writeLog(str) { if(!logOb) return; var log = str + " [" + (new Date()) + "]\n"; console.log("going to log "+log); logOb.createWriter(function(fileWriter) { fileWriter.seek(fileWriter.length); var blob = new Blob([log], {type:'text/plain'}); fileWriter.write(blob); console.log("ok, in theory i worked"); }, fail); } function justForTesting() { logOb.file(function(file) { var reader = new FileReader(); reader.onloadend = function(e) { console.log(this.result); }; reader.readAsText(file); }, fail); }
-------------
Sto sviluppando una applicazione Android/IOS e per non perdere la testa su due versioni ho deciso di usare Phonegap per mantenerel lo sviluppo centralizzato anche se di fatto non uso le API di Phonegap
Al momento di effettuare il primo upload su Apple Store (dopo che tutte le verifiche di XCode erano state superate) ho ricevuto nel giro di un secondo la seguente mail
----------------------------------------
Dear developer,
We have discovered one or more issues with your recent delivery for "Abetone Trail Park". Your delivery was successful, but you may wish to correct the following issues in your next delivery:
Missing Push Notification Entitlement - Your app appears to include API used to register with the Apple Push Notification service, but the app signature's entitlements do not include the "aps-environment" entitlement. If your app uses the Apple Push Notification service, make sure your App ID is enabled for Push Notification in the Provisioning Portal, and resubmit after signing your app with a Distribution provisioning profile that includes the "aps-environment" entitlement. See "Provisioning and Development" in the Local and Push Notification Programming Guide for more information. If your app does not use the Apple Push Notification service, no action is required. You may remove the API from future submissions to stop this warning. If you use a third-party framework, you may need to contact the developer for information on removing the API.
After you’ve corrected the issues, you can use Xcode or Application Loader to upload a new binary to iTunes Connect.
Regards,
The App Store team
----------------------------------------
Di fatto non uso le notifiche sulla mia applicazione e quindi non riuscivo a capire il motivo dell'errore.
Guardando il codice sorgente di PhoneGap, piu' precisamente in AppDelegate.m, sono presenti due funzioni
In questo post viene indicato come configurare i client OpenVPN su varia piattaforme
Si parte avendo disponibili i file client.crt, client.key, ca.crt e config.ovpn tutti nella stessa directory
Sui dispositivi desktop sono necessari i privilegi di amministratore perche' di fatto viene creata una interfaccia di rete virtuale
Linux
da linea di comando
openvpn --config file.ovpn
in Ubuntu c'e' anche una procedura guidata visuale dal menu delle connessioni di rete /VPN
MAC (Tunnelblick)
Si clicca sul file ovpn
Viene richiesto di aggiungere la chiave a Tunnelblick (richiesta anche la password)
Per connettersi basta cliccare sull'icona di Tunnelblick e selezionare la VPN desiderata
IOS (Client OpenVPN)
Tramite Itunes si seleziona il dispositivo, poi il tab App, si scorre verso il basso in Condivisione File e si aggiungono tutti e quattro i file
sul telefono verra' riconosciuta la nuova configurazione, Si clicca il pulsante + verde per aggiungerla
A questo punto con il pulsante a slitta si lancia la connessione
Windows (Client OpenVPN)
Si scarica il client da questo link e si copiano i quattro file in C:\Programmi\OpenVPN\config
Si apre quindi OpenVPN GUI
Appare un'icona nella traybar. Si clicca destro e connetti
In estate avevo scritto una piccola applicazione per IBeacon
E' passata l'estate e l'autunno ma sono rimasto fedele a IOS 7 e OS X 10.9 perche' i sistemi operativi troppo recenti sono sempre fonti di problemi; in questi giorni mi sono pero' convinto a passare ad IOS 8.1.2 sul telefono ed a OSX 10.10 sul portatile
La sorpresa e' venuta quando sono arrivato a compilare ed eseguire il codice per IBeacon che precedemente funzionava perfettamente. Nonostante non ci fossero errori di compilazione ne' errori di esecuzione il programma semplicemente aveva smesso di riconoscere i beacons vicini
Dopo un paio di giorni a battere il capo sul muro sono arrivato su questo link in cui si segnala che con l'arrivo di IOS 8 si devono aggiungere un paio di stringhe un info.plist del progetto
-----------------------------------------
<key>NSLocationAlwaysUsageDescription</key>