Category Archives: Swift

Azure Mobile Services Update Error (1105 – The item provided did not have a valid id)

Azure Mobile Services iOS SDK kullanıp da Native iOS yazdığınız zaman, bazı hatalarla karşılaşa biliyorsunuz. Daha önce bahsetmiş olduğum 1 kendi projelerimden bir tanesinde ben de BackEnd kısmını Azure ile çözüp FrontEnd kısmını iOS Swift ile çözmeye çalıştığımı belirtmiştim.

Yazılımı kolay ve anlaşılır olmasına ve Azure SDK’nın da yeterince donanımlı olmasıyla bir çok sorunun üstesinden gelinse de yine 3.5 saatimi alan bir hata olmadı değil. Bu hata kimi yerlerde “1105 – The item provided did not have a valid id” kimi yerlerde de “1102 – The item provided did not have a valid id” olarak betimleniyor.

Araştırdığımızda ise, hata basitçe; “Sen bana data veriyorsun ama ben ID’yi yakalayıp güncelleme yapamıyorum” diyor. Azure Mobile Service’in PUSH methodu sırasında oluşan bir hata ve sanırım client dil seçeneklerinin bunda da etkisi büyük. Hatanın bulunmaması, yabancıların bunu yaşamadığını gösteriyor en azından :).

Hata?

Azure Mobile Services iOS SDK kullanarak PUSH yapılan method içerisinde Id parametresinin bulunamaması.

Çözüm

Aslında saatlerimi alsa da, çözüm gayet basit. Elinizdeki NSDictionary (ya da farklı bir liste de olur NSMutableArray gibi) listesinde (ki bu AMS üzerinden gelen Model’de olabilir) Id alanının düzgünce tanımlanmış olması gerek. Burada dikkat edilmesi gerekilen şey ise id değil, ID değil, tam olarak Id verilmesi lazım. Liste üzerinde id olsa da ID olsa da yakalamayacaktır.

   func UpdateData(itemToInsert: NSMutableDictionary, complete: ((Bool, NSDictionary) -> Void)!) {
        var isSuccess  = false

        var tid:String? = itemToInsert.valueForKey("Id") as? String
        if tid != nil {
            let uid:NSDictionary = [ "id": tid as String!]
            itemToInsert.addEntriesFromDictionary(uid as [NSObject : AnyObject])
        }

        self.table!.update(itemToInsert as [NSObject : AnyObject],
            completion: {
                updatedItem, error in
                if (error != nil){
                    println(error)
                    isSuccess = false
                    complete(isSuccess, updatedItem);
                }
                else{
                    isSuccess = true
                    complete(isSuccess, updatedItem);
                }
            }
        )
    }

Yukarıdaki kod basitçe gelen listede Id yoksa liste içerisindeki id olarak tanımlı olan veriyi Id olarak atayıp AMS’ye gönderiyor.

Umarım siz de benim gibi bu hata yüzünden saatlerinizi harcamazsınız :).

PS: I’m planning to write this post on english too…


English Version

When you write your project with a new programming language, it’s normal to have some little problems. But sometimes, it’s hard to find an answer to your little annoying bug. “1105 – The item provided did not have a valid id” or “1102 – The item provided did not have a valid id” that kind of bug that irritates you. But its easy to solve.

Problem

Problem is when you are connecting Azure Mobile Services service’s PUSH Method with Azure Mobile Services iOS SDK via swith. It’s not gets your Id value correctly. Even if you use received Model from AMS service.

Answer

It’s ridiculously easy. Send your parameters with Id :D, but it should be named Id (not id, or ID) even it has id field you should add new Id field with same value.

    func UpdateData(itemToInsert: NSMutableDictionary, complete: ((Bool, NSDictionary) -> Void)!) {
        var isSuccess  = false

        var tid:String? = itemToInsert.valueForKey("Id") as? String
        if tid != nil {
            let uid:NSDictionary = [ "id": tid as String!]
            itemToInsert.addEntriesFromDictionary(uid as [NSObject : AnyObject])
        }

        self.table!.update(itemToInsert as [NSObject : AnyObject],
            completion: {
                updatedItem, error in
                if (error != nil){
                    println(error)
                    isSuccess = false
                    complete(isSuccess, updatedItem);
                }
                else{
                    isSuccess = true
                    complete(isSuccess, updatedItem);
                }
            }
        )
    }

It’s normal to have bugs in Azure Mobile Services iOS SDK, it has lots of pros and little cons :).

Keep up the good work!


Versiyon 2.2.0’da bu sıkıntılar düzeltilmiş durumdadır.

Azure Mobile Services Backend ve iOS Frontend

Uzun bir aradan sonra yazmak biraz zor oluyor, yine de yazmadan da olmuyor arkadaşlar. Bu sefer kısa olarak bahsedeceğim ama ileride bol bol, siz sıkılıncaya kadar anlatacağım Azure Mobile Services konusu ile bir Swift iOS Backend olayına bakacağız. Hiç öyle ahım şahım bir olay değil baştan diyeyim hiç heyecan da yapmayın.

Hazır virtual makinem kendini restart ederken size yeni projemden bahsedeyim. Bir iOS app yazmaya çalışıyorum ama nasıl yazıyorum bir anlatabilsem derdimi. Son zamanlarda merakımdan değil, gerçekten bir girişim olabileceğini düşündüğüm için böyle bir şeye atladım diyebilirim.

1- Proje Kısmısı

