WWDC 2024 Özeti

Apple, teknoloji dünyasında her yıl büyük yankı uyandıran Dünya Geliştiriciler Konferansı (WWDC) etkinliğiyle 2024 yılında da yeniliklerini tanıttı. Bu yılın WWDC etkinliği, yapay zeka destekli özellikler ve yazılım iyileştirmeleri ile dolu geçti. Apple, bu yeniliklerle iPhone, Mac ve iPad kullanıcılarının deneyimini artırmayı hedefliyor. Bu makalede, WWDC 2024’te duyurulan ana yenilikleri ve geliştiriciler için sunulan yeni araçları detaylı bir şekilde inceleyeceğiz.

Yapay Zeka İşlevselliği

WWDC 2024’ün en dikkat çekici duyurularından biri, Apple’ın “Apple Intelligence” olarak adlandırdığı yeni nesil yapay zeka destekli özellikler oldu. Bu özellikler, Apple’ın en son işletim sistemleriyle birlikte iPhone, Mac ve iPad’lere entegre edilecek.

1. Siri: Siri, artık mesajlar, e-postalar, takvim ve fotoğraflar gibi çeşitli kaynaklardan bilgi alabiliyor ve üçüncü parti uygulamalarla da daha geniş bir yelpazede sorulara yanıt verebiliyor. Kullanıcılar artık Siri ile metin üzerinden de etkileşimde bulunabilecekler. Siri’nin bilgiye erişim kapasitesi genişletildi ve artık daha karmaşık görevleri yerine getirebilecek.

2. ChatGPT Entegrasyonu: Apple, sistemlerinin görüntüleri ve belgeleri daha iyi anlaması ve kullanıcıların metin mesajları oluşturup düzenlemesi için ChatGPT teknolojisini entegre ediyor. Bu, kullanıcıların daha doğal ve etkileşimli bir şekilde cihazlarıyla iletişim kurmalarını sağlayacak.

3. Private Cloud Compute: Apple, çoğu yapay zeka işlemini cihaz üzerinde gerçekleştirecek, ancak daha karmaşık görevler Apple’ın sunucularında işlenecek. Bu yeni özellik, Apple’ın kendi sunucu çiplerini kullanarak tüm cihazlarda yapay zeka özelliklerini destekleyecek. Private Cloud Compute, kullanıcı verilerini daha güvenli bir şekilde işleyerek gizlilik endişelerini minimuma indirecek.

4. Uyumlu Cihazlar: Apple Intelligence, iPhone 15 Pro, iPhone 15 Pro Max, ve M1 ve sonrası çipli iPad ve Mac’lerde kullanılabilecek. Bu, daha eski cihaz kullanıcılarının bu yeni yapay zeka özelliklerinden yararlanamayacağı anlamına geliyor, bu da yeni cihazlara geçişi teşvik edebilir.

İşletim Sistemleri

Apple, iOS, macOS, iPadOS ve watchOS için yeni sürümlerini tanıttı ve bu güncellemeler, kullanıcı deneyimini daha da geliştirecek bir dizi yeni özellik sunuyor.

1. iOS 18:

  • Ana Ekran Özelleştirmeleri: iPhone kullanıcıları artık uygulamaları ve widget’ları ana ekranda herhangi bir açık alana yerleştirebilecek.
  • Kilit Ekranı ve Kontrol Merkezi: Kullanıcılar kilit ekranını ve kontrol merkezini daha özgürce özelleştirebilecekler. Kontrol merkezine medya oynatma kontrolleri eklendi.

2. macOS Sequoia:

  • iPhone Ekran Yansıtma: Bu özellik, iPhone ekranının Mac bilgisayarlarda görüntülenmesini ve etkileşime geçilmesini sağlıyor. Kullanıcılar, iPhone’larını Mac’leri üzerinden kontrol edebilecekler.

3. iPadOS 18:

  • Gelişmiş Hesap Makinesi Uygulaması: iPad kullanıcıları nihayet gelişmiş özelliklere sahip bir hesap makinesi uygulamasına kavuşuyor. Math Notes hesap makinesi, kullanıcıların matematiksel ifadeleri yazılı veya metin olarak girip anında çözümünü görmelerini sağlıyor.
  • Smart Script: Bu özellik, el yazısı notları daha okunaklı hale getiriyor ve dijital yazıya dönüştürüyor.

