iOS, Android, Windows mobile development codes and tips

iOS Bağlantı kontrolü ve Wifi / 3G bağlantı farkı

Uygulamamızın bağlantısı koptuğunda yada wifi üzerinden mi 3G üzerinden mi bağlandığını anlayabilmek için aşağıdaki kodları kullanmamız yeterli olacaktır. Bağlantı durumu değiştiğinde reachabilityChanged fonksiyonu çalışır.

AppDelegate.h


#import "Reachability.h"

@interface AppDelegate : UIResponder {

Reachability *reachability;
NetworkStatus reachStatus;

}

AppDelegate.m


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

reachability = [Reachability reachabilityForInternetConnection];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(reachabilityChanged)
name:kReachabilityChangedNotification
object:nil];
[reachability startNotifier];
[self reachabilityChanged];

//sürekli kontrolü kapatmak için kullanabilirsiniz.
//[reachability stopNotifier];

// Override point for customization after application launch.
return YES;

}

- (void) reachabilityChanged {

reachStatus = [reachability currentReachabilityStatus];

if(reachStatus == NotReachable)
{
//No internet
NSLog(@"No Internet");
}
else if (reachStatus == ReachableViaWiFi)
{
//WiFi
NSLog(@"Wifi");
}
else if (reachStatus == ReachableViaWWAN)
{
//3G
NSLog(@"3G");
}

}

Reachability class dosyalarını indirmek için:
https://github.com/tonymillion/Reachability

iOS Bağlanılan Wifi Ağ Adını Bulma

AppDelegate.h


+ (NSString *)currentWifiSSID {
// Simülatörde çalışmaz - Does not work on the simulator.
NSString *ssid = nil;
NSArray *ifs = (__bridge_transfer id)CNCopySupportedInterfaces();
for (NSString *ifnam in ifs) {
NSDictionary *info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)ifnam);
if (info[@"SSID"]) {
ssid = info[@"SSID"];
}
}
return ssid;
}

AppDelegate.m


NSLog(@"Wifi: %@", [AppDelegate currentWifiSSID]);

iOS Documents Klasörüne Dosya Kopyalamak

Uygulamanız cihaz üzerinde çalıştığında yazma izni sadece /Documents klasöründe vardır. Bu nedenle .sqlite gibi yazma izni gerektiren dosyalarınızı bu klasörde çalıştırmanız gereklidir.
Fakat Xcode size dosyalarınızı koyabileceğiniz bir /Documents klasörü sunmaz. Uygulamanız, cihaza yüklendiğinde otomatik yaratılan bu klasöre bir dosya kopyalamak için aşağıdaki kodu kullanabilirsiniz.
Yüklemek istediğiniz dosya root(ana) dizinde xcode projenize eklenmiş olmalıdır.
İlgili kontrol kodlarını da ekleyerek bu işlemi sadece bir kez yapmalısınız, aksi halde uygulamanız her açıldığında dosyanın üzerine kopyalarsınız ve kullanıcıya veri kayıpları yaşatabilirsiniz.


NSFileManager *fmngr = [[NSFileManager alloc] init];
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"history.sqlite" ofType:nil];
NSError *error;
if(![fmngr copyItemAtPath:filePath toPath:[NSString stringWithFormat:@"%@/Documents/history.sqlite", NSHomeDirectory()] error:&error]) {
// handle the error
NSLog(@"Dosya yaratılamadı: %@", [error description]);
}
[fmngr release];

iOS Sunucuya Veri Gönderme

Uygulamadan sunucumuzdaki bir php dosyasına veri göndermek için aşağıdaki kodu kullanabiliriz.
Örneğimizde cihazla ilgili bazı bilgileri gönderiyoruz.


#import "UIDeviceHardware.h"

- (void) postDataRequest {

NSString *urlstr = [[NSString alloc] initWithFormat:@"http://www.sulubeyn.com./data.php?name=%@&sysver=%@&uuid=%@&v=1.0",
[[UIDevice currentDevice] name],
[[UIDevice currentDevice] systemVersion],
[[UIDevice currentDevice] uniqueIdentifier]
];
NSString *urlstrEscape = [urlstr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:urlstrEscape]
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:3.0];

NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest
delegate:self];
NSLog(@"%@", theConnection);
}

iOS İnternetten Resim Download

iOS programlamada herzaman işimize yarıyacak bir snippet’ı paylaşıyoruz.

-(void)SaveImageFromUrl
{

NSLog(@"Downloading...");

NSString *jpg_adi = [[NSUserDefaults standardUserDefaults] stringForKey:@"jpg_adi"];

NSString *urlAddress = [[NSString alloc] initWithFormat:@"http://www.sulubeyn.com/images/%@.jpg",jpg_adi];

UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:urlAddress]]];

[Photo setImage:image];

}

iOS Sdk da Kendi Function Kütüphanelerimizi Oluşturmak

Alışık olduğumuz programlama dillerinden objective C ye direk dalış yaptığımızda biraz afallar gibi oluyoruz. Ama php, c# , c++ ve benzeri dillere azda olsa aşina olanlar kendi kütüphanelerini yaratmak isteyeceklerdir.

Xcode ile yeni bir proje açıp yeni bir class ekliyoruz. Classımızın adı Function .h ve .m dosyalarını aşağıdaki gibi revize ediyoruz.

Function.h


#import <Foundation/Foundation.h>

@interface Functions : NSObject {
NSString *Alert_Message;
NSString *AlertBox_Title;

}
@property(nonatomic,copy) NSString *Alert_Message;
@property(nonatomic,copy) NSString *AlertBox_Title;

- (void)ShowSimpleAlertBox;
- (void)ShowOkCancelAlertBox;

@end

Function.m


#import "Function.h"

@implementation Functions

@synthesize Alert_Message;
@synthesize AlertBox_Title;

-(void) ShowOkCancelAlertBox
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:AlertBox_Title message:Alert_Message
delegate:self cancelButtonTitle:@"No" otherButtonTitles:@"Yes", nil];
[alert show];
[alert release];
}

-(void) ShowSimpleAlertBox
{

UIAlertView *alert= [[UIAlertView alloc] initWithTitle:AlertBox_Title
message:Alert_Message
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles: nil];
[alert show];
[alert release];

}

@end

iOS SMS Gönderimi

Uygulamadan çıkmadan SMS gönderim ekranını telefon numarası ve mesaj hazır bir şekilde göstermek için aşağıdaki kodu kullanabilirsiniz.

- (void) SMSContact {

NSString *SMSnumber = @"05001234567";
NSString *SMStext = @"Hello Sulubeyn";

Class smsClass = (NSClassFromString(@"MFMessageComposeViewController"));
if (smsClass != nil && [MFMessageComposeViewController canSendText]) {
MFMessageComposeViewController *controller = [[MFMessageComposeViewController alloc] init];
controller.body = SMStext;
controller.recipients = [NSArray arrayWithObject: SMSnumber];
controller.messageComposeDelegate = self;
[self presentModalViewController:controller animated:YES];
[controller release];

} else {
//Cihaz SMS desteklemiyorsa uyarı çıkartalım.
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"Cihaz SMS desteklemiyor!"
delegate:self cancelButtonTitle:nil otherButtonTitles:@"Tamam", nil];
alert.tag = 1;
[alert show];
[alert release];

}

}

Kullanıcının yaptığı işlemi kontrol etmek için aşağıdaki kodu kullanmamız gerekiyor.

- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result {

switch (result)
{
case MessageComposeResultCancelled:

NSLog(@"Sonuç: sms iptal edildi");
break;
case MessageComposeResultSent:
NSLog(@"Sonuç: sms gönderildi");
break;
case MessageComposeResultFailed:
NSLog(@"Sonuç: sms başarısız");
break;
default:
NSLog(@"Sonuç: sms gönderilmedi");
break;
}

//Statusbar kapalıysa bile görünebilir, bunu engellemek için bu kodu eklemekte fayda var.
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:NO];