Proje nedir, ne değildir? Hayatı insana sorgulatan projenin kendisi midir, yoksa sizin bu konudaki eğiliminiz midir? Bir sürü soru var insanın aklında olan prjeyi ortaya çıkarmak sadece. Olası sorunlardan bir tanesini siz daha başlamadan anlatayım; “Projeye o kadar çok yoğunlaşmak ki, projenin amacını unutmak!”

Maalesef start-up ya da kendi projenizi yaparken yaşayacağınız en büyük sorun bu ve bunun da kolay bir kurtuluşu yok. Her gün kendinize Neden bu projeyi yapmayı istedim? gibi bir soru sormanız ve bunu her gün istisnasız yanıtlamanız gerek. Neyse ki kendi projemin “Amaç noktası” bana kendisini her gün tekrar tekrar hatırlatan bir şey olduğundan kendisine odaklanmam bir şekilde mümkün olabildi diyebilirim.

2- Backend Kısmısı (Back-end)

Şimdi bir fikriniz var, ok bunu anladık. Peki bunu nasıl support edeceksiniz? DB1‘niz var mı? Programınızın arayüzü sizin DB ile nasıl haberleşecek? Genel bir API2 mi çıkacaksınız, yoksa WCF3 koyarım yeter ağa mı diyeceksiniz? Hadi WCF koydunuz bunun REST4 API’ye çevrilmesi var. Onu geçtim hani sizin app Asyncronious5 olarak request gönderdiğinde WCF onu destekleyecek mi? Onu da Web API6 ile yaparım diyeceksiniz ama hadi onun da Authentication7 olayı var, Onu nasıl desteklemeyi planlıyorsunuz?

Hepsini boşverin, bu backend olayını tutup da windows bir host içerisine atıp aylık ne kadar para bayılacağınızı hesapladınız mı? Daha proje başalmadan bir de!!

Vay benim başıma kaynar sular dökülsün, daha hayal aşamasında projeyi çöpe atmaya çalışmanızın sebebi, işte böyle şeylerin hesaplanmasıdır arkadaşlar. Bir gecede Facebook, Instagram çıkmıyor tabii. Hele hele hiç scability olaylarına girmiyorum oraya girdiğimde sizinle ayrıca mesajlaşırız :D.

Kişisel olarak bu sorunları Azure Mobile Services ile (REST, Asyncronios, Authenticated) ile çözmeye çalışıyorum.

3- Frontend Kısmısı (Front-end) (iOS APP)

Hadi bir şekilde arka tarafı kotardınız, peki programınızın arayüzü nasıl olacak? Yo yo tasarım demiyorum, ön yüzün arkasındaki programlama dilinden bahsediyorum. Native yani entegre app mı olacak, yoksa bir web sayfası yapıp onu mu gömeceksiniz programın içerisine? Hadi Native oldu, Objective-C mi olacak Swift mi olacak?

Objective-C ve Swift Farkı

Programatik farkları değil başka bir farkı size anlatmak istiyorum. iOS olacak olan app’ın desteklenme arayüzü nasıl olacak? Yani Objective-C olayı yakında sonlanacak ve Apple buna destek vermemeye başlayacak, bunun için zaten geçen yıl Swift dilini ortaya çıkarttılar. Fakat internette azıcık da olsa araştırma yapınca karşınıza Swift ile bir şey çıkmamakta, ne varsa insanlar objective-c kasmış.

Swift dediğimiz dil de iOS 8’den sonra destekmeye başlanan bir dil bunu da belirtelim. Tabii her makinede iOS 8 yok (Bu yılın analizine göre %85 iOS 8 kurulu makinalarda).

Şahsi görüşüm yine burada Swift dilini kullanmak. Çünkü syntax olarak hem kolay, hem de geleceği olan bir dil.

4- Sonuç

Sonuç olarak öyle “Kanka gel de program yazalım”, “Hadi gel start-up olalım”, “Abilerle Mobile App Keyfi” gibi şeyler kolay olmuyor arkadaşlar. Bir hayaliniz olduğunda o hayali mümkün kılmak için gerekli altyapıyı da öğrenmeniz gerek. Ben bu ölçüde şanslı birisiyim ama bu konuda şanslı olmayanlar ne yapabilir? Tabii ki dünyanın sonu değil. Yazılımcı kiralama, ya da projenizi Angel Investor’lara sunma gibi bir yola gidebilirsiniz. Onlar sizin için düzgün teknik yol çizecek ya da çizecek kişileri sizin karşınıza çıkartacaktır.

Yeni bir şeyler üretmekten korkmayın, aksine üretin ve hayatınızda nadiren yaşayacağınız duyguları doay doya yaşayın.

Devamı gelecektir…


  1. Database: Hani şu dataları sakladığımız zımbırtı. 
  2. Application Programming Interface: Kısaca bizim programla esas kodların iletişim kuracağı arayüz. 
  3. Windows Communication Foundation: Çok popüler olan ve bir çok iletişim formatını destekleyen servis programlama altyapısı. 
  4. Representational State Transfer: Kısaca HTTP üzerinden çalışan servis mantığı. 
  5. Programlamada işlemler syncronious (senkronize) ve asyncronious (sırasız) olarak gönderilirler. Sıralı olaylarda önceki bitmeden sonraki işlem yapılmaz. Sırasızlarda aynı anda işlem gönderilir, en kısa sürede biten tamamlanmış olur. 
  6. Web API: Yeni çıkan REST altyapısı ile MVC teknolojisini birleştiren MS servis altyapısı. 
  7. Yetkilendirme: Öyle her şeyi kabul edip de heckırları sisteme davet mi edeceksiniz?