4. watchOS 11:

  • Vitals Uygulaması: Yeni Vitals uygulaması, önemli sağlık metriklerini bir bakışta gösteriyor ve antrenman moduyla kullanıcıların egzersizlerin vücutlarına etkisini daha iyi anlamalarını sağlıyor.

5. VisionOS 2:

  • Geliştirilmiş Jest Kontrolleri: Yeni sürüm, geliştirilmiş jest kontrolleri ve mekansal fotoğraflar ile geliyor. Bu özellikler, kullanıcıların cihazlarıyla daha doğal ve sezgisel bir şekilde etkileşime geçmelerini sağlıyor.

Uygulama Güncellemeleri

Apple, çeşitli uygulamalarında da önemli güncellemeler duyurdu. Bu güncellemeler, kullanıcı deneyimini iyileştirmeyi ve günlük işleri kolaylaştırmayı hedefliyor.

1. Mesajlar: Artık uydu üzerinden mesaj gönderilebilecek. Bu özellik, hücresel ve Wi-Fi bağlantısının olmadığı durumlarda kullanılabilecek ve acil durumlarda büyük fayda sağlayacak.

2. Mail: Mail uygulaması, e-postaları otomatik olarak kişisel, pazarlama ve işlemsel olarak sınıflandırabilecek. Bu, kullanıcıların gelen kutularını daha düzenli ve verimli bir şekilde yönetmelerine yardımcı olacak.

3. Safari: Yeni Highlight özelliği, bir web sayfası hakkında önemli bilgileri yüzeye çıkarabilecek. Örneğin, bir restoranın konumunu veya bir sanatçının parçasını bir makaleden dinlemeyi mümkün kılacak.

4. Notlar ve Telefon Uygulamaları: Kullanıcılar artık sesli kayıt yapabilecek, bu kayıtları yazıya dökebilecek ve özetleyebilecek. Bu, toplantı notları veya ders kayıtları gibi durumlar için büyük bir kolaylık sağlayacak.

5. Image Playground: Yeni bir görüntü oluşturma aracı tanıtıldı. Kullanıcılar bu araçla yaratıcı görseller oluşturabilecekler. Image Playground, AI destekli özellikleriyle kullanıcıların hayal güçlerini daha etkin bir şekilde kullanmalarını sağlayacak.

6. Photos Uygulaması: Geliştirilmiş arama özellikleri ve video kliplerde belirli anları bulma yeteneği eklendi. Kullanıcılar, büyük fotoğraf ve video kütüphanelerinde aradıkları içerikleri daha kolay bulabilecekler.

Geliştiriciler İçin Yenilikler

WWDC 2024, geliştiriciler için de birçok heyecan verici yeniliği beraberinde getirdi. Apple, geliştiricilere daha güçlü araçlar ve daha fazla esneklik sunarak uygulama geliştirme süreçlerini kolaylaştırmayı hedefliyor.

Yeni API’ler ve Geliştirme Araçları

1. Core ML 4: Apple, yeni Core ML sürümünü tanıttı. Core ML 4, daha hızlı ve verimli model eğitimine olanak tanıyor. Geliştiriciler, bu yeni araçlar sayesinde AI modellerini daha etkili bir şekilde uygulamalarına entegre edebilirler.

2. Create ML Güncellemeleri: Create ML, daha kullanıcı dostu bir arayüz ve gelişmiş özelliklerle güncellendi. Geliştiriciler, daha az kod yazarak AI modelleri oluşturabilir ve bu modelleri kolayca test edebilirler.

3. Doğal Dil İşleme (NLP) Geliştirmeleri: Apple, doğal dil işleme alanında da önemli iyileştirmeler sundu. Yeni NLP API’leri, geliştiricilerin uygulamalarında daha etkili ve doğru metin analizleri yapmalarına olanak tanıyor.

Swift ve SwiftUI Gelişmeleri

1. SwiftUI 3: Apple, SwiftUI framework’ünü güncelleyerek geliştiricilere daha esnek ve güçlü araçlar sundu. Bu güncellemeler, geliştiricilerin daha az kod yazarak daha zengin kullanıcı arayüzleri oluşturmasını sağlıyor.

2. Xcode 15: Yeni Xcode sürümü, geliştirme sürecini hızlandıran ve kolaylaştıran birçok yeni özellik ve iyileştirme içeriyor. Gelişmiş hata ayıklama araçları ve performans iyileştirmeleri, büyük projelerde çalışan geliştiriciler için önemli avantajlar sunuyor.

