Visualizzazione post con etichetta IOS. Mostra tutti i post
Visualizzazione post con etichetta IOS. Mostra tutti i post

mercoledì 25 marzo 2020

Linux Alpine su Ipad

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

Editor Nano 
Apk



martedì 21 agosto 2018

Could not find Developer Disk Image

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

https://github.com/xushuduo/Xcode-iOS-Developer-Disk-Image

e poi devono essere copiate nella cartella

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport

ed alla fine funziona

giovedì 2 febbraio 2017

Programmazione Iwatch

Primi passi di programmazione di ioWatch di Apple


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
iOs

[_point_left setTitle:@"00" forState:UIControlStateNormal];
Watchkit 
[_point_left setTitle:@"00"];

martedì 3 gennaio 2017

Cerberus App

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)
----------------------------
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="11" android:="2.1.2" package="com.lsdroid.cerberus.client" platformBuildVersionCode="22" platformBuildVersionName="5.1.1-1819727">
    <uses-sdk android:="15" android:="22" />
    <uses-permission android:="android.permission.SEND_SMS" />
    <uses-permission android:="android.permission.READ_CONTACTS" />
    <uses-permission android:="android.permission.PROCESS_OUTGOING_CALLS" />
    <uses-permission android:="android.permission.RECEIVE_SMS" />
    <uses-permission android:="android.permission.READ_SMS" />
    <uses-permission android:="android.permission.READ_PHONE_STATE" />
    <uses-permission android:="android.permission.INTERNET" />
    <uses-permission android:="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:="com.google.android.providers.gsf.permission.READ_GSERVICES" />
    <uses-permission android:="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:="android.permission.WRITE_SETTINGS" />
    <uses-feature android:="20000" android:="true" />
    <uses-feature android:="android.hardware.telephony" android:="false" />
    <application android:="@style/" android:="@string/" android:="@drawable/icon" android:="o.ᑊ">
        <activity android:="@style/" android:="@string/" android:="o.ᐠ" android:="2" android:="fb0" android:="2" />
        <activity android:="@style/" android:="@string/" android:="o.ᕀ" android:="1" android:="fb0" android:="2" />
        <activity android:="@string/" android:=".StartActivity" android:="1" android:="fb0" android:="2">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:="@string/" android:="o.ᔊ" android:="1" android:="fb0" android:="2" />
        <activity android:="@style/" android:="@string/" android:="o.เ" android:="1b0" android:="@string/" android:="2" />
        <receiver android:=".StartReceiver">
            <intent-filter android:="2147483647">
                <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>
        <receiver android:=".SmsReceiver">
            <intent-filter android:="100">
                <action android:name="android.intent.action.DATA_SMS_RECEIVED" />
                <data android:="sms" android:="*" android:="12346" />
            </intent-filter>
        </receiver>
        <service android:="o.ˆ" />
        <service android:="o.ᕑ" />
        <service android:="o.ˀ" />
        <service android:="com.google.android.gms.analytics.CampaignTrackingService" />
        <receiver android:="com.google.android.gms.analytics.CampaignTrackingReceiver" android:="true">
            <intent-filter>
                <action android:name="com.android.vending.INSTALL_REFERRER" />
            </intent-filter>
        </receiver>
        <meta-data android:="com.google.android.gms.version" android:="@integer/" />
        <meta-data android:="com.google.android.maps.v2.API_KEY" android:="AIzaSyCLvVIVynRBR7yC2Wa18i" />
    </application>
</manifest>
----------------------------

c'e' anche l'uso della libreria okhttp 
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)


venerdì 2 dicembre 2016

Notifiche cloud con Firebase su IOS

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)

AppDelegate.m
-----------------------------------
//
//  AppDelegate.m
//  Notifica
//
//  Created by Luca Innocenti on 30/11/16.
//  Copyright © 2016 Luca Innocenti. All rights reserved.
//

#import "AppDelegate.h"
@import Firebase;
@import FirebaseMessaging;


@interface AppDelegate ()

@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    [FIRApp configure];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tokenRefreshCallback:) name: kFIRInstanceIDTokenRefreshNotification object:nil];
    
    UIUserNotificationType allNotificationTypes = (UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge);
    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:allNotificationTypes categories:nil];
    [application registerUserNotificationSettings:settings];
    [application registerForRemoteNotifications];
    
     return YES;
}


- (void)applicationWillResignActive:(UIApplication *)application {
    // 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.
}


- (void)applicationDidEnterBackground:(UIApplication *)application {
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
    
    [[FIRMessaging messaging]disconnect];
    
}


