Mobil Programlama

iOS

DERS PROGRAMI
iOS 301 Ders Programı

Mesajlaşma İşlemleri

Lisans: Creative Commons 11.12.2020 tarihinde güncellendi
Bakabileceğiniz Etiketler: Eğitmen: Geleceği Yazanlar Ekibi

Eğer uygulama içinden eposta atmak ya da SMS göndermek isterseniz MessageUI Framework size yardımcı olacaktır. Uygulamanın içerisinde bir eposta paylaşım ya da SMS gönderme özelliği varsa MessageUI içerisinden çağıracağınız kod, kullanıcının karşısına ayrı bir pencere getirecek ve telefonun SMS ya da eposta hesapları üzerinden mesajı gönderecektir.

Aşağıdaki örnekte sizlere MessageUI Framework’ün nasıl kullanılacağını anlatacağız. Öncelikle projemize MessageUI Framework’ü ekliyoruz:

MessageUI Framework

 

Şimdi mesaj gönderme amaçlı basit bir uygulama oluşturacağız. İlk olarak uygulamamızın ekranına SMS ve Email adında iki adet düğme yerleştirelim:

Paylaşım butonlarının Interface Builder içerisinde eklenmesi

 

Daha sonraki adımda bu düğmelere birer eylem tanımlamamız gerekiyor. Bunun için de sendSMS ve sendMail adında iki adet metot hazırlayarak bunları ilgili düğmelerle eşleştiriyoruz.

 

#import <UIKit/UIKit.h>
#import <MessageUI/MessageUI.h>
#import <MessageUI/MFMailComposeViewController.h>

@interface ViewController : UIViewController <MFMailComposeViewControllerDelegate,MFMessageComposeViewControllerDelegate>
- (IBAction) sendSMS:(id)sender;
- (IBAction) sendMail:(id)sender;
@end

 

Burada MessageUI.h dosyası SMS, MFMailComposeViewController.h ise eposta gönderme ile ilgili ekranı oluşturmamızı sağlıyor. MFMailComposeViewControllerDelegate eposta gönderme işlemi sonuçlarını takip etmemizi sağlayan temsilci metotları; MFMessageComposeViewControllerDelegate ise SMS ile ilgili metotları barındırıyor.

sendSMS metodunu aşağıdaki gibi oluşturalım;

 

- (IBAction) sendSMS:(id)sender
{
    MFMessageComposeViewController *controller = [[MFMessageComposeViewController alloc] init];
    if([MFMessageComposeViewController canSendText])
    {
        controller.body = @"Akşama ne yapıyorsun?";
        controller.recipients = [NSArray arrayWithObjects:@"05322100000", nil];
        controller.messageComposeDelegate = self;
        [self presentViewController:controller animated:YES completion:^
        {
        }];
    }
}

 

iOS platformunda kullanıcı onayı olmadan SMS atma, telefon etme gibi kullanıcıya zarar verebilecek işlemler gerçekleştirilemez. Bu yüzden uygulama içerisinden SMS atmak istediğimizde yaptığımız şey kullanıcının karşısına MessageUI Framework tarafından sunulan bir SMS penceresi getirmektir. Yukarıdaki kod içerisinde de MFMessageComposeViewController ekranı kullanıcının karşısına getirilecek SMS atma ekranını temsil etmektedir. Biz bu ekranda sadece gönderilecek metin ve atılacak numaraları önceden tanımlama şansına sahibiz. Ancak SMS gönderme onayını iOS kullanıcıdan alacaktır.

body değişkeni SMS ile gönderilecek metnin değişmesini sağlarken, recipients değişkeni mesajın gönderileceği telefon numaralarının belirlenmesini sağlar. messageComposeDelegate ise kullanıcının SMS ekranında yaptığı işlemin sonucunu görmek için gereklidir. Bunun için .h dosyasında MFMessageComposeViewControllerDelegate tanımının yapılmış olması gerekmektedir.

 