Metal 4 ve Grafik İyileştirmeleri

1. Metal 4: Apple, yeni grafik API’si Metal 4’ü tanıttı. Metal 4, oyun ve yüksek performans gerektiren uygulamalar için daha iyi performans ve verimlilik sağlıyor. Geliştiriciler, Metal 4 ile daha etkileyici grafikler ve hızlı yanıt veren uygulamalar oluşturabilecekler.

2. RealityKit 3: AR uygulamaları için RealityKit framework’ü de güncellendi. Geliştiriciler, RealityKit 3 ile daha gerçekçi ve etkileşimli artırılmış gerçeklik deneyimleri yaratabilecekler.

Sonuç

WWDC 2024, Apple’ın yapay zeka ve yazılım alanındaki yenilikçi adımlarını sergilediği bir etkinlik oldu. Apple Intelligence’ın duyurulması, cihazlarda daha akıllı ve kullanıcı dostu deneyimler sunmayı amaçlıyor. Yeni işletim sistemi güncellemeleri, kullanıcıların cihazlarını daha verimli ve kişisel hale getirmelerini sağlarken, uygulama güncellemeleri günlük görevleri kolaylaştırıyor ve kullanıcı deneyimini iyileştiriyor. Geliştiriciler için sunulan yeni araçlar ve API’ler, uygulama geliştirme süreçlerini hızlandırıyor ve daha yaratıcı çözümler üretmelerini sağlıyor. Apple, bu yeniliklerle hem kullanıcılarını memnun etmeyi hem de rekabetin yoğun olduğu teknoloji pazarında güçlü kalmayı hedefliyor.

Swift Programming Fundamentals: Variables, Constants, Data Types, and Operators

Swift is a versatile and powerful programming language developed by Apple. Whether you’re an experienced programmer from another language or a beginner taking your first steps in the world of coding, mastering Swift’s basic programming concepts is crucial. In this article, we will explore these fundamental concepts, which include variables, constants, data types, and operators.

Variables and Constants:

Variables and constants are used to store and manage data in a Swift program. Let’s start by understanding the difference between these two fundamental concepts.

  • Variables: In Swift, a variable is a storage location in memory that can hold a value or a reference to an object. Variables are mutable, meaning their values can change after they are initially set. To declare a variable, use the var keyword.
var age = 25
age = 26 // You can change the value of a variable.

Here, age is a variable that can store an integer value, and we change its value from 25 to 26.

  • Constants: A constant, on the other hand, is a storage location in memory that holds a value which cannot be changed once it’s set. To declare a constant, use the let keyword.
let pi = 3.14159
// pi = 3.15 // This will result in an error - constants cannot be changed.

In this example, pi is a constant with a value of 3.14159, and any attempt to change its value will result in an error.

Data Types:

Data types are an essential part of Swift, allowing you to specify what kind of data can be stored in a variable or constant. Swift has various built-in data types to choose from:

  • Integers:

Integers represent whole numbers and can be either signed (positive, negative, or zero) or unsigned (only positive or zero). Common integer data types include Int and UInt.

var temperature: Int = -5
var count: UInt = 100

In this example, we declare a variable temperature as a signed integer and a variable count as an unsigned integer.

  • Floating-Point Numbers:

Floating-point numbers are used to represent real numbers, including decimal values. Swift supports both single-precision (Float) and double-precision (Double) floating-point numbers.

var pi: Double = 3.14159
var height: Float = 175.5

Here, we declare a variable pi as a Double and a variable height as a Float.

  • Strings:

Strings are sequences of characters, and they are represented using the String data type. Swift provides many powerful features for working with strings.

var greeting: String = "Hello, World!"

In this example, greeting is a string variable containing the text “Hello, World!”.

  • Booleans:

Boolean data types represent truth values and can be either true or false. The Bool data type is used for boolean variables.

var isRaining: Bool = true

Here, isRaining is a boolean variable set to true, indicating that it is currently raining.

  • Tuples:

Tuples allow you to group multiple values together into a single compound value. Each value in a tuple can have a different data type.

var coordinates: (Double, Double) = (40.7128, -74.0060)

In this example, coordinates is a tuple containing latitude and longitude values as doubles.

Operators:

Operators are used to perform operations on variables, constants, and values in Swift. Swift provides a wide range of operators, including arithmetic, comparison, logical, and more.

  • Arithmetic Operators:

