App Transport Security & Opening URL Schemes – iOS9 Compatibility

App Transport Security

New SDK of iOS has “App Transport Security” which encourages developers to use https instead of http. If you compile your app with iOS9 SDK, you will get the following error while it’s try to make a http request.

App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app’s Info.plist file.

Read More »

Advertisements

Sending SMS programmatically on IOS!

Mobil uygulamalarımız artık, sadece iphone değil, ipad, ipod touch gibi diğer cihazlarda çalışıyor. Programsal olarak SMS göndermeden önce, uygulamanın yüklü olduğu device’ın SMS göndermek için uygun olup olmadığını (Sim kartı takılı vs.) anlamaya ihtiyacımızı var.
SMS gönderip gönderemeyeceğini anlamak için IOS Core Framework’lerinden CoreTelephony framework’ünü kullanmak gerekli.
Bu Framework’ü Xcode’da Projemize eklemek için;
Proje’nin Target’ı seçilir, ve Build Phases’den Link Binary With Libraries kısmına gelinir.

adding framework to project in XCode.

Burada bulanan framework’ler, projenin kullandığı frameworklerdir. IOS projelerinde UIKit, Foundation ve CoreGraphics framework’leri baz olarak proje oluşurken ekli gelir.

Yeni bir framework eklemek için ‘+’ tuşuna basarak, framework seçilir. CoreTelephony framework’ü Developer SDK’sı ile gelen bir framework, bu nedenle CoreTelephony yazıp aratırsanız, IOS klasörünün altında gelecektir.

Kullandığınız SDK altındaki diğer frameworkleri incelemek için;
örneğin burada iphoneOS ve 5.1 sdk’da bulunan frameworklere dosya sisteminde aşağıdakine benzer bir yolla erişebilirsiniz.
—– Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1sdk/System/Library altındaki Frameworks ya da Private Frameworks klasörleri altında bulabilirsiniz.

Konumuza geri dönersek 😉 Eklediğiniz framework’ü projenin altında görebilirsiniz. Genelde framework’ler dizin olarak “Frameworks” klasörünün altında yer alır.
Sürükleyip, bu klasörün altına alabilirsiniz.

Eklediğimiz bu framework’teki CTTelephonyNetworkInfo ve CTCarrier sınıflarına ihtiyacımız var bu nedenle, bu sınıfları eklemeden önce, framework’teki referanslarını import etmeliyiz.

#import <CoreTelephony/CTCarrier.h>
#import <CoreTelephony/CTTelephonyNetworkInfo.h>

Device’da herhangi bir sim kartının katılı olup olmadığını ya da bir operatör bilgisinin alınıp alınamadığını, aşağıdakine benzer bir method yazarak anlayabilirsiniz. Burada mobileNetworkCode‘un nil yada boş olup olmadığına bakarak, SMS gönderip gönderilmeyeceği anlaşılabilir.

- (BOOL) canDeviceSendSMS{
CTTelephonyNetworkInfo *networkInfo = [[[CTTelephonyNetworkInfo alloc] init] autorelease];
CTCarrier *carrier = [networkInfo subscriberCellularProvider];

if(nil!=[carrier mobileNetworkCode]){
return YES;
}else{
return NO;
}
}

Bu kontrolleri yaptıktan sonra, SMS gönderme ekranını açıp ve esas işi yapan MessageUI framework’ünü de aynı şekilde, Xcode üzerinden proje target’ına eklemeniz ve, kullanırken aşağıdaki şekilde, import etmeniz gerekiyor.

#import <MessageUI/MessageUI.h>

if([MFMessageComposeViewController canSendText]){
MFMessageComposeViewController *controller = [[[MFMessageComposeViewController alloc] init] autorelease];

controller.body = "First SMS Body";
controller.recipients = [NSArray arrayWithObjects @"02123456789", nil];

controller.messageComposeDelegate = self;
[self openSMSSendingModalView:controller];
}else{
[self showSMSSendingErrorMessage];
}

//METHODS FOR PUSHING And DISMISSING MESSAGE UI WINDOW
-(void) openSMSSendingModalView:(MFMessageComposeViewController*) composeView{
[[[UIApplication sharedApplication] delegate] window] presentModalViewController:composeView animated:YES];
}

-(void) dismissSMSSendingModalView{
[[[UIApplication sharedApplication] delegate] window] dismissModalViewControllerAnimated:YES];
}

-(void) showSMSSendingErrorMessage{
//HANDLE SMS sending error to fill here.
}

- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result {
switch (result){
case MessageComposeResultCancelled:
DLog(@"Result:SMS cancelled");
//DO SOMETHING ABOUT IT!
break;
case MessageComposeResultSent:
DLog(@"Result:SMS sent");
break;
case MessageComposeResultFailed:
DLog(@"Result:SMS failed");
//DO SOMETHING ABOUT IT!
break;
default:
DLog(@"Result:SMS not sent");
//DO SOMETHING ABOUT IT!
break;
}
[self dismissSMSSendingModalView];
}
///***************/////

Yukarıda [[[UIApplication sharedApplication] delegate] window] kodu ile uygulamamızın window’una erişerek, Mesaj göndermeye yarayacak controller’ımızı yani MFMessageComposeViewController class’ının bir objesini presentModalViewController ile ekranların gösterim stack’inin en üst sırasına koyuyoruz.

@interface SMSSender : NSObject
{
......
......
}

SMS gönderme işlemimizin sonucu alabilmemiz için, MFMessageComposeViewControllerDelegate’i olmamız, ve bu protocol’ü (java’da interface olarak tabir edebiliriz) sınıfımıza eklememiz (örneğin aşağıdaki şekilde) ve yukarıdaki gibi – (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result {} methodu ile bu işleminin sonuçlarına göre aksiyon almamız gerekiyor. SMS gönderme işlemi tamamlandıktan sonra bu method otomatik olarak tetikleniyor ve MessageComposeResult tipinde sonuçlar döndürüyor.

MessageUI ile ilgili daha detaylı bilgi almak için buradan devam edebilirsiniz! 🙂

Kolay Gelsin!