- (void) messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result
{
    switch (result)
    {
        case MessageComposeResultCancelled:
        NSLog(@"Iptal edildi");
        break;
        case MessageComposeResultFailed:
        break;
        case MessageComposeResultSent:
        NSLog(@"Gonderildi");
        break;
        default:
        break;
    }
    [self dismissViewControllerAnimated:YES completion:^{
    }];
}

 

messageComposeViewController metodu kullanıcının karşısına çıkan SMS ekranından gelen sonucu işlememizi sağlayacaktır. Eğer kullanıcı işlemi iptal ederse result değeri MessageComposeResultCancelled dönecektir. Eğer SMS gönderimi herhangi bir nedenle başarısız olursa MessageComposeResultFailed, başarılı olursa da MessageComposeResultSent değeri dönecektir.  İşlem bittikten sonra SMS ekranını kaldırıp uygulamadaki son ekrana geri dönmek için dismissViewControllerAnimated metodunu çalıştırıyoruz.

Eposta atmak içinse sendMail metodu içine aşağıdaki kodu ekliyoruz:

 

- (IBAction) sendMail:(id)sender
{
    if ([MFMailComposeViewController canSendMail])
    {
        MFMailComposeViewController *mailCont = [[MFMailComposeViewController alloc] init];
        mailCont.mailComposeDelegate = self;
        [mailCont setSubject: @"CV" ];
        [mailCont setMessageBody: @"Merhaba, ozgecmisim ektedir." isHTML:NO];
        [self presentViewController:mailCont animated:YES completion:^{
        }];
    }
}

 

MFMailComposeViewController sınıfı tıpkı SMS ekranında olduğu gibi ekrana eposta hazırlama ekranını getirir. Burada yaptığımız işlem tıpkı SMS atma işleminde olduğu gibi kullanıcıya önceden tanımladığımız değişken değerleriyle bir eposta hazırlama ekranı sunmaktır. Epostanın ne şekilde gönderileceği ile ilgili son kararı kullanıcı verir ve uygulama geliştirici bunu kontrol edemez. Yine SMS’de olduğu gibi kullanıcının kararı bize temsilci sınıf üzerinden bildirilir. Bu yüzden de .h dosyasında MFMailComposeViewControllerDelegate tanımlamasını yapmamız gerekir.

Yukarıdaki kodun yaptığı işi özetlersek; öncelikle canSendMail metodu ile cihazın eposta atıp atamayacağını kontrol ediyoruz. setSubject metodu epostanın konusunu değiştirmemizi sağlıyor. setMessageBody metodu ile de epostada gönderilecek metni belirliyoruz. Burada epostanın içeriğini HTML uyumlu olacak şekilde hazırladıysak isHMTL seçeneğini YES olarak belirlememiz gerekiyor; bu şekilde eposta HTML formatında gönderiliyor. Son olarak, mailComposeDelegate metodu ekrandan gelecek cevapları takip etmememizi sağlıyor.

Eposta gönderim ekranı

 

Şimdi delegate metodu inceleyelim:

 

- (void) mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
{
    if(result == MFMailComposeResultSent)
    {
        NSLog(@"Gonderildi!");
    }
    else if(result == MFMailComposeResultCancelled)
    {
        NSLog(@"Iptal edildi!");
    }
    else if(result == MFMailComposeResultFailed)
    {
        NSLog(@"Hata olustu!");
    }
    [self dismissViewControllerAnimated:YES completion:^{
    }];
}

 

Kullanıcı eposta ekranında işlemini bitirdiğinde delegate metotlardan didFinishWithResult uyarılır ve işlemin sonucu result değişkenine atılır. Biz de eposta gönderim işleminin sonucu bu değişkeni kontrol ederek öğrenebiliriz. Burada MFMailComposeResultSent başarılı bir gönderimi, MFMailComposeResultFailed başarısız bir işlemi, MFMailComposeResultCancelled ise kullanıcının iptal ettiği bir gönderimi temsil eder. İşlemin sonucunda dismissViewControllerAnimated metodu eposta ekranını kaldırır.