Arithmetic operators allow you to perform mathematical operations on numeric values. Common arithmetic operators in Swift include + (addition), - (subtraction), * (multiplication), / (division), and % (remainder).

let a = 10
let b = 3
let sum = a + b          // 13
let difference = a - b   // 7
let product = a * b      // 30
let quotient = a / b     // 3
let remainder = a % b    // 1

In this example, we use arithmetic operators to perform various mathematical operations.

  • Comparison Operators:

Comparison operators are used to compare two values. They return a boolean result, true or false.

let x = 5
let y = 7
let isEqual = x == y // false
let isNotEqual = x != y // true
let isGreater = x > y // false
let isLessOrEqual = x <= y // true

Here, we use comparison operators to compare the values of x and y.

  • Logical Operators:

Logical operators are used to combine or negate boolean values. Common logical operators in Swift include && (logical AND), || (logical OR), and ! (logical NOT).

let isSunny = true
let isWarm = false
let isPerfectWeather = isSunny && isWarm // false
let isNotRaining = !isSunny // false

In this example, logical operators are used to combine and negate boolean values.

These are just the basics of Swift’s variables, constants, data types, and operators. As you continue your journey in Swift programming, you’ll discover more advanced concepts and features that will allow you to build sophisticated applications for Apple’s ecosystem.

In conclusion, Swift’s flexibility, performance, and readability make it an excellent choice for both beginners and experienced programmers. With a solid understanding of variables, constants, data types, and operators, you’re well on your way to becoming proficient in Swift and unlocking its full potential for your programming projects. Happy coding!

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/thebasics/

DispatchQueue

swift

What is DispatchQueue in Swift, and what is it used for?

DispatchQueue is a class in Swift that is used for managing concurrent tasks in a serial or concurrent manner. It provides a way to manage tasks on a concurrent queue, with different priorities assigned to different tasks.

A queue is a data structure that follows the “first in, first out” (FIFO) principle, where the first item that is added to the queue is the first item to be processed. In the context of DispatchQueue, a queue is used to manage tasks that are executed concurrently.

DispatchQueue provides two types of queues: serial and concurrent. A serial queue executes only one task at a time, while a concurrent queue can execute multiple tasks simultaneously. In addition to managing task execution, DispatchQueue also provides a way to manage the priority of tasks on a queue.

One common use case for DispatchQueue is performing background processing while keeping the UI responsive. For example, if you have a task that takes a long time to complete (such as downloading a large file), you can use DispatchQueue to perform the task in the background, while the UI remains responsive and the user can continue to interact with the app.

Another use case for DispatchQueue is performing parallel processing, where multiple tasks are executed simultaneously across multiple cores. This can help to improve performance and reduce the time required to complete a set of tasks.

In summary, DispatchQueue is a powerful tool for performing asynchronous and concurrent programming in Swift. It provides a way to manage tasks on a concurrent queue, with different priorities assigned to different tasks. This can be used to perform background processing, parallel processing, or any other scenario where asynchronous and concurrent programming is required.

DispatchQueue is a powerful tool that can be used in a variety of scenarios, such as:

  • Background processing: Use DispatchQueue to perform long-running tasks in the background while keeping the UI responsive.
  • Asynchronous network requests: Use DispatchQueue to make network requests in the background and update the UI when the response is received.
  • Parallel processing: Use DispatchQueue to perform computations in parallel across multiple cores.
  • Priority-based execution: Use DispatchQueue to assign different priorities to tasks and manage their execution.
// Create a new concurrent queue with default priority
let concurrentQueue = DispatchQueue(label: "com.example.myConcurrentQueue", qos: .default, attributes: .concurrent)

// Add a task to the queue
concurrentQueue.async {
    // Perform a task
    print("Task 1 started")
    for i in 1...5 {
        print("Task 1 running - \(i)")
    }
    print("Task 1 completed")
}

// Add another task to the queue
concurrentQueue.async {
    // Perform a task
    print("Task 2 started")
    for i in 1...5 {
        print("Task 2 running - \(i)")
    }
    print("Task 2 completed")
}

// Wait for all tasks to complete
concurrentQueue.sync(flags: .barrier) {
    // Perform a task after all other tasks have completed
    print("All tasks completed")
}

What are the possible values for the “qos” argument?