- (void)applicationWillEnterForeground:(UIApplication *)application {
    // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
}


- (void)applicationDidBecomeActive:(UIApplication *)application {
    // 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.
    [self connectToFirebase];

}


- (void)applicationWillTerminate:(UIApplication *)application {
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}


- (void)application:(UIApplication *)application didReceiveRemoteNotification:(nonnull NSDictionary *)userInfo fetchCompletionHandler:(nonnull void (^)(UIBackgroundFetchResult))completionHandler {
    NSLog(@"%@",userInfo);
}

- (void)tokenRefreshCallback:(NSNotification *)notification{
    NSString *refreshToken = [[FIRInstanceID instanceID] token];
    NSLog(@"Instance ID Token: %@",refreshToken);
    [self connectToFirebase];
}

- (void)connectToFirebase{
    [[FIRMessaging messaging] connectWithCompletion:^(NSError * _Nullable error){
        if (error != nil) {
            NSLog(@"Unable to connect to FCM %@",error);
        }else {
            NSLog(@"Connesso");
        }
        
    }];
}


@end
-----------------------------------

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







lunedì 11 gennaio 2016

Compilare Apache/Cordova sotto Android Studio/IOS

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

build.gradle  Module:CordovaLIb
build.gradle Module:android

sostituendo mavenCentral() con jcenter()
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
{
    @Override    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        // Set by <content src="index.html" /> in config.xml        loadUrl(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

<platform name="ios">
        <allow-intent href="itms:*" />
        <allow-intent href="itms-apps:*" />
        <preference name='EnableViewportScale' value='true'/>
        <preference name='Orientation' value='all'/>
</platform>

fra le altre cose nel medesimo file si puo' abilitare anche l'Orientation 

giovedì 7 gennaio 2016

Scrivere file con Cordova su Android Studio/XCode

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">
        <param name="ios-package" value="CDVFile" />
    </feature>
    <feature name="FileTransfer">
        <param name="ios-package" value="CDVFileTransfer" />
    </feature>
    <preference name="iosPersistentFileLocation" value="Library" />
    <preference name="BackupWebStorage" value="local" />
-------------

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
-------------
/* 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.documentsDirectory, 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
                                                          alert("tasto 1");
                                                          writeLog("actionOne fired");
                                                          }, false);
    
    document.querySelector("#actionTwo").addEventListener("touchend", function(e) {
                                                          //Ok, normal stuff for actionTwo here
                                                          //
                                                          //Now log it
                                                          alert("tasto 2");

                                                          writeLog("actionTwo fired");
                                                          }, false);
    
}

function writeLog(str) {
    if(!logOb) {
        alert("errore write log");
            return;
            }
    var log = str + " [" + (new Date()) + "]\n";
    console.log("going to log "+log);
    alert("Luca");
    logOb.createWriter(function(fileWriter) {
                       
                       fileWriter.seek(fileWriter.length);
                       alert("Luca");
                       
                       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);
    

}
-------------


Android

Su Android le cose sono decisamente piu' semplici

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);

}
-------------

martedì 7 luglio 2015

Missing Push Notification Entitlement e PhoneGap

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

----------------------------------------
- (void)      application:(UIApplication*)application
    didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
{
    // re-post ( broadcast )
    NSString* token = [[[[deviceToken description]
        stringByReplacingOccurrencesOfString:@"<" withString:@""]
        stringByReplacingOccurrencesOfString:@">" withString:@""]
        stringByReplacingOccurrencesOfString:@" " withString:@""];

    [[NSNotificationCenter defaultCenter] postNotificationName:CDVRemoteNotification object:token];
}

- (void)                                 application:(UIApplication*)application
    didFailToRegisterForRemoteNotificationsWithError:(NSError*)error
{
    // re-post ( broadcast )
    [[NSNotificationCenter defaultCenter] postNotificationName:CDVRemoteNotificationError object:error];

}
----------------------------------------

E' stato sufficiente commentare le due funzioni, ricompilare e rimandare a Apple Store per vedere scomparire il messaggio di errore

mercoledì 28 gennaio 2015

Installare client OpenVPN (Windows,Linux,Mac,IOS)

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




venerdì 26 dicembre 2014

IBeacon ed IOS8

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> 
<string>Messaggio Utente</string>
-----------------------------------------

oppure
-----------------------------------------
<key>NSLocationWhenInUseUsageDescription</key>
 <string>Your message goes here</string>
-----------------------------------------

effettuate queste modifiche il programma ha ricominciato a funzionare (e' in questi momenti che amo la programmazione :<<<<


Geologi

  E so anche espatriare senza praticamente toccare strada asfaltata