//Viewi kapatıyoruz
[self dismissModalViewControllerAnimated:YES];

}

WP7 Rss Okuma

Merhabalar,

WP7 ile rss okuma ve ekran çıktısı alma işlemi üzerinde ufak bir uygulama geliştireceğiz.

Bu makaledem Rss’i bind etme ve ListBox Kontrolün DataItemTemplate özelliğini kullanacağız.

Öncelikle Yeni bir proje açıyoruz. Bu projemizde  Windows Phone Panaroma Application yerine Sadece Windows Phone Application Seçeneğini seçiyourz.


Uygulamamızı Oluşturdukdan sonra Rss okumak için gerekli olan referansımızı Refenrences’ e sağ tıklayarak Browse Seçeneğini seçiyoruz ve
Referans dosyamız %ProgramFiles%\Microsoft SDKs\Silverlight\v3.0\Libraries\Client\System.ServiceModel.Syndication.dll Dizini altında bulunmaktadır

Referansımızı ekledikten sonra Visual Studio Aşağıda görmüş olduğunuz uyarı mesajını verecektir. YES Tuşuna basıp Referansımızı ekliyoruz.



Evet Şu anda projemiz ve referans dosyamız hazır. Kod yazmaya geçmeden önce MainPage.xaml dosyamızı resimde görüldüğü gibi bir
button ve listbox atarak Title ve Page contentlerini isteğinize göre düzenleyerek ana ekranımızı oluşturabiliriz.

RssItem.cs