The qos (quality of service) argument can take any of the following values:

  • .userInteractive: High priority level for tasks that involve user interaction.
  • .userInitiated: High priority level for tasks initiated by the user.
  • .utility: Low priority level for background tasks.
  • .background: Low priority level for long-running background tasks.
  • .default: Default priority level, a mix of other priority levels and the most commonly used.

https://developer.apple.com/documentation/dispatch/dispatchqueue

Kullanışlı swift uzantıları

Metni kırpmak

Swift dilinde bir metin dizesini trim etmek (baştaki ve sonundaki boşlukların silinmesi) ve yeni satır karakterlerini (new line characters) silmek için aşağıdaki gibi bir extension yazabilirsiniz:

extension String {
    func trim() -> String {
        return self.trimmingCharacters(in: .whitespacesAndNewlines)
    }
}

Bu extension’ı kullanarak bir metin dizesini trim edebilirsiniz:

let myString = "   Lorem Ipsum   \n"
let trimmedString = myString.trim()

Bu örnekte trim() metodu myString değişkenini trim ederek boşluk ve yeni satır karakterlerini siler ve trimmedString değişkenine atar. Bu sayede trimmedString değişkeninin içeriği sadece “Lorem Ipsum” olur.

Yazıdan tarihe dönüştürme

Swift dilinde bir metin dizesini bir tarihe dönüştüren bir extension yazarken kullanıcının girdiği date format’ını kullanabilmek için aşağıdaki gibi bir kod yazabilirsiniz:

import Foundation

extension String {
    func toDate(dateFormat: String) -> Date? {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = dateFormat
        return dateFormatter.date(from: self)
    }
}

Bu extension’ı kullanarak bir metin dizesini bir tarihe dönüştürebilirsiniz:

let dateString = "2022-01-12"
let date = dateString.toDate(dateFormat: "yyyy-MM-dd")

Bu örnekte toDate(dateFormat:) metodu dateString değişkenini bir tarihe dönüştürür ve date değişkenine atar. Kullanıcı tarafından girilen dateFormat değişkeni “yyyy-MM-dd” olur ve bu sayede date değişkeninin içeriği Date tipinde bir tarih olur.

Swiftte en popüler 10 açık kaynak framework

Swift dilinde en çok kullanılan açık kaynak framework’ler şu şekildedir:

  • Alamofire: HTTP bağlantılarını yönetmek için kullanılan bir framework.
  • Kingfisher: Resimlerin indirilmesi ve cache’lenmesi için kullanılan bir framework.
  • SDWebImage: Web’den resimlerin indirilmesi ve cache’lenmesi için kullanılan bir framework.
  • SwiftyJSON: JSON verilerinin kolayca işlenmesi için kullanılan bir framework.
  • RxSwift: Reactive programlama için kullanılan bir framework.
  • SnapKit: Auto Layout kullanımını kolaylaştıran bir framework.
  • Moya: Networking işlemlerini kolaylaştıran bir framework.
  • Realm: Veritabanı işlemleri için kullanılan bir framework.
  • ObjectMapper: JSON veya diğer veri formatlarının modellere dönüştürülmesi için kullanılan bir framework.

SQL’de önceki ve sonraki kayıt

SQL de önceki ve sonraki kaydı bulmak için hazır bir komut yok ama bunun için şu komutları kullanabiliriz.

id name
17 kayit1
42 kayit2
9 kayit3
77 kayit4
65 kayit5
Önceki


SELECT top 1 name FROM db where id<42 order by id desc


SELECT top 1 name FROM db where id>42 order by id

SQL’de kullanışlı sorgular

Belirli bir kolon adını bütün veri tabanındaki tablolarda aramak için:

(find column name in database tables)


SELECT c.name AS 'Kolon'
,t.name AS 'Tablo'
FROM sys.columns c
JOIN sys.tables t ON c.object_id = t.object_id
WHERE c.name LIKE '%ARANACAK%'
ORDER BY t.name
,c.name;

Tablo ve Viewlerde aramak için:

(find column name in database tables and views)

SELECT COLUMN_NAME AS 'Kolon'
,TABLE_NAME AS 'Tablo'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%ARANACAK%'
ORDER BY Tablo
,Kolon;

Tekrar eden satırları silmek

(remove duplicate rows)

DEMO


CREATE TABLE Table1([col1] varchar(5), [col2] int, [col3] int, [col4] int, [col5] int, [col6] int, [col7] int);

