SlideShare a Scribd company logo
1 of 88
iOS Programming
Objective C
Objective C, C’nin üzerine yazılmıs nesneye yönelik bir programlama dilidir. En yaygın kullanıldıgı alan
Cocoa çatısının kullanıldıgı yazılımlardır. Objective C, GCC ile derlenebilir. Objective C, 1980’li yıllarda
Brad Cox tarafından Stepstone adlı sirkette gelistirilmistir.
!
!
Cocoa Framework, nesneye yönelik program gelistirmeyi saglayan bir yapıdır.
!
!
GCC, çok çesitli programlama dillerini destekleyen bir derleyici sistemidir.
Objective C
Objective C, C diline yapılan cesitli eklentilerden olusmustur. C dilinden miras alınmayıp yeni eklenmis
bütün ön islemci direktifleri @ isareti ile baslar.
@interface ClassName : NSObject
@end
@implementation ClassName
@end
Objective C
Objective C dilinde sınıflar .h ve .m dosyaları olmak üzere iki dosyadan olusur.
.h dosyasında kodun tasarımını yaparız yani arayüz (interface) kısmını hazırlarız.
@interface ClassName : NSObject
/* Codes */
@end
.m dosyasında ise interface kısmında tanımladıgımız yapıları kullanarak kodumuzu yazıyoruz.
@implementation ClassName
/* Codes */
@end
Objective C
NSLog(@"Hello World");
Her dile baslarken oldugu gibi Objective C’ de de Hello World yazmayı ihmal etmedim tabiki :)
Degisken Tanımlamaları
NSString *name = @“Anıl”;
NSDate *today = [NSDate date];
BOOL *status = YES;
int *number = 4;
Objective C
Public - Private
.h dosyasında tanımladıgımız metotlarımız ve degiskenlerimiz public olarak görev görmektedir fakat
metotlarımızı ve degiskenlerimizi .m dosyasında tanımladıgımız takdirde private olarak çalısacaktır.
Property
Property, nesnelerin üye degiskenine erisimin nokta notasyonu (dot notation) ile olmasını saglar.
@property NSString *name;
Property olarak kullanılan nesnelere .m dosyasında ulasmak icin @synthesize etmek gerekir veya
degisken adının basına _ eklenerek kullanımı gerekmektedir.
@synthesize name;
_name;
Objective C
readwrite
Hem getter (okuma) hem de setter (yazma) tanımı icin kullanılır ve @synthesize kullanımı gerektirir.
readonly
Sadece getter tanımı icin kullanır.
assign
Hafıza yönetimiyle ilgili parametredir. Direk atama yapmayı saglar.
retain
Hafıza yönetimiyle ilgili parametredir. Direk atama yapmayı ve atanan nesnenin izinsiz silinmesini
engeller.
Objective C
copy
Hafıza yönetimiyle ilgili parametredir. Direk atma yapmayı, atanan nesnenin izinsiz silinmesini ve
degistirilmesini engeller.
atomic
Bu property thread - safe’tir. Multi thread uygulamalar icin uydundur. Aksi söylenmedikce bütün
property degiskenleri atomic olarak kabul edilir.
nonatomic
Multi thread bir uygulama kullanmayacagımız zamanlarda nonatomic olarak tanımlama yapabiliriz,
atomic olanlara göre daha hızlı calısmaktadır.
Objective C
synthesize
Property olarak tanımlanmıs bir degisken icin getter ve setter tanımlamalarına izin verir.
dynamic
Kendi getter ve setter metotlarımızı tanımlamamızı saglar.
Objective C
for
for(int i = 0; i < 10; i++){
/* Codes */
}
while
while(condition){
/* Codes */
}
Objective C
do - while
do{
/* Codes */
}while(condition);
if - else if - else
if(condition){
/* Codes */
} else if(expression){
/* Codes * /
} else{
/* Codes */
}
Objective C
Try - Catch - Finally
@try{
/* Codes */
}
@catch(NSException *exception){
/* Codes * /
}
@finally{
/* Codes */
}
Objective C
int *number = 4;
NSInteger *number = 4;
Primitive veri tiplerini tercih edebilecegimiz gibi bir de NSValue sınıfından türeyen NSInteger gibi
veri tiplerini de tercih edebiliriz. Özellikle performans gerektiren kısımlarda (döngüler vb.)
primitive tipler çok daha hızlı sonuc verir.
Objective C
nil
NSInteger *number = nil;
Herhangi bir nesneyi isaret etmeyen bos bir referans degiken tanımlamakta kullanılır.
NSString *name = nil;
Objective C
Selector
Tanımlı metotları temsil edebilen özel bir veri tipidir. Metot isimlerini ve aldıkları parametreleri tutar.
Performans artısını saglamak amacıyla tasarlanmıstır.
SEL *selector = @selector(methodName:);
/* Metot adının sonuna aldıgı parametre sayısı kadar : isareti eklenir. */
SEL *selector = @selector(methodName);
Objective C
Class Instance
ClassName *name = [ClassName alloc]init];
ClassName *name = [ClassName new];
* karakterinin kullanılma sebebi, Objective C’ de nesneler pointer referansları aracılıgılya islem yapar.
init metodu dolaylı yolda constructor islevi görmektedir.
[super init];
Sınıfımız baska bir sınıftan türediyse üst sınıfın üye degiskenlerinin ilk kullanıma hazırlanmasını saglar.
#import “ClassName.h” ile sınıfı kendi sınıfımıza dahil etmemiz saglanır.
Objective C
Methods
- (returnType) methodName;
- karakteri derleyeciye kendisinden sonra gelen metodun bir instance (nesne) metodu oldugunu söyler.
+ (returnType) methodName;
+ karakteri derleyeciye kendisinden sonra gelen metodun sınıfa ait bir metod oldugunu söyler.
- (returnType) methodName: (NSString *word);
Tek parametreli metot tanımlaması.
- (returnType) methodName: (NSString *word): (NSInteger *number);
Çok parametreli metot tanımlaması.
Objective C
Methods
ClassName *className = [ClassName alloc]init];
[className methodName];
Sınıfa ait olmayan bir metot tetiklenmesi.
[ClassName methodName];
Sınıfa ait olan bir metot tetiklenmesi.
alloc metodu, hafızadan yer ayrılmasını ve ayrılan hafıza alanının baslangıc adresini ilgili referans
degiskene atar.
init metodu, nesneye ilk deger ataması yapılmasını saglar. init metodunu override ederek kendi init
metodumuzu yazabiliriz. Bunu yaparken ilk basta [super init]; cagrısıyla üst sınıfın init metodunu
cagırmalıyız.
Objective C
Methods
- (id)init{
self = [super init];
if(self){
/* Codes */
}
return self;
}
self anahtar kelimesi aynı sınıf icerisindeki
metotların tetiklenmesini saglamak icin
kullanılmaktadır.
Objective C
Methods
- (id)dealloc{
[variable release];
[secondVariable release];
[super dealloc];
}
Calısma zamanında bir nesne ile kimsenin isi kalmadıgında otomatik olarak o nesne icin dealloc metodu
devreye girer. Bu metot sınıftaki tüm üye degiskenleri serbest bırakarak hafızada kapladıkları alanın geri
iade edilmesini saglar.
Objective C
Static Typing
ClassName *name = [ClassName alloc]init];
Dynamic Typing
id *object = [ClassName alloc]init];
id veri tipi, tüm Objective C sınıflarını temsil edebilen bir veri tipidir.
Objective C
NSObject Class Methods
- (BOOL) isKindOfClass: classObj;
Kendisine parametre olarak gelen sınıfın metodun bulundugu sınıfla aynı sınıf veya o sınıfın alt sınıfı olup
olmadıgını kontrol eder.
- (BOOL) isMemberOfClass: classObj;
Kendisine parametre olarak gelen sınıfın metodun bulundugu sınıfla aynı olup olmadıgını kontrol eder.
- (BOOL) respondsToSelector: selector;
Bir nesnenin belirli bir metoda cevap verip vermeyecegini kontrol eder. O nesnenin bulundugu sınıfla
birlikte alt sınıflarına da bakılır. Bu bir nesne metodudur dolayısıyla elimizde nesne olması gerekmektedir.
Objective C
NSObject Class Methods
+ (BOOL) instancesRespondToSelector: selector;
Sınıfın nesnelerinin kendisine parametre olarak gelen metoda karsılık verip vermeyecegini kontrol eder.
- (id) performSelector: selector;
Bir nesnenin belirli metodunu dolaylı yolda cagırmak icin kullanılır.
Objective C
Blocks
Bloklar metotlara benzer fakat çok önemli bir farkı bulunmaktadır; bloklar cagırıldıkları yerdeki diger
degiskenlere, bu degiskenler bloga parametre olarak gönderilmese bile direkt olarak erisim imkanı saglar.
^ returnType (parameters){
/* Codes */
}
Eger yerel bir degisken üzerindeki degisikliklerin bloklar tarafından algılanmasını istiyorsak bu degisken
tipinin onune __block ifadesini getirmeliyiz.
__block int number = 8;
Objective C
Arrays
C’ den miras alınan dizi yapısı Objective C’ de de kullanılabilir.
NSString *myArray[5];
myArray[4] = @“İstanbul”;
Objective C’ de kullanılan dizi sınıfı ise NSArray sınıfıdır. C dizilerinden farklı olarak boyut kontrolü yapar
ve dizinin eleman sayısından yüksek bir indeksteki veriye erisimi engeller. NSArray sınıfının bir baska
özelligi de dizi elemanlarının farklı sınıfıların nesneleri olabilmesidir. Dizi elemanlarından birinin tipi
NSString, bir digerininki NSDate olabilir.
/* Dizi olusturmayı saglar. */
NSArray *myArray = [NSArray array];
NSArray *myArray = [NSArray alloc]initWithObjects: @“İstanbul”, @“Ankara”, @“Sivas”, nil];
Objective C
Arrays
NSArray *myArray = [NSArray alloc]arrayWithObjects: @“İstanbul”, @“Ankara”, @“Sivas”, nil];
/* Parametre olarak verilen indisteki dizi elemanına ulasmayı saglar. */
NSString *city = [myArray objectAtIndex:0];
/* Dizinin eleman sayısını döndürür. */
int arrayCount = [myArray count];
Objective C
Mutable - Immutable
NSString, NSArray gibi isminde Mutable geçmeyen Foundation Framework sınıflarından olusan
degistirilemez (immutable) nesneler olarak bilinirler. Bu nesneler olusturulduktan sonra degerleri
üzerinde oynama yapılmasına izin verilmez. Bu nedenle yeni bir eleman eklemek istedigimizde nesne
üzerinde degisiklik yapılmasına izin verilmedigi icin yeni bir nesne olusturulur ve eski nesne silinir.
NSMutableArray gibi isminde Mutable geçenler ise nesne üzerinde oynama yapılmasına izin verirler.
Objective C
NSMutableArray
Eleman ekleme ve çıkarma islemleri yapmak istedigimiz diziler için NSMutableArray tercih ediyoruz.
NSMutableArray *myArray = [NSMutableArray alloc]arrayWithObjects: @“Cumhuriyet
Üniversitesi”, @“Bogazici Üniversitesi”, @“İstanbul Teknik Üniversitesi”, @“ODTÜ”,nil];
/* Eleman ekleme */
[myArray addObject: @“İstanbul Üniversitesi”];
/* Eleman çıkarma */
[myArray removeObject: @“İstanbul Üniversitesi”];
[myArray removeObjectAtIndex:1];
Objective C
NSDictionary - NSMutableDictionary
NSDictionary benzeri yapılar diger programlama dillerinde Dictionary veya Map olarak geçer.
NSDictionary’deki her bir eleman anahtar (key) - deger (value) olarak tutulmaktadır. Her bir anahtara
karsılık gelen bir deger bulunur. Elemanların anahtar degerleri birbirinden farklı olmak zorundadır fakat
farklı anahtarlara aynı degerler karsılık gelebilir.
NSMutableDictionary *telephoneCodes = [NSMutableDictionary dictionaryWithObjectsAndKeys:
@“İstanbul Anadolu”, @“216”, @“İstanbul Avrupa”, @“212”, @“Sivas”, @“346”,nil];
/* Elemana Ulasma */
NSLog(@“İstanbul Anadolu: %@”, [telephoneCodes objectForKey: @“216”]);
/* Eleman Ekleme*/
[telephoneCodes setObject: @“Ankara” forKey: @“312”];
/* Eleman Çıkarma*/
[telephoneCodes removeObjectForKey: @“312”];
/* Eleman Degerini Güncelleme*/
[telephoneCodes setValue: @“…” forKey: @“212”];
Objective C
NSSet
NSSet sayesinde matematiksel kümeler tanımlayabiliriz. Elemanların birbirini tekrar etmesine izin
verilmez.
/* cluster degiskeninin icerigi {A,E,B,Z,Y} olur. */
NSSet *cluster = [NSSet setWithObjects: @“A”, @“E”, @“B”, @“Z”, @“B”, @“A”, @“Y”, nil];
/* Kümede elemanın olup olmadıgını kontrol eder. */
BOOL result = [cluster containsObject: @“A”];
/* İki kümenin kesisim kontrolü */
BOOL result = [cluster intersectsSet: secondCluster];
/* İki kümenin denklik kontrolü */
if(cluster isEqualToSet: secondCluster == YES){
NSLog(@“İki küme birbirine denktir.”);
}
Objective C
NSMutableSet
/* Eleman Ekleme */
[cluster addObject: @“C”];
/* Eleman Çıkarma */
[cluster removeObject: @“C”];
/* İki kümenin bilesimini bulur ve cluster’a yazar. */
[cluster unionSet: secondCluster];
/* İki kümenin kesisimini bulur ve cluster’a yazar. */
[cluster intersectSet: secondCluster];
/* İki kümenin farkını bulur ve cluster’a yazar. */
[cluster minusSet: secondCluster];
Objective C
NSCountedSet
İsminde Mutable ifadesi geçmemesine ragmen Mutable yapıdadır. NSSet sınıfına benzerlik gösterir, tek
farkı kümeye bir eleman eklendiginde o eleman için tutulan sayaç degerini artırır ve elemanların tekrar
etmesine izin vermez.
NSCountedSet *countSet = [NSCountedSet setWithObjects: @“A”, nil];
/* Herhangi bir eleman için tutulan sayaç degerine ulaşma */
unsigned long aCount = [countSet countForObject: @“A”];
Objective C
NSData - NSMutableData
NSData sınıfı herhangi bir nesnenin, dosyanın, videonun verisini tutacak sekilde tasarlanmıstır.
Herhangi bir nesnenin degerini byte cinsinden NSData veya NSMutableData nesnelerine
kopyalayabiliriz. NSData ile NSMutableData’nın tek farkı birincisi statik, ikincisi dinamik yapıda
olmasıdır. NSData dosya, resim ve video islemlerinde ilgili dosyanın verisini tutmak için sıklıkla
kullanılır.
char *characters = “Hello World”;
NSData *data = [NSData dataWithBytes: characters length: strlen(characters)];
Objective C
NSString - NSMutableString
NSMutableString, NSString sınıfının degistirilebilir versiyonudur.
/* Var olan bir karakter dizisinden yeni bir karakter dizisi olusturur. */
NSString *newWord = [NSString stringWithString: word];
/* Karakter dizisini kendisine verilen formata ve parametrelere göre olusturma */
NSString *cityCount = [NSString stringWithFormat: @“Türkiye’de %d il vardır.”, 81];
/* Karakter dizisinin uzunlugunu bulma */
int charLength = [cityCount length];
Objective C
NSNumber
int veya float gibi primitive sayısal degerleri NSArray veya NSDictionary gibi bir koleksiyonda
depolayabilmek için, o sayısal degeri ilk önce NSNumber sınıfının bir nesnesine çevirmemiz
gerekmektedir.
/* NSNumber nesnesine dönüstürme */
int number = 1907;
float secondNumber = 19.07;
NSNumber *intNumber = [NSNumber numberWithInt: number];
NSNumber *floatNumber = [NSNumber numberWithFloat: secondNumber];
/* Primitive tipe dönüstürme */
int number = [intNumber intValue];
float secondNumber = [floatNumber floatValue];
Objective C
NSDate
/* Şu anki tarih */
NSDate *now = [NSDate date];
/* Bes saniye sonraki tarih */
sleep(5);
NSDate *fiveSecondsLater = [NSDate date];
/* Erken tarihi bulma */
NSDate *early = [now earlierDate: fiveSecondsLater];
/* Geç tarihi bulma */
NSDate *late = [now laterDate: fiveSecondsLater];
iOS
iOS
Apple, IDE (Integrated Development Environment) olarak sadece Mac OS X isletim sisteminde calısan
Xcode yazılım gelistirme platformunu tercih etmektedir. Xcode; iPhone, iPad ve Apple bilgisayarlarda
calısmak üzere Mac OS X uyumlu programlar gelistirmemizi saglar.
iOS
Create a new Xcode project seçeneği ile yeni bir Xcode projesi olusturuyoruz.
iOS
Single View Application seçeneği ile olusturacagımız projenin tipini belirliyoruz.
iOS
iOS
Projeyi olusturdugumuz da olusan dosyaların genel görünümü
iOS
Delegate Methods
Delegate metotlar, kullandıgımız sınıfların .h dosyalarına dahil edilir. Delegate metotlar içerisinde
protokolleri bulundurur. Protokoller diger programlama dillerindeki interface kavramına karsılık
gelmektedir. Protokoller sayesinde sınıfımıza kurallar koyarak daha düzenli bir isleyis saglayabiliriz.
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@end
@protocol UIApplicationDelegate<NSObject>
@required
/* Methods */
@optional
/* Methods */
@end
iOS
AppDelegate (Application Delegate), uygulamamızı temsil eden sınıftır.
- (BOOL) application: (UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary
*)launchOptions
Uygulama çalıstıktan sonra gerekli ayarlamalar yapıldıgında bu delegate metodu çalısmaktadır.
- (void) applicationWillResignActive: (UIApplication *)application
Uygulama aktif durumdan inaktif duruma gectiginde bu delegate metodu calısmaktadır.
- (void) applicationDidEnterBackground: (UIApplication *)application
Uygulama arka plana düstügünde bu delegate metodu calısmaktadır.
iOS
- (void) applicationWillEnterForeground: (UIApplication *)application
Uygulama arka planda inaktif durumdayken cagırılır ve yeniden aktif duruma gelmesi istenir ise bu
delegate metodu çalısmaktadır.
- (void) applicationDidBecomeActive: (UIApplication *)application
Uygulama aktif duruma geldiginde bu delegate metodu çalısmaktadır.
- (void) applicationWillTerminate: (UIApplication *)application
Uygulama sonlandırılmak istenir ise bu delegate metodu çalısmaktadır.
iOS
Storyboard, bizim uygulamamızın tasarımını gelistirdigimiz ve yönettigimiz kısımdır.
iOS
Storyboard’ un içerisinde kullanabilecegimiz görsel komponentler;
iOS
Storyboard’ un içerisinde kullanabilecegimiz görsel komponentler;
iOS
Storyboard’ un içerisinde kullanabilecegimiz görsel komponentler;
iOS
ViewController, uygulamamıza ekledigimiz ViewController’ların yönetilmesini saglayan sınıflardır.
- (void) viewDidLoad
ViewController’ın görünümü yüklendiginde bu metot calısmaktadır.
- (void) didReceiveMemoryWarning
Uygulama memory (hafıza) uyarısı verdiginde bu metot calısmaktadır.
iOS
IBAction - IBOutlet
/* ViewController.h */
@property (weak, nonatomic) IBOutlet UILabel *myLabel;
- (IBAction)print: (id)sender;
/* ViewController.m */
@synthesize myLabel;
- (IBAction)print: (id)sender{
myLabel.text = @“CÜ Bilgisayar Mühendisligi”;
}
iOS
UITableView
iOS
UITableView
UITableView komponentimizin DataSource ve Delegate özelliklerini ViewController sınıfımıza baglıyoruz,
bunu yapmadıgımız takdirde verilerimiz UITableView komponentimizde listelenmeyecektir.
Son olarak her bir satır için prototip
olusturuyoru ve bu prototipe bir tanımlayıcı
veriyoruz.
iOS
UITableView
/* ViewController.h */
@interface ViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>
@property NSArray *myArray;
@end
/* ViewController.m */
@synthesize myArray;
- (UITableViewCell *)tableView: (UITableView *)tableView: cellForRowAtIndexPath: (NSIndexPath
*)indexPath{
static NSString *cellIdentifier = @“MyCell”;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: cellIdentifier
forIndexPath: indexPath];
cell.textLabel.text = [myArray objectAtIndex: indexPath.row];
return cell;
}
iOS
UITableView
/* ViewController.m */
@synthesize myArray;
- (NSInteger *)tableView: (UITableView *)tableView: numberOfRowsInSection: (NSInteger
*)section{
return [myArray count];
}
- (NSInteger *)numberOfSectionsInTableView: (UITableView *)tableView{
return 1;
}
- (void)viewDidLoad{
[super viewDidLoad];
myArray = [NSArray arrayWithObjects: @“İstanbul”, @“Sivas”, @“Ankara”, nil];
}
iOS
UITableView
iOS
Segue
Segue dedigimiz gecis yapıları sayesinde ViewController’lar arasında gecis yapabiliriz, bunu yaparken
animasyon ekleyebilir ve bulundugumuz ViewController’dan gecis yapacagımızı ViewController’a data
aktarımı yapabiliriz.
Storyboard üzerinden bulundugumuz ViewController’a kntrl tusu ile basılı
tutup, gecis yapılmasını istedigimiz ViewController’a bırakıp Segue islemini
gerceklestirebiliriz. Bunun sonucunda karsımıza gelen 3 secenekten bize
uygun olanı tercih ederiz.
iOS
Changing ViewController Programmatically
Storyboard üzerinden ikinci ViewController’ı ekliyoruz ve ayırıcı
olması icin Storyboard ID’sini belirliyoruz.
/* ViewController.h */
#import “SecondViewController.h”
@interface ViewController : UIViewController
- (IBAction)changeController: (id)sender;
@end
iOS
Changing ViewController Programmatically
/* ViewController.m */
@interface ViewController (){
SecondViewController *secondViewController;
}
@end
@implementation ViewController
- (IBAction)changeController: (id)sender{
secondViewController = [self.storyboard instantiateViewControllerWithIdentifier:
@“secondViewController”];
[self presentViewController: secondViewController animated: YES completion: nil];
}
@end
iOS
UIAlertView
/* ViewController.m */
@implementation ViewController
- (void)viewDidLoad{
[super viewDidLoad];
UIAlertView *alertView = [UIAlertView alloc]initWithTitle: @“CÜ Bilgisayar Mühendisligi”
message: @“Anıl SÖZERİ” delegate: self cancelButtonTittle: @“Tamam” otherButtonTitles: nil];
[alertView show];
@end
iOS
UIWebView
/* InfoViewController.m */
@implementation ViewController
@synthesize myWebView;
- (void)viewDidLoad{
[super viewDidLoad];
NSURL *url = [NSURL alloc]initWithString: @“http://
www.cumhuriyet.edu.tr”];
NSURLRequest *request = [NSURLRequest
alloc]initWithURL: url];
[myWebView loadRequest: request];
@end
iOS
NSThread
/* ViewController.m */
@implementation ViewController
- (void)viewDidLoad{
[super viewDidLoad];
sleep(5);
[NSThread sleepForTimeInterval: 5];
NSThread *thread = [NSThread alloc]initWithTarget: self selector: @selector(methodName)
object: nil];
[thread start];
[thread cancel];
[thread isExecuting];
@end
iOS
NSUserDefaults
/* ViewController.h */
@interface ViewController : UIViewController
@property NSUserDefaults *userInfo;
@end
/* ViewController.m */
@implementation ViewController
@synthesize userInfo;
- (void)viewDidLoad{
[super viewDidLoad];
userInfo = [NSUserDefaults standardUserDefaults];
@end
NSUserDefaults sınıfı ile kullanıcı ile ilgili bilgileri tutabiliriz örnek vermemiz gerekirse kullanıcı adı ve
sifre girilen bir uygulamada beni hatırla özelligi eklemek istersek bu sınıftan yararlanabiliriz.
iOS
NSUserDefaults
/* NSUserDefaults obje ekleme */
[userInfo setInteger: 2 forKey: @“dataCount”];
[userInfo setObject: className forKey: @“classInstance”];
[userInfo synchronize];
!
/* NSUserDefaults obje alma */
[userInfo objectForKey: @“classInstance”];
[userInfo integerForKey: @“dataCount”];
iOS
NSNotificationCenter
/* ViewController.m */
[[NSNotificationCenter defaultCenter] postNotificationName: @“notificationName” object: nil];
!
/* Olusturdugumuz bir NSDictionary ile parametre de aktarabiliriz. */
NSMutableDictionary *myDictionary = [NSMutableDictionary dictionary];
[myDictionary setObject: data forKey: @“notificationData”];
[[NSNotificationCenter defaultCenter] postNotificationName: @“notificationName” object: nil
userInfo: myDictionary];
NSNotificationCenter sınıfı ile baska sınıflarımıza data aktarımını saglayabiliriz. Notification’ı sınıfımızdan
yolladıktan sonra sadece tetikletecegimiz sınıfta Notification’ı dinlememiz gerekmektedir.
iOS
NSNotificationCenter
/* AnotherViewController.m */
/* Notification’ı diger ViewController’ımızdan karsılıyoruz. */
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(methodName) name:
@“notificationName” object: nil];
!
/* userInfo ile gönderilen datayı karsılama */
- (returnType)methodName: (NSNotification *)notification{
NSDictionary *myDictionary = notification.userInfo;
}
iOS
UILocalNotification
/* ViewController.m */
- (void)viewDidLoad{
[super viewDidLoad];
UILocalNotification *notification = [UILocalNotification alloc]init];
notification.timeZone = [NSTimeZone defaultTimeZone];
notification.alertBody = @“Anıl SÖZERİ”;
notification.soundName = UILocalNotificationDefaultSoundName;
[UIApplication sharedApplication] presentLocalNotificationNow: notification];
}
UILocalNotification ile kullanıcıya bilgi verme amaçlı olarak mesaj
gönderebiliriz.
XML
XML Nedir?
eXtensible Markup Language, hem insanlar hem de bilgi islem sistemleri tarafından kolayca okunabilecek
dokümanlar olusturmaya yarayan W3C (WWW, World Wide Web Consortium) tarafından tanımlanmıs bir
standarttır.
!
Bu özelligi ile veri saklamanın yanında farklı sistemler arasında veri alısverisi yapmayı saglayan bir ara
format görevi de görür.
!
XML, HTML’ in de tasarımcısı olan Tim Berners Lee’ dir. Dilin düzenlenmesi W3C’ nin sorumlulugundadır.
iOS
NSXMLParser
NSXMLParser sınıfı XML datamızı <tagname> XML taglarına göre parcalara ayırıp bizim ihtiyacımız olan
datayı kullanmamızı saglar.
/* ViewController.h */
@interface ViewController : UIViewController <NSXMLParserDelegate>
@property NSXMLParser *parser;
@end
/* ViewController.m */
@implementation ViewController
/* Parse islemi basladıgında bu metot calısır. */
- (void)parserDidStartDocument: (NSXMLParser *)parser;
@end
iOS
NSXMLParser
/* ViewController.m */
@implementation ViewController
/* XML elementlerinin parse islemi basladıgında bu metot calısır. */
- (void)parser: (NSXMLParser *)parser didStartElement: (NSString *)elementName
namespaceURI: (NSString *)namespaceURI qualifiedName: (NSString *)qName attributes:
(NSDictionary *)attributeDict;
/* XML elementlerinin parse islemi bittiginde bu metot calısır. */
- (void)parser: (NSXMLParser *)parser didEndElement: (NSString *)elementName
namespaceURI: (NSString *)namespaceURI qualifiedName: (NSString *)qName;
/* XML elementlerinin parse isleminde karakterler bulundugunda bu metot calısır. */
- (void)parser: (NSXMLParser *)parser foundCharacters: (NSString *)string;
@end
iOS
Creating XML
/* XML Olusturma, Server’ a baglandıgımızda çevrimiçi oldugumuzu bildiren XML örnegi. */
XMPPPresence *presence = [XMPPPresence presence];
NSXMLElement *status = [NSXMLElement elementWithName:@“status”];
[status setStringValue:@“Çevrimiçi”];
[presence addChild: status];
NSLog(@“%@”, [presence XMLString]);
!
/* Ekran Çıktısı */
<presence>
<status>Çevrimiçi</status>
</presence>
Base64
Base64 Nedir?
Base64, Binary data (ikili veri)’ ların sadece ASCII karakterlerini kullanan ortamlara iletilmesini ve
saklanmasını saglayan bir kodlama semasıdır.
!
Base64 kodlamasının uzunlugu daimi olarak 4’ ün katları seklindedir. 4’ ün katı olmayan hiçbir veri geçerli
bir Base64 verisi degildir. 4’ ün katı degilse gerektigi kadar = isareti sonuna eklenir. Kodlanmıs veri
orjinal haline göre %33 oranında büyür.
!
ASCII, Latin alfabesi üzerine kurulu 7 bitlik bir karakter setidir.
iOS
Base64 Encode && Decode
/* ViewController.h */
@interface ViewController : UIViewController
- (NSString *)base64Encode: (NSString *)string;
- (NSString *)base64Decode: (NSString *)string;
@end
/* ViewController.m */
@implementation ViewController
- (void)viewDidLoad{
[super viewDidLoad];
NSString *name = @“Anıl SÖZERİ”;
NSString *base64Name = [self base64Encode: name];
}
@end
iOS
Base64 Encode && Decode
/* ViewController.m */
@implementation ViewController
- (NSString *)base64Encode: (NSString *)string{
NSString *base64String = [[string dataUsingEncoding: NSUTF8StringEncoding]
base64EncodedStringWithOptions:0];
return base64String;
}
- (NSString *)base64Decode: (NSString *)string{
NSData *decodedData = [[NSData alloc]initWithBase64EncodingString: string options:
NSDataBase64DecodingIgnoreUnknownCharacters];
NSString *decodeString = [NSString alloc]initWithData: decodedData encoding:
NSUTF8StringEncoding];
return decodeString;
@end
JSON
JSON Nedir?
JSON (JavaScript Object Notation), insanlar tarafından okunabilen bir veri degisim biçimidir. XML’ in
JavaScript ile çokta iyi kullanılmamasından ötürü tercih edilir. Klasik DOM agaçlarından farksız bir yapıya
sahiptir.
!
DOM (Document Object Model), İnternet tarayıcıları girilen internet sayfasındaki tüm elemanları nesne
olarak kabul eder. DOM sayfa içerisindeki herhangi bir nesneye müdahale edebilmemize olanak verir. Bunu
yapabilmek için JavaScript gibi bazı script dilleri kullanmak gerekmektedir.
iOS
NSJSONSerialization
/* ViewController.h */
@interface ViewController : UIViewController
@property NSMutableDictionary *JSONDictionary;
@property NSData *JSONData;
@property NSString *name;
@property NSString *university;
@end
/* ViewController.m */
@implementation ViewController
- (void)viewDidLoad{
[super viewDidLoad];
[self createJSONData];
[self getJSONData];
}
@end
/* ViewController.m */
/* JSON Datası olusturmayı saglar. */
@implementation ViewController
- (void)createJSONData{
[JSONDictionary setObject:@“Anıl SÖZERİ” forKey:@“name”];
[JSONDictionary setObject:@“Cumhuriyet Üniversitesi” forKey:@“university”];
NSError *error;
JSONData = [NSJSONSerialization dataWithJSONObject: JSONObject options: 0 error:
&error];
NSString *JSONString = [NSString alloc]initWithData: JSONData
encoding: NSUTF8StringEncoding];
NSLog(@“JSON Data %@”, JSONString);
}
@end
iOS
NSJSONSerialization
/* ViewController.m */
/* Gelen JSON Datasına göre verileri çekmeyi saglar. */
@implementation ViewController
- (void)getJSONData{
NSError *error;
NSDictionary *JSONDictionary = [NSJSONSerialization JSONObjectWithData: JSONData
options: 0 error: &error];
name = (NSString *) [JSONDictionary valueForKey: @“name”];
university = (NSString *) [JSONDictionary valueForKey: @“university”];
NSLog(@“Name: %@”, name);
NSLog(@“University: %@”, university);
}
@end
iOS
NSJSONSerialization
XMPP
XMPP Nedir?
eXtensible Messaging and Presence Protocol, İnternetteki iki ucun herhangi bir yapısal bilgiyi karsılıklı ve
neredeyse es zamanlı olarak aktarmalarına olanak saglayan açık bir XML protokolü ve teknolojisidir.
!
Avantajları;
!
- XMPP protokolleri açık ve özgürdür.
- Standarttır.
- Kendini ispatlamıstır ve birçok gelistiricisi bulunmaktadır.
- Merkezi degildir, herhangi bir sunucu isletebilir.
- Güvenlidir.
- Genisletilebilirdir, XML’ den faydalanarak kendi fonksiyonlarımızı ekleyebiliriz.
- Esnektir, mesajlasmanın ötesinde ag yönetmek, dosya paylasımı, oyun oynamak icin kullanılabilir.
iOS
XMPPFramework
XMPPFramework, XMPP yapısının Mac OS X ve iOS platformundaki kütüphanesidir. Bu kütüphane
Robbie Hanson tarafından gelistirilmistir ve hala da gelistirilmektedir.
!
https://github.com/robbiehanson/XMPPFramework
iOS
XMPPStream
XMPPStream sınıfı, XMPPFramework’ün en temel yapısı, eklentiler ve özel yapıdaki kodları içerir. Aynı
zamanda XMPPParser sınıfını da kendi içerisinde barındırır.
!
XMPPJID sınıfı, degismez id saglayıcıdır.
!
XMPPStream sınıfından xmppStream adında bir adet instance olusturdugumuzu varsayalım;
!
/* Baglanılacak olan Server’ın host name yani adresini belirliyoruz. */
xmppStream.hostName = @“127.0.0.1”;
!
/* Baglanılacak olan Server’ın host port numarasını belirliyoruz. XMPP default degeri 5222’dir. */
xmppStream.hostPort = 5222;
!
/* XMPP Socket yapısının arkaplanda çalısmasını saglamak için aktif hale getiriyoruz. */
xmppStream.enableBackgroundingOnSocket = YES;
iOS
XMPPStream
/* XMPPStream Sunucu Baglantısının Gerçeklestirilmesi */
NSError *error;
!
if(![xmppStream connectWithTimeout: XMPPStreamTimeoutNone error: &error]){
NSLog(@“Baglantı Hatası”);
return NO;
}
NSLog(@“Baglantı Saglandı.”);
return YES;
!
!
/* Baglantı Durumunun Ögrenilmesi */
!
if([xmppStream isConnected]){
/* Baglantı gerceklesti ise */
}
!
if([xmppStream isDisconnected]){
/* Baglantı sonlandı ise */
}
iOS
XMPPStream
/* XMPPStream Sunucu Baglantısının Gerçeklestirilmesinin Ardından Kimlik Dogrulaması İslemi */
NSError *error;
!
if(![xmppStream authenticateWithPassword: myPassword error: &error]){
NSLog(@“Kimlik Dogrulama Hatası”);
return NO;
}
return YES;
XMPPReconnect
XMPPReconnect sınıfı, Baglantı kazara koptugunda yeniden baglantının gerceklesmesini saglayan
XMPPFramework sınıfıdır.
!
/* XMPPReconnect sınıfını aktif hale getirme. */
XMPPReconnect *xmppReconnect = [XMPPReconnect alloc]init];
[xmppReconnect activate:xmppStream];
iOS
XMPPStream Delegate Methods
/* Mesaj geldiginde tetiklenen delegate metodu */
- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message{
/* Codes */
}
!
/* Presence paketi geldiginde tetiklenen delegate metodu */
- (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence{
/* Codes */
}
!
/* IQ (Info/Query) paketi geldiginde tetiklenen delegate metodu */
- (void)xmppStream:(XMPPStream *)sender didReceiveIQ:(XMPPIQ *)iq{
/* Codes */
}
iOS
XMPPStream Delegate Methods
/* Baglantı saglandıgında tetiklenen delegate metodu */
- (void)xmppStreamDidConnect:(XMPPStream *)sender{
/* Codes */
}
!
/* Baglantı sonlandıgında tetiklenen delegate metodu */
- (void)xmppStreamDidDisconnect:(XMPPStream *)sender withError:(NSError *)error{
/* Codes */
}
!
/* Kimlik Dogrulama islemi tamamlandıgında tetiklenen delegate metodu */
- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender{
/* Codes */
}
!
/* Kimlik Dogrulama islemi tamamlanamadıgında tetiklenen delegate metodu */
- (void)xmppStreamDidNotAuthenticate:(NSXMLElement *)error{
/* Codes */
}
iOS
XMPPPresence
XMPPPresence sınıfı, kullanıcıların Server üzerinde çevrimiçi, mesgul, dısarıda vb. olma durumlarını
yöneten XMPPFramework sınıfıdır.
!
/* XML Olusturma, Server’ a baglandıgımızda çevrimiçi oldugumuzu bildiren XML örnegi. */
XMPPPresence *presence = [XMPPPresence presence];
NSXMLElement *status = [NSXMLElement elementWithName:@“status”];
[status setStringValue:@“Çevrimiçi”];
[presence addChild: status];
/* XMPPStream sınıfının sendElement metodu sayesinde paketlerin Server’ a gönderimi saglanır.*/
[xmppStream sendElement:presence];
!
/* Ekran Çıktısı */
<presence>
<status>Çevrimiçi</status>
</presence>
iOS
XMPPIQ
XMPPIQ sınıfı, Info/Query yani Server’ dan bilgi almamızı saglayan XMPPFramework sınıfıdır.
!
IQ paketlerinin altında gelen Ping paketleri bulunmaktadır. Bu paket Server’ dan bize gönderilerek
“Burada mısın?” tarzında bir mesaj verdigini düsünebiliriz. Biz de “Buradayım.” mesajı vermek için Ping
paketine cevap olarak bizimde Server’ a Ping paketi yollamamız gerekmektedir.
!
Ayrıca yine IQ paketlerinin altında gelen Roster paketleri de bulunmaktadır. Bu paket ise Server’ da kayıtlı
olan kullanıcıların bilgilerinin bize gelmesini saglamaktadır. Örnegin; kisi listesinde görüntüleyecegimiz
kisiler bu paketin icerisinde gelmektedir.
!
Bunların dısında bir de Custom IQ dedigimiz yapılar vardır. Custom IQ paketleri ise daha önce
bahsettigimiz gibi XMPP yapısı genisletilebilir bir yapı oldugundan dolayı kendi düzenlemelerimizi
yapmamıza olanak verir. Bizim kendi ekledigimiz XML yapıları sayesinde server ile Custom IQ paketi
alısverisini gerçeklestirebiliriz.
iOS
XMPPMessage
XMPPMessage sınıfı, mesajlasma islemlerini yöneten XMPPFramework sınıfıdır.
!
Message paketi haricinde ayrıca Composing paketi dedigimiz kullanıcıya “Yazıyor..” bilgisini veren pakette
Message paketinin altında bulunmaktadır.
!
/* Mesajın içeriginde ne oldugunu gösterir. */
[message body];
!
/* Mesajın kimden geldigini gösterir. */
[message from];
!
/* Mesajın kime gidecegini gösterir. */
[message to];

More Related Content

What's hot

7. kalıtım
7. kalıtım7. kalıtım
7. kalıtımkarmuhtam
 
1. nesneye dayalı programlama giriş
1. nesneye dayalı programlama   giriş1. nesneye dayalı programlama   giriş
1. nesneye dayalı programlama girişkarmuhtam
 
Ileri seviye javascript by Azer Koculu
Ileri seviye javascript by Azer KoculuIleri seviye javascript by Azer Koculu
Ileri seviye javascript by Azer Koculumustafa sarac
 
6. this işaretçisi ve arkadaşlık
6. this işaretçisi ve arkadaşlık6. this işaretçisi ve arkadaşlık
6. this işaretçisi ve arkadaşlıkkarmuhtam
 
9. şablonlar
9. şablonlar9. şablonlar
9. şablonlarkarmuhtam
 

What's hot (9)

7. kalıtım
7. kalıtım7. kalıtım
7. kalıtım
 
1. nesneye dayalı programlama giriş
1. nesneye dayalı programlama   giriş1. nesneye dayalı programlama   giriş
1. nesneye dayalı programlama giriş
 
Ileri seviye javascript by Azer Koculu
Ileri seviye javascript by Azer KoculuIleri seviye javascript by Azer Koculu
Ileri seviye javascript by Azer Koculu
 
Extjs 4 education
Extjs 4 educationExtjs 4 education
Extjs 4 education
 
6. this işaretçisi ve arkadaşlık
6. this işaretçisi ve arkadaşlık6. this işaretçisi ve arkadaşlık
6. this işaretçisi ve arkadaşlık
 
Typescript
TypescriptTypescript
Typescript
 
9. şablonlar
9. şablonlar9. şablonlar
9. şablonlar
 
Sunu algo02
Sunu algo02Sunu algo02
Sunu algo02
 
Java OOP
Java OOPJava OOP
Java OOP
 

Similar to Introduction to iOS Programming && About XMPPFramework

C++ cevaplari
C++ cevaplariC++ cevaplari
C++ cevaplarisersld29
 
Introduction to Android Programming
Introduction to Android ProgrammingIntroduction to Android Programming
Introduction to Android ProgrammingAnıl Sözeri
 
C++ ornegi
C++ ornegiC++ ornegi
C++ ornegisersld30
 
C++ ornekleri
C++ ornekleriC++ ornekleri
C++ orneklerisersld30
 
C++ ogretmeni
C++ ogretmeniC++ ogretmeni
C++ ogretmenisersld30
 
C++ dokumani
C++ dokumaniC++ dokumani
C++ dokumanisersld29
 
C++ egitimi-catalca
C++ egitimi-catalcaC++ egitimi-catalca
C++ egitimi-catalcasersld29
 
BilgeAdam Nesne Yönelimli Programlama
BilgeAdam Nesne Yönelimli ProgramlamaBilgeAdam Nesne Yönelimli Programlama
BilgeAdam Nesne Yönelimli ProgramlamaSinan Bozkuş
 
C++ hocasi
C++ hocasiC++ hocasi
C++ hocasisersld30
 
C++ egitmeni
C++ egitmeniC++ egitmeni
C++ egitmenisersld29
 
C++ semineri
C++ semineriC++ semineri
C++ seminerisersld30
 
Android'e Giriş Eğitimleri 1_2
Android'e Giriş Eğitimleri 1_2Android'e Giriş Eğitimleri 1_2
Android'e Giriş Eğitimleri 1_2Univerist
 
C++ egitimi-avcilar
C++ egitimi-avcilarC++ egitimi-avcilar
C++ egitimi-avcilarsersld29
 

Similar to Introduction to iOS Programming && About XMPPFramework (20)

C++ cevaplari
C++ cevaplariC++ cevaplari
C++ cevaplari
 
Introduction to Android Programming
Introduction to Android ProgrammingIntroduction to Android Programming
Introduction to Android Programming
 
Base presentation
Base presentationBase presentation
Base presentation
 
C++ odevi
C++ odeviC++ odevi
C++ odevi
 
C++ ornegi
C++ ornegiC++ ornegi
C++ ornegi
 
C++ ornek
C++ ornekC++ ornek
C++ ornek
 
C++ ornekleri
C++ ornekleriC++ ornekleri
C++ ornekleri
 
C++ ogretmeni
C++ ogretmeniC++ ogretmeni
C++ ogretmeni
 
C++ dokumani
C++ dokumaniC++ dokumani
C++ dokumani
 
C++ egitimi-catalca
C++ egitimi-catalcaC++ egitimi-catalca
C++ egitimi-catalca
 
BilgeAdam Nesne Yönelimli Programlama
BilgeAdam Nesne Yönelimli ProgramlamaBilgeAdam Nesne Yönelimli Programlama
BilgeAdam Nesne Yönelimli Programlama
 
C++ okulu
C++ okuluC++ okulu
C++ okulu
 
C++ hocasi
C++ hocasiC++ hocasi
C++ hocasi
 
C++ egitmeni
C++ egitmeniC++ egitmeni
C++ egitmeni
 
C odevi
C odeviC odevi
C odevi
 
C# OOP
C# OOPC# OOP
C# OOP
 
C ornegi
C ornegiC ornegi
C ornegi
 
C++ semineri
C++ semineriC++ semineri
C++ semineri
 
Android'e Giriş Eğitimleri 1_2
Android'e Giriş Eğitimleri 1_2Android'e Giriş Eğitimleri 1_2
Android'e Giriş Eğitimleri 1_2
 
C++ egitimi-avcilar
C++ egitimi-avcilarC++ egitimi-avcilar
C++ egitimi-avcilar
 

Introduction to iOS Programming && About XMPPFramework

  • 2. Objective C Objective C, C’nin üzerine yazılmıs nesneye yönelik bir programlama dilidir. En yaygın kullanıldıgı alan Cocoa çatısının kullanıldıgı yazılımlardır. Objective C, GCC ile derlenebilir. Objective C, 1980’li yıllarda Brad Cox tarafından Stepstone adlı sirkette gelistirilmistir. ! ! Cocoa Framework, nesneye yönelik program gelistirmeyi saglayan bir yapıdır. ! ! GCC, çok çesitli programlama dillerini destekleyen bir derleyici sistemidir.
  • 3. Objective C Objective C, C diline yapılan cesitli eklentilerden olusmustur. C dilinden miras alınmayıp yeni eklenmis bütün ön islemci direktifleri @ isareti ile baslar. @interface ClassName : NSObject @end @implementation ClassName @end
  • 4. Objective C Objective C dilinde sınıflar .h ve .m dosyaları olmak üzere iki dosyadan olusur. .h dosyasında kodun tasarımını yaparız yani arayüz (interface) kısmını hazırlarız. @interface ClassName : NSObject /* Codes */ @end .m dosyasında ise interface kısmında tanımladıgımız yapıları kullanarak kodumuzu yazıyoruz. @implementation ClassName /* Codes */ @end
  • 5. Objective C NSLog(@"Hello World"); Her dile baslarken oldugu gibi Objective C’ de de Hello World yazmayı ihmal etmedim tabiki :) Degisken Tanımlamaları NSString *name = @“Anıl”; NSDate *today = [NSDate date]; BOOL *status = YES; int *number = 4;
  • 6. Objective C Public - Private .h dosyasında tanımladıgımız metotlarımız ve degiskenlerimiz public olarak görev görmektedir fakat metotlarımızı ve degiskenlerimizi .m dosyasında tanımladıgımız takdirde private olarak çalısacaktır. Property Property, nesnelerin üye degiskenine erisimin nokta notasyonu (dot notation) ile olmasını saglar. @property NSString *name; Property olarak kullanılan nesnelere .m dosyasında ulasmak icin @synthesize etmek gerekir veya degisken adının basına _ eklenerek kullanımı gerekmektedir. @synthesize name; _name;
  • 7. Objective C readwrite Hem getter (okuma) hem de setter (yazma) tanımı icin kullanılır ve @synthesize kullanımı gerektirir. readonly Sadece getter tanımı icin kullanır. assign Hafıza yönetimiyle ilgili parametredir. Direk atama yapmayı saglar. retain Hafıza yönetimiyle ilgili parametredir. Direk atama yapmayı ve atanan nesnenin izinsiz silinmesini engeller.
  • 8. Objective C copy Hafıza yönetimiyle ilgili parametredir. Direk atma yapmayı, atanan nesnenin izinsiz silinmesini ve degistirilmesini engeller. atomic Bu property thread - safe’tir. Multi thread uygulamalar icin uydundur. Aksi söylenmedikce bütün property degiskenleri atomic olarak kabul edilir. nonatomic Multi thread bir uygulama kullanmayacagımız zamanlarda nonatomic olarak tanımlama yapabiliriz, atomic olanlara göre daha hızlı calısmaktadır.
  • 9. Objective C synthesize Property olarak tanımlanmıs bir degisken icin getter ve setter tanımlamalarına izin verir. dynamic Kendi getter ve setter metotlarımızı tanımlamamızı saglar.
  • 10. Objective C for for(int i = 0; i < 10; i++){ /* Codes */ } while while(condition){ /* Codes */ }
  • 11. Objective C do - while do{ /* Codes */ }while(condition); if - else if - else if(condition){ /* Codes */ } else if(expression){ /* Codes * / } else{ /* Codes */ }
  • 12. Objective C Try - Catch - Finally @try{ /* Codes */ } @catch(NSException *exception){ /* Codes * / } @finally{ /* Codes */ }
  • 13. Objective C int *number = 4; NSInteger *number = 4; Primitive veri tiplerini tercih edebilecegimiz gibi bir de NSValue sınıfından türeyen NSInteger gibi veri tiplerini de tercih edebiliriz. Özellikle performans gerektiren kısımlarda (döngüler vb.) primitive tipler çok daha hızlı sonuc verir.
  • 14. Objective C nil NSInteger *number = nil; Herhangi bir nesneyi isaret etmeyen bos bir referans degiken tanımlamakta kullanılır. NSString *name = nil;
  • 15. Objective C Selector Tanımlı metotları temsil edebilen özel bir veri tipidir. Metot isimlerini ve aldıkları parametreleri tutar. Performans artısını saglamak amacıyla tasarlanmıstır. SEL *selector = @selector(methodName:); /* Metot adının sonuna aldıgı parametre sayısı kadar : isareti eklenir. */ SEL *selector = @selector(methodName);
  • 16. Objective C Class Instance ClassName *name = [ClassName alloc]init]; ClassName *name = [ClassName new]; * karakterinin kullanılma sebebi, Objective C’ de nesneler pointer referansları aracılıgılya islem yapar. init metodu dolaylı yolda constructor islevi görmektedir. [super init]; Sınıfımız baska bir sınıftan türediyse üst sınıfın üye degiskenlerinin ilk kullanıma hazırlanmasını saglar. #import “ClassName.h” ile sınıfı kendi sınıfımıza dahil etmemiz saglanır.
  • 17. Objective C Methods - (returnType) methodName; - karakteri derleyeciye kendisinden sonra gelen metodun bir instance (nesne) metodu oldugunu söyler. + (returnType) methodName; + karakteri derleyeciye kendisinden sonra gelen metodun sınıfa ait bir metod oldugunu söyler. - (returnType) methodName: (NSString *word); Tek parametreli metot tanımlaması. - (returnType) methodName: (NSString *word): (NSInteger *number); Çok parametreli metot tanımlaması.
  • 18. Objective C Methods ClassName *className = [ClassName alloc]init]; [className methodName]; Sınıfa ait olmayan bir metot tetiklenmesi. [ClassName methodName]; Sınıfa ait olan bir metot tetiklenmesi. alloc metodu, hafızadan yer ayrılmasını ve ayrılan hafıza alanının baslangıc adresini ilgili referans degiskene atar. init metodu, nesneye ilk deger ataması yapılmasını saglar. init metodunu override ederek kendi init metodumuzu yazabiliriz. Bunu yaparken ilk basta [super init]; cagrısıyla üst sınıfın init metodunu cagırmalıyız.
  • 19. Objective C Methods - (id)init{ self = [super init]; if(self){ /* Codes */ } return self; } self anahtar kelimesi aynı sınıf icerisindeki metotların tetiklenmesini saglamak icin kullanılmaktadır.
  • 20. Objective C Methods - (id)dealloc{ [variable release]; [secondVariable release]; [super dealloc]; } Calısma zamanında bir nesne ile kimsenin isi kalmadıgında otomatik olarak o nesne icin dealloc metodu devreye girer. Bu metot sınıftaki tüm üye degiskenleri serbest bırakarak hafızada kapladıkları alanın geri iade edilmesini saglar.
  • 21. Objective C Static Typing ClassName *name = [ClassName alloc]init]; Dynamic Typing id *object = [ClassName alloc]init]; id veri tipi, tüm Objective C sınıflarını temsil edebilen bir veri tipidir.
  • 22. Objective C NSObject Class Methods - (BOOL) isKindOfClass: classObj; Kendisine parametre olarak gelen sınıfın metodun bulundugu sınıfla aynı sınıf veya o sınıfın alt sınıfı olup olmadıgını kontrol eder. - (BOOL) isMemberOfClass: classObj; Kendisine parametre olarak gelen sınıfın metodun bulundugu sınıfla aynı olup olmadıgını kontrol eder. - (BOOL) respondsToSelector: selector; Bir nesnenin belirli bir metoda cevap verip vermeyecegini kontrol eder. O nesnenin bulundugu sınıfla birlikte alt sınıflarına da bakılır. Bu bir nesne metodudur dolayısıyla elimizde nesne olması gerekmektedir.
  • 23. Objective C NSObject Class Methods + (BOOL) instancesRespondToSelector: selector; Sınıfın nesnelerinin kendisine parametre olarak gelen metoda karsılık verip vermeyecegini kontrol eder. - (id) performSelector: selector; Bir nesnenin belirli metodunu dolaylı yolda cagırmak icin kullanılır.
  • 24. Objective C Blocks Bloklar metotlara benzer fakat çok önemli bir farkı bulunmaktadır; bloklar cagırıldıkları yerdeki diger degiskenlere, bu degiskenler bloga parametre olarak gönderilmese bile direkt olarak erisim imkanı saglar. ^ returnType (parameters){ /* Codes */ } Eger yerel bir degisken üzerindeki degisikliklerin bloklar tarafından algılanmasını istiyorsak bu degisken tipinin onune __block ifadesini getirmeliyiz. __block int number = 8;
  • 25. Objective C Arrays C’ den miras alınan dizi yapısı Objective C’ de de kullanılabilir. NSString *myArray[5]; myArray[4] = @“İstanbul”; Objective C’ de kullanılan dizi sınıfı ise NSArray sınıfıdır. C dizilerinden farklı olarak boyut kontrolü yapar ve dizinin eleman sayısından yüksek bir indeksteki veriye erisimi engeller. NSArray sınıfının bir baska özelligi de dizi elemanlarının farklı sınıfıların nesneleri olabilmesidir. Dizi elemanlarından birinin tipi NSString, bir digerininki NSDate olabilir. /* Dizi olusturmayı saglar. */ NSArray *myArray = [NSArray array]; NSArray *myArray = [NSArray alloc]initWithObjects: @“İstanbul”, @“Ankara”, @“Sivas”, nil];
  • 26. Objective C Arrays NSArray *myArray = [NSArray alloc]arrayWithObjects: @“İstanbul”, @“Ankara”, @“Sivas”, nil]; /* Parametre olarak verilen indisteki dizi elemanına ulasmayı saglar. */ NSString *city = [myArray objectAtIndex:0]; /* Dizinin eleman sayısını döndürür. */ int arrayCount = [myArray count];
  • 27. Objective C Mutable - Immutable NSString, NSArray gibi isminde Mutable geçmeyen Foundation Framework sınıflarından olusan degistirilemez (immutable) nesneler olarak bilinirler. Bu nesneler olusturulduktan sonra degerleri üzerinde oynama yapılmasına izin verilmez. Bu nedenle yeni bir eleman eklemek istedigimizde nesne üzerinde degisiklik yapılmasına izin verilmedigi icin yeni bir nesne olusturulur ve eski nesne silinir. NSMutableArray gibi isminde Mutable geçenler ise nesne üzerinde oynama yapılmasına izin verirler.
  • 28. Objective C NSMutableArray Eleman ekleme ve çıkarma islemleri yapmak istedigimiz diziler için NSMutableArray tercih ediyoruz. NSMutableArray *myArray = [NSMutableArray alloc]arrayWithObjects: @“Cumhuriyet Üniversitesi”, @“Bogazici Üniversitesi”, @“İstanbul Teknik Üniversitesi”, @“ODTÜ”,nil]; /* Eleman ekleme */ [myArray addObject: @“İstanbul Üniversitesi”]; /* Eleman çıkarma */ [myArray removeObject: @“İstanbul Üniversitesi”]; [myArray removeObjectAtIndex:1];
  • 29. Objective C NSDictionary - NSMutableDictionary NSDictionary benzeri yapılar diger programlama dillerinde Dictionary veya Map olarak geçer. NSDictionary’deki her bir eleman anahtar (key) - deger (value) olarak tutulmaktadır. Her bir anahtara karsılık gelen bir deger bulunur. Elemanların anahtar degerleri birbirinden farklı olmak zorundadır fakat farklı anahtarlara aynı degerler karsılık gelebilir. NSMutableDictionary *telephoneCodes = [NSMutableDictionary dictionaryWithObjectsAndKeys: @“İstanbul Anadolu”, @“216”, @“İstanbul Avrupa”, @“212”, @“Sivas”, @“346”,nil]; /* Elemana Ulasma */ NSLog(@“İstanbul Anadolu: %@”, [telephoneCodes objectForKey: @“216”]); /* Eleman Ekleme*/ [telephoneCodes setObject: @“Ankara” forKey: @“312”]; /* Eleman Çıkarma*/ [telephoneCodes removeObjectForKey: @“312”]; /* Eleman Degerini Güncelleme*/ [telephoneCodes setValue: @“…” forKey: @“212”];
  • 30. Objective C NSSet NSSet sayesinde matematiksel kümeler tanımlayabiliriz. Elemanların birbirini tekrar etmesine izin verilmez. /* cluster degiskeninin icerigi {A,E,B,Z,Y} olur. */ NSSet *cluster = [NSSet setWithObjects: @“A”, @“E”, @“B”, @“Z”, @“B”, @“A”, @“Y”, nil]; /* Kümede elemanın olup olmadıgını kontrol eder. */ BOOL result = [cluster containsObject: @“A”]; /* İki kümenin kesisim kontrolü */ BOOL result = [cluster intersectsSet: secondCluster]; /* İki kümenin denklik kontrolü */ if(cluster isEqualToSet: secondCluster == YES){ NSLog(@“İki küme birbirine denktir.”); }
  • 31. Objective C NSMutableSet /* Eleman Ekleme */ [cluster addObject: @“C”]; /* Eleman Çıkarma */ [cluster removeObject: @“C”]; /* İki kümenin bilesimini bulur ve cluster’a yazar. */ [cluster unionSet: secondCluster]; /* İki kümenin kesisimini bulur ve cluster’a yazar. */ [cluster intersectSet: secondCluster]; /* İki kümenin farkını bulur ve cluster’a yazar. */ [cluster minusSet: secondCluster];
  • 32. Objective C NSCountedSet İsminde Mutable ifadesi geçmemesine ragmen Mutable yapıdadır. NSSet sınıfına benzerlik gösterir, tek farkı kümeye bir eleman eklendiginde o eleman için tutulan sayaç degerini artırır ve elemanların tekrar etmesine izin vermez. NSCountedSet *countSet = [NSCountedSet setWithObjects: @“A”, nil]; /* Herhangi bir eleman için tutulan sayaç degerine ulaşma */ unsigned long aCount = [countSet countForObject: @“A”];
  • 33. Objective C NSData - NSMutableData NSData sınıfı herhangi bir nesnenin, dosyanın, videonun verisini tutacak sekilde tasarlanmıstır. Herhangi bir nesnenin degerini byte cinsinden NSData veya NSMutableData nesnelerine kopyalayabiliriz. NSData ile NSMutableData’nın tek farkı birincisi statik, ikincisi dinamik yapıda olmasıdır. NSData dosya, resim ve video islemlerinde ilgili dosyanın verisini tutmak için sıklıkla kullanılır. char *characters = “Hello World”; NSData *data = [NSData dataWithBytes: characters length: strlen(characters)];
  • 34. Objective C NSString - NSMutableString NSMutableString, NSString sınıfının degistirilebilir versiyonudur. /* Var olan bir karakter dizisinden yeni bir karakter dizisi olusturur. */ NSString *newWord = [NSString stringWithString: word]; /* Karakter dizisini kendisine verilen formata ve parametrelere göre olusturma */ NSString *cityCount = [NSString stringWithFormat: @“Türkiye’de %d il vardır.”, 81]; /* Karakter dizisinin uzunlugunu bulma */ int charLength = [cityCount length];
  • 35. Objective C NSNumber int veya float gibi primitive sayısal degerleri NSArray veya NSDictionary gibi bir koleksiyonda depolayabilmek için, o sayısal degeri ilk önce NSNumber sınıfının bir nesnesine çevirmemiz gerekmektedir. /* NSNumber nesnesine dönüstürme */ int number = 1907; float secondNumber = 19.07; NSNumber *intNumber = [NSNumber numberWithInt: number]; NSNumber *floatNumber = [NSNumber numberWithFloat: secondNumber]; /* Primitive tipe dönüstürme */ int number = [intNumber intValue]; float secondNumber = [floatNumber floatValue];
  • 36. Objective C NSDate /* Şu anki tarih */ NSDate *now = [NSDate date]; /* Bes saniye sonraki tarih */ sleep(5); NSDate *fiveSecondsLater = [NSDate date]; /* Erken tarihi bulma */ NSDate *early = [now earlierDate: fiveSecondsLater]; /* Geç tarihi bulma */ NSDate *late = [now laterDate: fiveSecondsLater];
  • 37. iOS
  • 38. iOS Apple, IDE (Integrated Development Environment) olarak sadece Mac OS X isletim sisteminde calısan Xcode yazılım gelistirme platformunu tercih etmektedir. Xcode; iPhone, iPad ve Apple bilgisayarlarda calısmak üzere Mac OS X uyumlu programlar gelistirmemizi saglar.
  • 39. iOS Create a new Xcode project seçeneği ile yeni bir Xcode projesi olusturuyoruz.
  • 40. iOS Single View Application seçeneği ile olusturacagımız projenin tipini belirliyoruz.
  • 41. iOS
  • 42. iOS Projeyi olusturdugumuz da olusan dosyaların genel görünümü
  • 43. iOS Delegate Methods Delegate metotlar, kullandıgımız sınıfların .h dosyalarına dahil edilir. Delegate metotlar içerisinde protokolleri bulundurur. Protokoller diger programlama dillerindeki interface kavramına karsılık gelmektedir. Protokoller sayesinde sınıfımıza kurallar koyarak daha düzenli bir isleyis saglayabiliriz. @interface AppDelegate : UIResponder <UIApplicationDelegate> @end @protocol UIApplicationDelegate<NSObject> @required /* Methods */ @optional /* Methods */ @end
  • 44. iOS AppDelegate (Application Delegate), uygulamamızı temsil eden sınıftır. - (BOOL) application: (UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions Uygulama çalıstıktan sonra gerekli ayarlamalar yapıldıgında bu delegate metodu çalısmaktadır. - (void) applicationWillResignActive: (UIApplication *)application Uygulama aktif durumdan inaktif duruma gectiginde bu delegate metodu calısmaktadır. - (void) applicationDidEnterBackground: (UIApplication *)application Uygulama arka plana düstügünde bu delegate metodu calısmaktadır.
  • 45. iOS - (void) applicationWillEnterForeground: (UIApplication *)application Uygulama arka planda inaktif durumdayken cagırılır ve yeniden aktif duruma gelmesi istenir ise bu delegate metodu çalısmaktadır. - (void) applicationDidBecomeActive: (UIApplication *)application Uygulama aktif duruma geldiginde bu delegate metodu çalısmaktadır. - (void) applicationWillTerminate: (UIApplication *)application Uygulama sonlandırılmak istenir ise bu delegate metodu çalısmaktadır.
  • 46. iOS Storyboard, bizim uygulamamızın tasarımını gelistirdigimiz ve yönettigimiz kısımdır.
  • 47. iOS Storyboard’ un içerisinde kullanabilecegimiz görsel komponentler;
  • 48. iOS Storyboard’ un içerisinde kullanabilecegimiz görsel komponentler;
  • 49. iOS Storyboard’ un içerisinde kullanabilecegimiz görsel komponentler;
  • 50. iOS ViewController, uygulamamıza ekledigimiz ViewController’ların yönetilmesini saglayan sınıflardır. - (void) viewDidLoad ViewController’ın görünümü yüklendiginde bu metot calısmaktadır. - (void) didReceiveMemoryWarning Uygulama memory (hafıza) uyarısı verdiginde bu metot calısmaktadır.
  • 51. iOS IBAction - IBOutlet /* ViewController.h */ @property (weak, nonatomic) IBOutlet UILabel *myLabel; - (IBAction)print: (id)sender; /* ViewController.m */ @synthesize myLabel; - (IBAction)print: (id)sender{ myLabel.text = @“CÜ Bilgisayar Mühendisligi”; }
  • 53. iOS UITableView UITableView komponentimizin DataSource ve Delegate özelliklerini ViewController sınıfımıza baglıyoruz, bunu yapmadıgımız takdirde verilerimiz UITableView komponentimizde listelenmeyecektir. Son olarak her bir satır için prototip olusturuyoru ve bu prototipe bir tanımlayıcı veriyoruz.
  • 54. iOS UITableView /* ViewController.h */ @interface ViewController : UIViewController <UITableViewDataSource, UITableViewDelegate> @property NSArray *myArray; @end /* ViewController.m */ @synthesize myArray; - (UITableViewCell *)tableView: (UITableView *)tableView: cellForRowAtIndexPath: (NSIndexPath *)indexPath{ static NSString *cellIdentifier = @“MyCell”; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: cellIdentifier forIndexPath: indexPath]; cell.textLabel.text = [myArray objectAtIndex: indexPath.row]; return cell; }
  • 55. iOS UITableView /* ViewController.m */ @synthesize myArray; - (NSInteger *)tableView: (UITableView *)tableView: numberOfRowsInSection: (NSInteger *)section{ return [myArray count]; } - (NSInteger *)numberOfSectionsInTableView: (UITableView *)tableView{ return 1; } - (void)viewDidLoad{ [super viewDidLoad]; myArray = [NSArray arrayWithObjects: @“İstanbul”, @“Sivas”, @“Ankara”, nil]; }
  • 57. iOS Segue Segue dedigimiz gecis yapıları sayesinde ViewController’lar arasında gecis yapabiliriz, bunu yaparken animasyon ekleyebilir ve bulundugumuz ViewController’dan gecis yapacagımızı ViewController’a data aktarımı yapabiliriz. Storyboard üzerinden bulundugumuz ViewController’a kntrl tusu ile basılı tutup, gecis yapılmasını istedigimiz ViewController’a bırakıp Segue islemini gerceklestirebiliriz. Bunun sonucunda karsımıza gelen 3 secenekten bize uygun olanı tercih ederiz.
  • 58. iOS Changing ViewController Programmatically Storyboard üzerinden ikinci ViewController’ı ekliyoruz ve ayırıcı olması icin Storyboard ID’sini belirliyoruz. /* ViewController.h */ #import “SecondViewController.h” @interface ViewController : UIViewController - (IBAction)changeController: (id)sender; @end
  • 59. iOS Changing ViewController Programmatically /* ViewController.m */ @interface ViewController (){ SecondViewController *secondViewController; } @end @implementation ViewController - (IBAction)changeController: (id)sender{ secondViewController = [self.storyboard instantiateViewControllerWithIdentifier: @“secondViewController”]; [self presentViewController: secondViewController animated: YES completion: nil]; } @end
  • 60. iOS UIAlertView /* ViewController.m */ @implementation ViewController - (void)viewDidLoad{ [super viewDidLoad]; UIAlertView *alertView = [UIAlertView alloc]initWithTitle: @“CÜ Bilgisayar Mühendisligi” message: @“Anıl SÖZERİ” delegate: self cancelButtonTittle: @“Tamam” otherButtonTitles: nil]; [alertView show]; @end
  • 61. iOS UIWebView /* InfoViewController.m */ @implementation ViewController @synthesize myWebView; - (void)viewDidLoad{ [super viewDidLoad]; NSURL *url = [NSURL alloc]initWithString: @“http:// www.cumhuriyet.edu.tr”]; NSURLRequest *request = [NSURLRequest alloc]initWithURL: url]; [myWebView loadRequest: request]; @end
  • 62. iOS NSThread /* ViewController.m */ @implementation ViewController - (void)viewDidLoad{ [super viewDidLoad]; sleep(5); [NSThread sleepForTimeInterval: 5]; NSThread *thread = [NSThread alloc]initWithTarget: self selector: @selector(methodName) object: nil]; [thread start]; [thread cancel]; [thread isExecuting]; @end
  • 63. iOS NSUserDefaults /* ViewController.h */ @interface ViewController : UIViewController @property NSUserDefaults *userInfo; @end /* ViewController.m */ @implementation ViewController @synthesize userInfo; - (void)viewDidLoad{ [super viewDidLoad]; userInfo = [NSUserDefaults standardUserDefaults]; @end NSUserDefaults sınıfı ile kullanıcı ile ilgili bilgileri tutabiliriz örnek vermemiz gerekirse kullanıcı adı ve sifre girilen bir uygulamada beni hatırla özelligi eklemek istersek bu sınıftan yararlanabiliriz.
  • 64. iOS NSUserDefaults /* NSUserDefaults obje ekleme */ [userInfo setInteger: 2 forKey: @“dataCount”]; [userInfo setObject: className forKey: @“classInstance”]; [userInfo synchronize]; ! /* NSUserDefaults obje alma */ [userInfo objectForKey: @“classInstance”]; [userInfo integerForKey: @“dataCount”];
  • 65. iOS NSNotificationCenter /* ViewController.m */ [[NSNotificationCenter defaultCenter] postNotificationName: @“notificationName” object: nil]; ! /* Olusturdugumuz bir NSDictionary ile parametre de aktarabiliriz. */ NSMutableDictionary *myDictionary = [NSMutableDictionary dictionary]; [myDictionary setObject: data forKey: @“notificationData”]; [[NSNotificationCenter defaultCenter] postNotificationName: @“notificationName” object: nil userInfo: myDictionary]; NSNotificationCenter sınıfı ile baska sınıflarımıza data aktarımını saglayabiliriz. Notification’ı sınıfımızdan yolladıktan sonra sadece tetikletecegimiz sınıfta Notification’ı dinlememiz gerekmektedir.
  • 66. iOS NSNotificationCenter /* AnotherViewController.m */ /* Notification’ı diger ViewController’ımızdan karsılıyoruz. */ [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(methodName) name: @“notificationName” object: nil]; ! /* userInfo ile gönderilen datayı karsılama */ - (returnType)methodName: (NSNotification *)notification{ NSDictionary *myDictionary = notification.userInfo; }
  • 67. iOS UILocalNotification /* ViewController.m */ - (void)viewDidLoad{ [super viewDidLoad]; UILocalNotification *notification = [UILocalNotification alloc]init]; notification.timeZone = [NSTimeZone defaultTimeZone]; notification.alertBody = @“Anıl SÖZERİ”; notification.soundName = UILocalNotificationDefaultSoundName; [UIApplication sharedApplication] presentLocalNotificationNow: notification]; } UILocalNotification ile kullanıcıya bilgi verme amaçlı olarak mesaj gönderebiliriz.
  • 68. XML XML Nedir? eXtensible Markup Language, hem insanlar hem de bilgi islem sistemleri tarafından kolayca okunabilecek dokümanlar olusturmaya yarayan W3C (WWW, World Wide Web Consortium) tarafından tanımlanmıs bir standarttır. ! Bu özelligi ile veri saklamanın yanında farklı sistemler arasında veri alısverisi yapmayı saglayan bir ara format görevi de görür. ! XML, HTML’ in de tasarımcısı olan Tim Berners Lee’ dir. Dilin düzenlenmesi W3C’ nin sorumlulugundadır.
  • 69. iOS NSXMLParser NSXMLParser sınıfı XML datamızı <tagname> XML taglarına göre parcalara ayırıp bizim ihtiyacımız olan datayı kullanmamızı saglar. /* ViewController.h */ @interface ViewController : UIViewController <NSXMLParserDelegate> @property NSXMLParser *parser; @end /* ViewController.m */ @implementation ViewController /* Parse islemi basladıgında bu metot calısır. */ - (void)parserDidStartDocument: (NSXMLParser *)parser; @end
  • 70. iOS NSXMLParser /* ViewController.m */ @implementation ViewController /* XML elementlerinin parse islemi basladıgında bu metot calısır. */ - (void)parser: (NSXMLParser *)parser didStartElement: (NSString *)elementName namespaceURI: (NSString *)namespaceURI qualifiedName: (NSString *)qName attributes: (NSDictionary *)attributeDict; /* XML elementlerinin parse islemi bittiginde bu metot calısır. */ - (void)parser: (NSXMLParser *)parser didEndElement: (NSString *)elementName namespaceURI: (NSString *)namespaceURI qualifiedName: (NSString *)qName; /* XML elementlerinin parse isleminde karakterler bulundugunda bu metot calısır. */ - (void)parser: (NSXMLParser *)parser foundCharacters: (NSString *)string; @end
  • 71. iOS Creating XML /* XML Olusturma, Server’ a baglandıgımızda çevrimiçi oldugumuzu bildiren XML örnegi. */ XMPPPresence *presence = [XMPPPresence presence]; NSXMLElement *status = [NSXMLElement elementWithName:@“status”]; [status setStringValue:@“Çevrimiçi”]; [presence addChild: status]; NSLog(@“%@”, [presence XMLString]); ! /* Ekran Çıktısı */ <presence> <status>Çevrimiçi</status> </presence>
  • 72. Base64 Base64 Nedir? Base64, Binary data (ikili veri)’ ların sadece ASCII karakterlerini kullanan ortamlara iletilmesini ve saklanmasını saglayan bir kodlama semasıdır. ! Base64 kodlamasının uzunlugu daimi olarak 4’ ün katları seklindedir. 4’ ün katı olmayan hiçbir veri geçerli bir Base64 verisi degildir. 4’ ün katı degilse gerektigi kadar = isareti sonuna eklenir. Kodlanmıs veri orjinal haline göre %33 oranında büyür. ! ASCII, Latin alfabesi üzerine kurulu 7 bitlik bir karakter setidir.
  • 73. iOS Base64 Encode && Decode /* ViewController.h */ @interface ViewController : UIViewController - (NSString *)base64Encode: (NSString *)string; - (NSString *)base64Decode: (NSString *)string; @end /* ViewController.m */ @implementation ViewController - (void)viewDidLoad{ [super viewDidLoad]; NSString *name = @“Anıl SÖZERİ”; NSString *base64Name = [self base64Encode: name]; } @end
  • 74. iOS Base64 Encode && Decode /* ViewController.m */ @implementation ViewController - (NSString *)base64Encode: (NSString *)string{ NSString *base64String = [[string dataUsingEncoding: NSUTF8StringEncoding] base64EncodedStringWithOptions:0]; return base64String; } - (NSString *)base64Decode: (NSString *)string{ NSData *decodedData = [[NSData alloc]initWithBase64EncodingString: string options: NSDataBase64DecodingIgnoreUnknownCharacters]; NSString *decodeString = [NSString alloc]initWithData: decodedData encoding: NSUTF8StringEncoding]; return decodeString; @end
  • 75. JSON JSON Nedir? JSON (JavaScript Object Notation), insanlar tarafından okunabilen bir veri degisim biçimidir. XML’ in JavaScript ile çokta iyi kullanılmamasından ötürü tercih edilir. Klasik DOM agaçlarından farksız bir yapıya sahiptir. ! DOM (Document Object Model), İnternet tarayıcıları girilen internet sayfasındaki tüm elemanları nesne olarak kabul eder. DOM sayfa içerisindeki herhangi bir nesneye müdahale edebilmemize olanak verir. Bunu yapabilmek için JavaScript gibi bazı script dilleri kullanmak gerekmektedir.
  • 76. iOS NSJSONSerialization /* ViewController.h */ @interface ViewController : UIViewController @property NSMutableDictionary *JSONDictionary; @property NSData *JSONData; @property NSString *name; @property NSString *university; @end /* ViewController.m */ @implementation ViewController - (void)viewDidLoad{ [super viewDidLoad]; [self createJSONData]; [self getJSONData]; } @end
  • 77. /* ViewController.m */ /* JSON Datası olusturmayı saglar. */ @implementation ViewController - (void)createJSONData{ [JSONDictionary setObject:@“Anıl SÖZERİ” forKey:@“name”]; [JSONDictionary setObject:@“Cumhuriyet Üniversitesi” forKey:@“university”]; NSError *error; JSONData = [NSJSONSerialization dataWithJSONObject: JSONObject options: 0 error: &error]; NSString *JSONString = [NSString alloc]initWithData: JSONData encoding: NSUTF8StringEncoding]; NSLog(@“JSON Data %@”, JSONString); } @end iOS NSJSONSerialization
  • 78. /* ViewController.m */ /* Gelen JSON Datasına göre verileri çekmeyi saglar. */ @implementation ViewController - (void)getJSONData{ NSError *error; NSDictionary *JSONDictionary = [NSJSONSerialization JSONObjectWithData: JSONData options: 0 error: &error]; name = (NSString *) [JSONDictionary valueForKey: @“name”]; university = (NSString *) [JSONDictionary valueForKey: @“university”]; NSLog(@“Name: %@”, name); NSLog(@“University: %@”, university); } @end iOS NSJSONSerialization
  • 79. XMPP XMPP Nedir? eXtensible Messaging and Presence Protocol, İnternetteki iki ucun herhangi bir yapısal bilgiyi karsılıklı ve neredeyse es zamanlı olarak aktarmalarına olanak saglayan açık bir XML protokolü ve teknolojisidir. ! Avantajları; ! - XMPP protokolleri açık ve özgürdür. - Standarttır. - Kendini ispatlamıstır ve birçok gelistiricisi bulunmaktadır. - Merkezi degildir, herhangi bir sunucu isletebilir. - Güvenlidir. - Genisletilebilirdir, XML’ den faydalanarak kendi fonksiyonlarımızı ekleyebiliriz. - Esnektir, mesajlasmanın ötesinde ag yönetmek, dosya paylasımı, oyun oynamak icin kullanılabilir.
  • 80. iOS XMPPFramework XMPPFramework, XMPP yapısının Mac OS X ve iOS platformundaki kütüphanesidir. Bu kütüphane Robbie Hanson tarafından gelistirilmistir ve hala da gelistirilmektedir. ! https://github.com/robbiehanson/XMPPFramework
  • 81. iOS XMPPStream XMPPStream sınıfı, XMPPFramework’ün en temel yapısı, eklentiler ve özel yapıdaki kodları içerir. Aynı zamanda XMPPParser sınıfını da kendi içerisinde barındırır. ! XMPPJID sınıfı, degismez id saglayıcıdır. ! XMPPStream sınıfından xmppStream adında bir adet instance olusturdugumuzu varsayalım; ! /* Baglanılacak olan Server’ın host name yani adresini belirliyoruz. */ xmppStream.hostName = @“127.0.0.1”; ! /* Baglanılacak olan Server’ın host port numarasını belirliyoruz. XMPP default degeri 5222’dir. */ xmppStream.hostPort = 5222; ! /* XMPP Socket yapısının arkaplanda çalısmasını saglamak için aktif hale getiriyoruz. */ xmppStream.enableBackgroundingOnSocket = YES;
  • 82. iOS XMPPStream /* XMPPStream Sunucu Baglantısının Gerçeklestirilmesi */ NSError *error; ! if(![xmppStream connectWithTimeout: XMPPStreamTimeoutNone error: &error]){ NSLog(@“Baglantı Hatası”); return NO; } NSLog(@“Baglantı Saglandı.”); return YES; ! ! /* Baglantı Durumunun Ögrenilmesi */ ! if([xmppStream isConnected]){ /* Baglantı gerceklesti ise */ } ! if([xmppStream isDisconnected]){ /* Baglantı sonlandı ise */ }
  • 83. iOS XMPPStream /* XMPPStream Sunucu Baglantısının Gerçeklestirilmesinin Ardından Kimlik Dogrulaması İslemi */ NSError *error; ! if(![xmppStream authenticateWithPassword: myPassword error: &error]){ NSLog(@“Kimlik Dogrulama Hatası”); return NO; } return YES; XMPPReconnect XMPPReconnect sınıfı, Baglantı kazara koptugunda yeniden baglantının gerceklesmesini saglayan XMPPFramework sınıfıdır. ! /* XMPPReconnect sınıfını aktif hale getirme. */ XMPPReconnect *xmppReconnect = [XMPPReconnect alloc]init]; [xmppReconnect activate:xmppStream];
  • 84. iOS XMPPStream Delegate Methods /* Mesaj geldiginde tetiklenen delegate metodu */ - (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message{ /* Codes */ } ! /* Presence paketi geldiginde tetiklenen delegate metodu */ - (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence{ /* Codes */ } ! /* IQ (Info/Query) paketi geldiginde tetiklenen delegate metodu */ - (void)xmppStream:(XMPPStream *)sender didReceiveIQ:(XMPPIQ *)iq{ /* Codes */ }
  • 85. iOS XMPPStream Delegate Methods /* Baglantı saglandıgında tetiklenen delegate metodu */ - (void)xmppStreamDidConnect:(XMPPStream *)sender{ /* Codes */ } ! /* Baglantı sonlandıgında tetiklenen delegate metodu */ - (void)xmppStreamDidDisconnect:(XMPPStream *)sender withError:(NSError *)error{ /* Codes */ } ! /* Kimlik Dogrulama islemi tamamlandıgında tetiklenen delegate metodu */ - (void)xmppStreamDidAuthenticate:(XMPPStream *)sender{ /* Codes */ } ! /* Kimlik Dogrulama islemi tamamlanamadıgında tetiklenen delegate metodu */ - (void)xmppStreamDidNotAuthenticate:(NSXMLElement *)error{ /* Codes */ }
  • 86. iOS XMPPPresence XMPPPresence sınıfı, kullanıcıların Server üzerinde çevrimiçi, mesgul, dısarıda vb. olma durumlarını yöneten XMPPFramework sınıfıdır. ! /* XML Olusturma, Server’ a baglandıgımızda çevrimiçi oldugumuzu bildiren XML örnegi. */ XMPPPresence *presence = [XMPPPresence presence]; NSXMLElement *status = [NSXMLElement elementWithName:@“status”]; [status setStringValue:@“Çevrimiçi”]; [presence addChild: status]; /* XMPPStream sınıfının sendElement metodu sayesinde paketlerin Server’ a gönderimi saglanır.*/ [xmppStream sendElement:presence]; ! /* Ekran Çıktısı */ <presence> <status>Çevrimiçi</status> </presence>
  • 87. iOS XMPPIQ XMPPIQ sınıfı, Info/Query yani Server’ dan bilgi almamızı saglayan XMPPFramework sınıfıdır. ! IQ paketlerinin altında gelen Ping paketleri bulunmaktadır. Bu paket Server’ dan bize gönderilerek “Burada mısın?” tarzında bir mesaj verdigini düsünebiliriz. Biz de “Buradayım.” mesajı vermek için Ping paketine cevap olarak bizimde Server’ a Ping paketi yollamamız gerekmektedir. ! Ayrıca yine IQ paketlerinin altında gelen Roster paketleri de bulunmaktadır. Bu paket ise Server’ da kayıtlı olan kullanıcıların bilgilerinin bize gelmesini saglamaktadır. Örnegin; kisi listesinde görüntüleyecegimiz kisiler bu paketin icerisinde gelmektedir. ! Bunların dısında bir de Custom IQ dedigimiz yapılar vardır. Custom IQ paketleri ise daha önce bahsettigimiz gibi XMPP yapısı genisletilebilir bir yapı oldugundan dolayı kendi düzenlemelerimizi yapmamıza olanak verir. Bizim kendi ekledigimiz XML yapıları sayesinde server ile Custom IQ paketi alısverisini gerçeklestirebiliriz.
  • 88. iOS XMPPMessage XMPPMessage sınıfı, mesajlasma islemlerini yöneten XMPPFramework sınıfıdır. ! Message paketi haricinde ayrıca Composing paketi dedigimiz kullanıcıya “Yazıyor..” bilgisini veren pakette Message paketinin altında bulunmaktadır. ! /* Mesajın içeriginde ne oldugunu gösterir. */ [message body]; ! /* Mesajın kimden geldigini gösterir. */ [message from]; ! /* Mesajın kime gidecegini gösterir. */ [message to];