Yeni bir class dosyası oluşturup ismini RssItem.cs verelim. ve aşağıdaki kodu bu class dosyamızın içine yazalım.


        /// 
        /// Model
        /// 
        public class RssItem
        {
           /*
           
            *    
		   Amerikan Doları 
		   Alış:1.7860 TL ~ Satış:1.8000 TL 
		   http://kur.doviz.com/serbest-piyasa 
	         
            * 
            * */
            public RssItem(string title, string description, string Link)
            {

                Title = title;
                Description = description.Split('~');
                Url = Link;

            }

            public string Title { get; set; }
            public string[] Description { get; set; }
            public string Url { get; set; }


RssService.cs

RssItem Classımızı tetiklemek üzere kullanacağımız servis class dosyamızdır. Bu dosyayı aşağıdaki gibi modifiye ediyoruz.

public static class RssService
    {

     
        public static void GetRssItems(string rssFeed, Action> onGetRssItemsCompleted = null, Action onError = null, Action onFinally = null)
        {
            WebClient webClient = new WebClient();

            // Download Bitişini Register Ediyoruz

            webClient.OpenReadCompleted += delegate(object sender, OpenReadCompletedEventArgs e)
            {
                try
                {
                    // Error varmı varsa Rapor et
                    if (e.Error != null)
                    {
                        if (onError != null)
                        {
                            onError(e.Error);
                        }
                        return;
                    }

                    // Rss den gelen değerleri Modelimize Bind Ediyoruz
                    List rssItems = new List();
                    Stream stream = e.Result;
                    XmlReader response = XmlReader.Create(stream);
                    SyndicationFeed feeds = SyndicationFeed.Load(response);
                    foreach (SyndicationItem f in feeds.Items)
                    {
                        RssItem rssItem = new RssItem(f.Title.Text, f.Summary.Text.Trim(),  f.Links[0].Uri.AbsoluteUri);
                        rssItems.Add(rssItem);
                    }

                    // Callback complate 
                    if (onGetRssItemsCompleted != null)
                    {
                        onGetRssItemsCompleted(rssItems);
                    }
                }
                finally
                {
                    // Callback Bitti
                    if (onFinally != null)
                    {
                        onFinally();
                    }
                }
            };

            webClient.OpenReadAsync(new Uri(rssFeed));
        }
    }

Bu class dosyamızda ana Modelimizi Data Context modelimizi oluşturdur. Bundan sonra gelecek bütün datalarımızı bu Model vasıtası ile işleyerek RssItem olarak geri döndüreceğiz.

MainPage.xaml

Mainde bulunan Button üzerine çif tıklayarak yazmış olduğumuz Service Classını tetikletiyoruz.


            RssService.GetRssItems("http://www.doviz.com/servis/rss/doviz/serbest-piyasa",
                                   (items) => { list.ItemsSource = items; },
                                   (exception) => { MessageBox.Show(exception.Message); },
                                   null
        );

En son olarak

MainPage.xaml de bulunan ListBox kontrolümüze data bind edeceğimiz için önceden yazmış olduğumuz Data Model e göre Template uygulaması yapıyoruz.

  
                
                    
                        
                            
                                
                                
                                
                            
                            
                            
                            
                        
                    
                
            

Programımızın çalışma zamanı görüntüsü ise aşağıdaki gibi olacaktır.



Proje Dosyasını Buradan İndirebilirsiniz


Sulubeyn

WP7 Panaroma Uygulamalarına Giriş

Sulubeyn Teamden herkese merhaba. Teknolojinin ve geniş ekranlı 3g cihazların artışı ile beraber mobil piyasa bildiğiniz üzere baya kızışmış dahada kızışmaktadır. iOS,Android ve WP7 üzerinde kısa uygulamarak yaparak bloğumuz da ufak snippetlar, faydalı kodlar vermek üzere yola çıkmış bulunmakdayız. İlk konumuz WP7 üzerinde Panaroma uygulaması geliştirmek.

Vs 2010 kullanarak geliştirmeye başlıyoruz. (Sulubeyn Team de anlatılan makalelerde kurulum aşamaları yer almamaktadır. Kurulumların yapılmış olduğunu varsayıyoruz.)

Projemize uygun bir isim bulduktan sonra Ok ye basarak uygulamamız başlatılmış oluyor. Daha sonra karşımıza çıkan ekran alışık olduğumuz vs 2010 ide’si ile birebir aynı.Panaroma uygulamları içinde birden fazla sayfa bulunduran ve ListBox controllerle beraber hazır bir template şeklinde oluşturuluyor.

Listboxların özelliklerini Sağ kısımda bulunan Property ekranından değiştirmek mümkün.

Property ekranından standart template’imiz üzerinden değişikliklerimizi yaptıktan sonra biraz kod yazabiliriz.Öncelikle isterseniz standart olarak gelen SampleData/ Klasörü içindeki xaml dosyası ilede işlem yapmak mümkün . Ama klasik .net tecrübesi olan arkadaşlarım bildikleri yoldan şaşmayacaklardır. Biz normal olarak bir void içerisine kendi kodumuzu yazalım . ListBox itemlerimizi tek tek create edelim.


 Play (Run) tuşunda debug aşamasına geçtiğimiz anda WP7 de emulatör otomatik olarak açılacaktır. Kısa bir yükleme ardından Uygulamanız çalışacak ve eklemiş olduğunuz itemlar ilk view in içerisinde gözükecektir.



Property ekranından Listboxımızı seçip event tabına geçip ListBox_SelectionChanged eventini tetikliyoruz ki herhangi bir item a tıklandığında tepki verebilecek konuma gelsin programımız.

ListBoxItem lbi = ((sender as ListBox).SelectedItem as ListBoxItem);
MessageBox.Show(lbi.Content.ToString());

Kodlarını ListBox_SelectionChanged altına yazıyoruz.  Ve uygulamamızın bize bir mesaj yaratmasını istiyoruz.

Çok fazla kod yazmadan WP7 ve xaml nin sadece ide kısımı ile idaresi sonucunda ekrana mesaj basabilen bir listbox uygulaması yapmış bulunmaktayız. ListBox ve diğer kontrollerin uygulama zamanındaki diğer fonksiyonlarını bir dahaki makalelerimizde anlatacağız.

Sulubeyn.