INSERT INTO Table1
([col1], [col2], [col3], [col4], [col5], [col6], [col7])
VALUES
('john', 1, 1, 1, 1, 1, 1),
('john', 1, 1, 1, 1, 1, 1),
('sally', 2, 2, 2, 2, 2, 2),
('sally', 2, 2, 2, 2, 2, 2),
('sally', 2, 2, 2, 3, 2, 2)
;

SELECT * FROM dbo.Table1

;WITH CTE AS(
SELECT [col1], [col2], [col3], [col4], [col5], [col6], [col7],
RN = ROW_NUMBER()OVER(PARTITION BY col1 , col2 , col3 , col4 , col5 , col6 , col7 ORDER BY col1)
FROM dbo.Table1
)
DELETE FROM CTE WHERE RN > 1

SELECT * FROM dbo.Table1

İki tarih arasını ay bazlı olarak listelemek

(get all months and years between two dates)
DEMO


DECLARE 
      @start    DATE = '01.01.2018'
    , @end        DATE = '09.09.2018'

;WITH cte AS 
(
    SELECT dt = DATEADD(DAY, -(DAY(@start) - 1), @start)

    UNION ALL

    SELECT DATEADD(MONTH, 1, dt)
    FROM cte
    WHERE dt < DATEADD(DAY, -(DAY(@end) - 1), @end)
)
SELECT AY = MONTH(DT), YIL = YEAR(DT)
INTO #Dates FROM cte
option (MaxRecursion 0);

SELECT * FROM #Dates

DROP TABLE #Dates

swift 4.2 Dynamic Member Lookup

Swift 4.1 ile birlikte sınıflarımız için subscript metodları tanımlayabiliyorduk, bu şekilde tırnak işareti kullanarak içerikleri özelleştirilmiş olarak çağrılabiliyor.

class Person {
  let name: String
  let age: Int
  private let details: [String: String]

  init(name: String, age: Int, details: [String: String]) {
    self.name = name
    self.age = age
    self.details = details
  }

  subscript(key: String) -> String {
    switch key {
      case "info":
        return "\(name) is \(age) years old."
      default:
        return details[key] ?? ""
    }
  }
}

let details = ["title": "Author", "instrument": "Guitar"]
let me = Person(name: "Cosmin", age: 32, details: details)
me["info"]   // "Cosmin is 32 years old."
me["title"]  // "Author"

yeni gelen @dynamicMemberLookup özelliği ile nasıl olduğuna bakalım

// 1
@dynamicMemberLookup
class Person {
  let name: String
  let age: Int
  private let details: [String: String]

  init(name: String, age: Int, details: [String: String]) {
    self.name = name
    self.age = age
    self.details = details
  }

  // 2
  subscript(dynamicMember key: String) -> String {
    switch key {
      case "info":
        return "\(name) is \(age) years old."
      default:
        return details[key] ?? ""
    }
  }
}

// 3
me.info   // "Cosmin is 32 years old." 
me.title  // "Author"

// 1

Sınıfı tanımlarken @dynamicMemberLookup kullanıyoruz, böylece o sınıf için “dot syntax”ı aktifleştirmiş oluyoruz.

// 2

subscript metodunu tanımlarken parametrenin başına dynamicMember yazıyoruz.

// 3

artık sadece tanımladığımız sınıfın sonuna . (nokta) koyarak property kullanır gibi subscript içeriklerine erişebiliriz.

IOS deep linking ve universal links nedir & nasıl yapılır

Deep linking, türkçe ifade etmeye çalışırsak: derin bağlantılama;

Bildiğiniz gibi, bağlantıları web sitelerin içeriğine ulaşmak için kullanırız,

http://www.ftorun.com gibi veya site içerisindeki bir bağlantı

http://www.ftorun.com/programlama/c-sharp/webconfigde-deger-tutmak.aspx gibi.

Bu adresler sizin direk olarak istediğiniz web sayfayasına ulaşmanızı sağlar.

Ancak bir mobil uygulama geliştirdiysek ve uygulama içerisindeki bir sayfaya direk ulaşma ihtiyacımız olursa ne yapacağız, bu tarz durumlar için URL şemaları tanımlamamız gerekiyor. Uygulamamızı oluştururken mesela myapp şemasını kullanmayı seçtiğimiz zaman myapp:// yazarak herhangi bir başka uygulama üzerinden veya web sitesinden uygulamanızı kolayca açabilirsiniz.

Peki uygulamanızın içerisindeki özel bir içeriğe bu adresten direk ulaşmak istersek ? O zaman da myapp://takvim yazarak içerisine takvim parametresini göndermiş oluruz, burada gönderdiğimiz parametre tamamen bize kalmış bu noktada hiyerarşik düzenli bir yapı kullanarak uygulamanın bütün alanlarına kolayca dışarıdan erişim sağlayabiliriz.

Peki ama bizim bir web sitemiz var ve bu web sitesine uyumlu bir de mobil uygulama yaptık.  Mobil  uygulama üzerinden web sitesine girmeye çalışıldığında da uygulama yüklüyse uygulamanızın ilgili kısmının açılmasını istiyoruz. Eminim bu şekilde çalışan bir çok uygulama görmüşsünüzdür. Şimdi kendi uygulamanızda bunu nasıl gerçekleştirebileceğinizi anlatmaya çalışacağım.

IOS 9dan önce web sitenizi uygulamanız ile entegre etmek için webden mobil cihazı algılayıp kendi custom şemanıza yönlendirme yapmanız gerekiyordu, IOS 9 ile birlikte apple “IOS Universal Link” sistemini getirdi, böylelikle uygulamanız ve web siteniz ortak bir şemayı kullanabilecek.

Peki neler yapmamız gerekiyor.

1. Apple geliştirici sitesinden App Id  Associated Domains düzenlemesi: developer.apple.com sitesine girip App IDs kısmından uygulamanızı daha önceden oluşturmuş olmalısınız, oradan edit seçeneğini seçerek Associated Domains özelliğini aktif yapalım.

2. XCode projemizden uygulamamızın Capabilities kısmını aktif edip ardından aşağıda yer alan domains kısmından applinks:www.mywebsite.com şeklinde ekleyelim.

3.Web sitemizde yapmamız gereken düzenlemeler: web sitemizin bize ait olduğunu ve onu mobil uygulamanın yansıması olarak kullanacağımızı apple’a (bir nevi) inandırmak için uygulamamızın ana dizinine apple-app-site-association isimli bir dosya oluşturmamız gerekiyor.

Kısaca AASA (apple-app-site-association) dosyası da denilen bu dosyanın yapısı şu şekilde olmalı:

{
  "applinks": {
    "apps": [],
    "details": [
      {
        "appID": “JHGFJHHYX.com.facebook.ios",
        "paths": [
          "*"
        ]
      }
    ]
  }
}

Dosyayı oluşturduktan sonra uygulamanın ana dizinine eklediğinizde ve şu adrese girdiğinizde dosyayı gördüğünüzden emin olun

https://<<sitenizin_adresi>>/apple-app-site-association 

ayrıca şunlara dikkat edin:

  • Dosyanın uzantısı olmadığından emin olun, adı direk “apple-app-site-association” olsun.
  • Siteniz HTTPS üzerinde çalışmalı.
  • Sunucunuzda application/json MIME tipi tanımlanmış olsun.
  • dosyanın büyüklüğü 128kb ı geçmemeli.

işiniz bittiğinde bu siteden kontrol edebilirsiniz:

https://branch.io/resources/aasa-validator/#resultsbox

Artık uygulamamıza IOS evrensel bağlantılarını neredeyse kurduk ve web sitemiz ile bağladık geriye bir tek bunu uygulamanın içerisinden yakalamak kaldı.

Uygulama içerisinde appdelegate içinden

application:continueUserActivity:restorationHandler

metodunu kullanarak gelen adres içeriğine ulaşabiliriz,


func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
    print("Continue User Activity called: ")
    if userActivity.activityType == NSUserActivityTypeBrowsingWeb {
        let url = userActivity.webpageURL!
        print(url.absoluteString)
    }
    return true
}

datasource = select() den dönen datarow[] hatası

herhangi bir girdview veya combobox ın datasource’una datarow dizisi göndermek zorunda olduğumuzda hatayla karşılaşırız:

comboBox1.DataSource = dt.Select(“d<30”);

hatanın oluşma sebebi aşağıdaki interface lerden herhangi biriyle implemente olmayan nesneler datagrid gibi kontrollere datasource olarak bağlanamaz.

 

IList interface
IListSource interface
IBindingList interface
IBindingListView interface

Sorunu çözümü önce datasource olarak datatable’ı seçip ardından datatable’ın DefaultView.RowFilter özelliğine koşulumuzu eklemek:

comboBox1.DataSource = dt;
dt.DefaultView.RowFilter = “d<30”;