> ## Documentation Index
> Fetch the complete documentation index at: https://documentation.onesignal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# iOS SDK kurulumu

> OneSignal ile iOS uygulamanıza push bildirimleri ve uygulama içi mesajlar nasıl eklenir.

export const SdkReleasesIframe = ({sdkFilter = undefined, viewMode = undefined, height, ...frameProps}) => {
  const baseUrl = 'https://onesignal.github.io/sdk-releases';
  const buildUrl = (theme, sdkFilter, viewMode) => {
    const url = new URL(baseUrl);
    const params = new URLSearchParams();
    if (theme) {
      params.set('theme', theme);
    }
    if (sdkFilter) {
      params.set('sdk', sdkFilter);
    }
    if (viewMode) {
      params.set('viewMode', viewMode);
    }
    if (params.toString()) {
      url.search = params.toString();
    }
    return url.toString();
  };
  const detectTheme = () => {
    if (document.documentElement.classList.contains('dark')) {
      return 'dark';
    }
    return 'light';
  };
  const [theme, setTheme] = useState('light');
  const [iframeSrc, setIframeSrc] = useState(() => {
    const initialTheme = detectTheme();
    return buildUrl(initialTheme, sdkFilter, viewMode);
  });
  useEffect(() => {
    const currentTheme = detectTheme();
    setTheme(currentTheme);
    setIframeSrc(buildUrl(currentTheme, sdkFilter, viewMode));
    const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
    const handleThemeChange = () => {
      const newTheme = detectTheme();
      setTheme(newTheme);
      setIframeSrc(buildUrl(newTheme, sdkFilter, viewMode));
    };
    if (mediaQuery.addEventListener) {
      mediaQuery.addEventListener('change', handleThemeChange);
    } else {
      mediaQuery.addListener(handleThemeChange);
    }
    window.addEventListener('storage', handleThemeChange);
    const observer = new MutationObserver(handleThemeChange);
    observer.observe(document.documentElement, {
      attributes: true,
      attributeFilter: ['class', 'data-theme']
    });
    return () => {
      if (mediaQuery.removeEventListener) {
        mediaQuery.removeEventListener('change', handleThemeChange);
      } else {
        mediaQuery.removeListener(handleThemeChange);
      }
      window.removeEventListener('storage', handleThemeChange);
      observer.disconnect();
    };
  }, [sdkFilter, viewMode]);
  const getIframeHeight = () => {
    if (viewMode === 'table') {
      return '450';
    }
    if (viewMode === 'mini') {
      return '170';
    }
    return '800';
  };
  const iframeHeight = height || getIframeHeight();
  return <Frame {...frameProps}>
      <iframe src={iframeSrc} width="100%" height={iframeHeight} frameBorder="0" style={{
    border: "none"
  }} title="SDK Releases" key={iframeSrc} />
    </Frame>;
};

<SdkReleasesIframe sdkFilter="ios" viewMode="mini" />

## Genel Bakış

iOS push bildirimleri, iOS uygulamanızda sürekli kullanıcı etkileşimi ve elde tutmayı artırmak için esastır. Kullanıcılarınıza gerçek zamanlı güncellemeler, hatırlatmalar ve kişiselleştirilmiş mesajlar doğrudan iletmenizi sağlayarak uygulamanızın genel kullanıcı deneyimini ve bağlılığını iyileştirir. OneSignal'ın SDK'sını uygulamanızla entegre ederek, bildirimlerinizin iOS cihazlarda sorunsuz bir şekilde iletilmesini sağlamak için Apple Push Notification Service (APNS) avantajlarından yararlanabilirsiniz. Bu kılavuz, SDK'mızı iOS uygulamanıza entegre etme konusunda size yol gösterecektir.

***

## Gereksinimler

* Xcode 14+ ile macOS (kurulum talimatları Xcode 16.2 kullanır)
* iOS 12+, iPadOS 12+ veya iOS 16.2+ çalıştıran Xcode simülatörü olan cihaz
* Yapılandırılmış OneSignal uygulaması ve platformu

### Configure your OneSignal app and platform

Configure your OneSignal app with the platforms you support — Apple (APNs), Google (FCM), Huawei (HMS), and/or Amazon (ADM).

<Note>
  If your organization already has a OneSignal account, [ask to be invited](/docs/en/manage-team-members) to the Organization. Otherwise, [sign up for a free account](https://onesignal.com) to get started.
</Note>

<Accordion title="Step-by-step setup instructions" icon="circle-chevron-down">
  <Steps>
    <Step title="Create or select your app">
      Create a new app by clicking **New App/Website**, or add a platform to an existing app in **Settings > Push & In-App**. Select the platform(s) you want to configure and click **Next: Configure Your Platform**.

      <Frame caption="Setting up your first OneSignal app, Organization, and channel.">
        <img src="https://mintcdn.com/onesignal/BK2J-grzBpDdh8NC/images/dashboard/new-app-org-channel.png?fit=max&auto=format&n=BK2J-grzBpDdh8NC&q=85&s=ee0045484152ed15095f619344aa0564" alt="OneSignal dashboard showing the new app setup flow with Organization name, app name, and channel selection" width="2592" height="1904" data-path="images/dashboard/new-app-org-channel.png" />
      </Frame>
    </Step>

    <Step title="Configure platform credentials">
      Enter the credentials for your platform:

      * **Android**: [Set up Firebase credentials](/docs/en/android-firebase-credentials)
      * **iOS**: [p8 token (recommended)](/docs/en/ios-p8-token-based-connection-to-apns) or [p12 certificate](/docs/en/ios-p12-generate-certificates)
      * **Amazon**: [Generate API key](/docs/en/generate-an-amazon-api-key)
      * **Huawei**: [Authorize OneSignal](/docs/en/authorize-onesignal-to-send-huawei-push)

      Click **Save & Continue** after entering your credentials.
    </Step>

    <Step title="Save your App ID and install the SDK">
      Your **App ID** is displayed on the final screen. Copy and save it — you need it when initializing the SDK. Select your SDK platform, then follow the setup guide.

      <Frame caption="Save your App ID and invite additional team members.">
        <img src="https://mintcdn.com/onesignal/VypVshrFHTBZfEma/images/dashboard/app-id-and-team-invite.png?fit=max&auto=format&n=VypVshrFHTBZfEma&q=85&s=e1e2aab6cca7c4aa6b9a76eff362d5af" alt="OneSignal dashboard showing the App ID and team invite option after setup" width="2592" height="1904" data-path="images/dashboard/app-id-and-team-invite.png" />
      </Frame>
    </Step>
  </Steps>
</Accordion>

***

## iOS kurulumu

iOS uygulamanıza [Rozetler](./badges), [Onaylanmış Teslimat](./confirmed-delivery) ve görseller için destek dahil olmak üzere push bildirimleri eklemek için şu adımları izleyin.

### 1. Uygulama hedefine Push Notifications yeteneği ekleme

[Push Notifications yeteneği](https://developer.apple.com/documentation/UserNotifications/registering-your-app-with-apns#Enable-the-push-notifications-capability), uygulamanızın bir push token kaydettirmesine ve bildirimler almasına olanak tanır.

1. Uygulamanızın `.xcworkspace` dosyasını Xcode'da açın.
2. **Uygulama hedefi > Signing & Capabilities** seçeneğini seçin
3. **+ Capability** tıklayın ve **Push Notifications** yeteneğini ekleyin

<Frame caption="Uygulama hedefine Push Notifications yeteneği verildi.">
  <img src="https://mintcdn.com/onesignal/9_Q1FZLh6C0BFLq-/images/docs/c44118529490f1a7a1245a4c1e8b525d9eb23ab430f035b26b426889fc0486b6-382d57ff7ce1023a863da9f18a97b9a643b1e4b172ec02f1b6661160c362d827-Screenshot_2025-03-10_at_11.19.03_AM.png?fit=max&auto=format&n=9_Q1FZLh6C0BFLq-&q=85&s=e4475a29ab479ec1bd151c809bebd26a" width="2436" height="1324" data-path="images/docs/c44118529490f1a7a1245a4c1e8b525d9eb23ab430f035b26b426889fc0486b6-382d57ff7ce1023a863da9f18a97b9a643b1e4b172ec02f1b6661160c362d827-Screenshot_2025-03-10_at_11.19.03_AM.png" />
</Frame>

### 2. Uygulama hedefine Background Modes yeteneği ekleme

Bu, push bildirimleri geldiğinde uygulamanızın arka planda uyanmasını sağlar.

1. [Background Modes](https://developer.apple.com/documentation/usernotifications/pushing-background-updates-to-your-app) yeteneğini ekleyin
2. **Remote notifications** seçeneğini etkinleştirin

<Frame caption="Uygulama hedefine Remote Notifications arka plan yürütme modu verildi.">
  <img src="https://mintcdn.com/onesignal/YOTSrtBSoqdrJ37A/images/docs/498bd555602023bd8f3ba8e7ee58c8f58eb260accd2f941f64e3e5de07ad99d8-Screenshot_2025-03-10_at_11.20.58_AM.png?fit=max&auto=format&n=YOTSrtBSoqdrJ37A&q=85&s=79995d23ebbcb67d6a2bd0412259f8c0" width="2436" height="1324" data-path="images/docs/498bd555602023bd8f3ba8e7ee58c8f58eb260accd2f941f64e3e5de07ad99d8-Screenshot_2025-03-10_at_11.20.58_AM.png" />
</Frame>

### 3. Uygulama hedefini App Group'a ekleme

[App Groups](https://developer.apple.com/documentation/xcode/configuring-app-groups/#Create-App-Groups-for-all-other-platforms), uygulamanız ile Notification Service Extension arasında veri paylaşımına izin verir. Onaylanmış Teslimat ve Rozetler için gereklidir.

<Tabs>
  <Tab title="Yapılandırılmış bir App Group'unuz YOKSA">
    1. **App Groups** yeteneğini ekleyin
    2. App Groups yeteneğinde **+** işaretine tıklayın
    3. Şu formatta yeni bir container ID ekleyin: `group.your_bundle_id.onesignal`

    * **group.** ve **.onesignal** ön eki ve son ekini koruyun. **`your_bundle_id`** kısmını uygulamanızın bundle identifier'ı ile değiştirin.
    * Örneğin, bundle identifier `com.onesignal.MyApp` ise, container adı `group.com.onesignal.MyApp.onesignal` olacaktır.

    <Frame caption="Uygulama hedefi App Group'un bir parçasıdır.">
      <img src="https://mintcdn.com/onesignal/_KaXe4GQkxsEfa17/images/docs/34e545ae24b0fbdf043fd587102f7039cd1daf65777e84690946f4fb20f739aa-Screenshot_2025-03-10_at_11.22.52_AM.png?fit=max&auto=format&n=_KaXe4GQkxsEfa17&q=85&s=5904f8a6dd4030f5ee7cfa82b3c3eeb8" width="2436" height="1324" data-path="images/docs/34e545ae24b0fbdf043fd587102f7039cd1daf65777e84690946f4fb20f739aa-Screenshot_2025-03-10_at_11.22.52_AM.png" />
    </Frame>

    <Warning> App Group adınız, tüm hedeflerde bundle ID'nizin yazımı ve büyük-küçük harf kullanımıyla tam olarak eşleşmelidir. </Warning>
  </Tab>

  <Tab title="Mevcut bir App Group'unuz VARSA">
    1. **App Target** ve **OneSignalNotificationServiceExtension Target'ın** `Info.plist` dosyasını açın
    2. Her iki hedef için `Info.plist` dosyasına yeni bir özellik ekleyin:

    * **Key:** `OneSignal_app_groups_key`
    * **Value:** Mevcut App Group adınız (örn., `group.your-custom-group-id`)

    ```xml XML theme={null}
    <key>OneSignal_app_groups_key</key>
    <string>group.your-custom-group-id</string>
    ```

    <Frame caption="Uygulama hedefinde özel app group ayarlandı.">
      <img src="https://mintcdn.com/onesignal/RWtLFPeffHrC81wI/images/docs/aa3a061cbf89856a5ee75737e24a3dc7b36e96a866d277e68a170f136cbeae48-Screenshot_2025-03-10_at_11.24.56_AM.png?fit=max&auto=format&n=RWtLFPeffHrC81wI&q=85&s=84e93061a8c82c1ca44cc14b81995d46" width="2788" height="1400" data-path="images/docs/aa3a061cbf89856a5ee75737e24a3dc7b36e96a866d277e68a170f136cbeae48-Screenshot_2025-03-10_at_11.24.56_AM.png" />
    </Frame>

    <Warning>
      `OneSignal_app_groups_key` değerini **hem** App Target **hem de** OneSignalNotificationServiceExtension Target'ın `Info.plist` dosyasında güncellediğinizden emin olun!
    </Warning>
  </Tab>
</Tabs>

### 4. Notification Service Extension ekleme

[Notification Service Extension (NSE)](https://developer.apple.com/documentation/usernotifications/modifying-content-in-newly-delivered-notifications), zengin bildirimler ve Onaylanmış Teslimat analitiğini etkinleştirir.

1. Xcode'da: **File > New > Target...**
2. **Notification Service Extension** seçin, ardından **Next** tıklayın.
3. Ürün adını `OneSignalNotificationServiceExtension` olarak ayarlayın ve **Finish** tuşuna basın.
4. Activate scheme isteminde **Don't Activate** seçeneğine basın.

<Frame caption="Notification Service Extension hedefini seçin.">
  <img src="https://mintcdn.com/onesignal/_KaXe4GQkxsEfa17/images/docs/3ba0018a789c52c5c8d2f485d31e0ba0e07398d7abf5980215e4d4d2a2e0e948-Screenshot_2025-03-10_at_11.27.24_AM.png?fit=max&auto=format&n=_KaXe4GQkxsEfa17&q=85&s=c5c5399c449ec5201dfb3342f9eeb538" width="2788" height="1400" data-path="images/docs/3ba0018a789c52c5c8d2f485d31e0ba0e07398d7abf5980215e4d4d2a2e0e948-Screenshot_2025-03-10_at_11.27.24_AM.png" />
</Frame>

<Frame caption="Notification Service Extension'a ad verin.">
  <img src="https://mintcdn.com/onesignal/RWtLFPeffHrC81wI/images/docs/afb3452c5ef95511c7ca4ef50c36ea2e5c205030c35d7ea066270a40f9ec3234-Screenshot_2025-03-10_at_11.27.47_AM.png?fit=max&auto=format&n=RWtLFPeffHrC81wI&q=85&s=ed78140e080cf8aad1e727d819bac8ad" width="2788" height="1400" data-path="images/docs/afb3452c5ef95511c7ca4ef50c36ea2e5c205030c35d7ea066270a40f9ec3234-Screenshot_2025-03-10_at_11.27.47_AM.png" />
</Frame>

<Frame caption="Uygulama hedefinizde hata ayıklamaya devam etmek için aktivasyonu iptal edin.">
  <img src="https://mintcdn.com/onesignal/4HyuQPBpu-4xjmQC/images/docs/cfc756b0273e5973af42a4a2933f3efcb5c4aeaf7ca5cec6bd196e8c01250f62-Screenshot_2025-03-10_at_11.28.01_AM.png?fit=max&auto=format&n=4HyuQPBpu-4xjmQC&q=85&s=03f43bf27f643419eba14e438f3f07a1" width="2788" height="1400" data-path="images/docs/cfc756b0273e5973af42a4a2933f3efcb5c4aeaf7ca5cec6bd196e8c01250f62-Screenshot_2025-03-10_at_11.28.01_AM.png" />
</Frame>

OneSignalNotificationServiceExtension **Minimum Deployment Target** değerini ana uygulamanızla eşleşecek şekilde ayarlayın (iOS 15+ önerilir).

<Info> CocoaPods kullanıyorsanız, dağıtım sürümünü Podfile dosyanızda da ayarlayın. </Info>

<Frame caption="Ana uygulama ile aynı dağıtım hedefini ayarlayın.">
  <img src="https://mintcdn.com/onesignal/tNi1OgLc_p9hiq7_/images/docs/17cc605c99d890e50e83e45bfbe89ce5c7b226b6b000b9aa739d70a1bf41c231-Screenshot_2025-03-10_at_11.29.35_AM.png?fit=max&auto=format&n=tNi1OgLc_p9hiq7_&q=85&s=48f72f24a321d60e6623b440b591987a" width="2788" height="1400" data-path="images/docs/17cc605c99d890e50e83e45bfbe89ce5c7b226b6b000b9aa739d70a1bf41c231-Screenshot_2025-03-10_at_11.29.35_AM.png" />
</Frame>

### 5. NSE hedefini app group'a ekleme

Adım 3'te eklediğiniz App Group ID'yi kullanın.

1. **OneSignalNotificationServiceExtension > Signing & Capabilities** bölümüne gidin
2. **App Groups** ekleyin
3. Tam olarak aynı group ID'yi ekleyin

<Warning>
  Özel bir App Group adı kullanıyorsanız ve `group.your_bundle_id.onesignal` kullanmıyorsanız, App Group ID'nizi hem App Target hem de OneSignalNotificationServiceExtension Target'ın `Info.plist` dosyasına eklediğinizden emin olun! Daha fazla bilgi için [3. adıma](#3-add-app-target-to-app-group) bakın.
</Warning>

<Frame caption="NSE artık uygulama hedefinizle aynı app group'a ait.">
  <img src="https://mintcdn.com/onesignal/Xl2NHJvxakrK4JbL/images/docs/e763a62e9ab8457d16fbb9a2c1f9344bb73a5a5d40fa920bbba18e040128a229-Screenshot_2025-03-10_at_11.30.24_AM.png?fit=max&auto=format&n=Xl2NHJvxakrK4JbL&q=85&s=096adcb29f4d4d61bf51a0b9caed695d" width="2788" height="1400" data-path="images/docs/e763a62e9ab8457d16fbb9a2c1f9344bb73a5a5d40fa920bbba18e040128a229-Screenshot_2025-03-10_at_11.30.24_AM.png" />
</Frame>

### 6. NSE kodunu güncelleme

1. **OneSignalNotificationServiceExtension** klasörüne gidin
2. `NotificationService.swift` veya `NotificationService.m` dosyasının içeriğini aşağıdakilerle değiştirin:

<Frame caption="NotificationService dosyanıza gidin.">
  <img src="https://mintcdn.com/onesignal/RWtLFPeffHrC81wI/images/docs/ab43a237c660116a9547fe9b53ab2594181f6c04297b5a7236d21764122d26b3-Screenshot_2025-03-10_at_11.31.52_AM.png?fit=max&auto=format&n=RWtLFPeffHrC81wI&q=85&s=917ea1a94b0485f5f14d3fe8d28886d4" width="2788" height="1400" data-path="images/docs/ab43a237c660116a9547fe9b53ab2594181f6c04297b5a7236d21764122d26b3-Screenshot_2025-03-10_at_11.31.52_AM.png" />
</Frame>

<CodeGroup>
  ```swift Swift theme={null}
  import UserNotifications
  import OneSignalExtension

  class NotificationService: UNNotificationServiceExtension {
      var contentHandler: ((UNNotificationContent) -> Void)?
      var receivedRequest: UNNotificationRequest!
      var bestAttemptContent: UNMutableNotificationContent?

      // Note this extension only runs when `mutable_content` is set
      // Setting an attachment or action buttons automatically sets the property to true
      override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
          self.receivedRequest = request
          self.contentHandler = contentHandler
          self.bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)

          if let bestAttemptContent = bestAttemptContent {
              // DEBUGGING: Uncomment the 2 lines below to check this extension is executing
  //            print("Running NotificationServiceExtension")
  //            bestAttemptContent.body = "[Modified] " + bestAttemptContent.body

              OneSignalExtension.didReceiveNotificationExtensionRequest(self.receivedRequest, with: bestAttemptContent, withContentHandler: self.contentHandler)
          }
      }

      override func serviceExtensionTimeWillExpire() {
          // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used.
          if let contentHandler = contentHandler, let bestAttemptContent =  bestAttemptContent {
              OneSignalExtension.serviceExtensionTimeWillExpireRequest(self.receivedRequest, with: self.bestAttemptContent)
              contentHandler(bestAttemptContent)
          }
      }
  }
  ```

  ```objc Objective-C theme={null}
  #import <OneSignalExtension/OneSignalExtension.h>
  #import "NotificationService.h"

  @interface NotificationService ()

  @property (nonatomic, strong) void (^contentHandler)(UNNotificationContent *contentToDeliver);
  @property (nonatomic, strong) UNNotificationRequest *receivedRequest;
  @property (nonatomic, strong) UNMutableNotificationContent *bestAttemptContent;

  @end

  @implementation NotificationService

  // Note, this extension only runs when mutable-content is set
  // Setting an attachment or action buttons automatically adds this
  - (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
      self.receivedRequest = request;
      self.contentHandler = contentHandler;
      self.bestAttemptContent = [request.content mutableCopy];

      // DEBUGGING: Uncomment the 2 lines below and comment out the one above to ensure this extension is executing
  //     NSLog(@"Running NotificationServiceExtension");
  //     self.bestAttemptContent.body = [@"[Modified] " stringByAppendingString:self.bestAttemptContent.body];

      [OneSignalExtension didReceiveNotificationExtensionRequest:self.receivedRequest
                         withMutableNotificationContent:self.bestAttemptContent
                                     withContentHandler:self.contentHandler];
  }

  - (void)serviceExtensionTimeWillExpire {
      // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used.

      [OneSignalExtension serviceExtensionTimeWillExpireRequest:self.receivedRequest withMutableNotificationContent:self.bestAttemptContent];

      self.contentHandler(self.bestAttemptContent);
  }

  @end
  ```
</CodeGroup>

OneSignal paketi yüklü olmadığı için bir hata görmelisiniz. Bu, bir sonraki adımda çözülecektir.

<Frame caption="Bu dosya, bir sonraki adımda paketi yükleyene kadar hata gösterir.">
  <img src="https://mintcdn.com/onesignal/4HyuQPBpu-4xjmQC/images/docs/d3d8900d922b3bcaa44c0012e152ca233404d4c80d8bd427792c456aab798d06-Screenshot_2025-03-10_at_11.32.12_AM.png?fit=max&auto=format&n=4HyuQPBpu-4xjmQC&q=85&s=11c4114e117cb74099d9a063d6d11ebc" width="2788" height="1400" data-path="images/docs/d3d8900d922b3bcaa44c0012e152ca233404d4c80d8bd427792c456aab798d06-Screenshot_2025-03-10_at_11.32.12_AM.png" />
</Frame>

***

## SDK kurulumu

Bu bölüm, OneSignal'ın temel özelliklerini entegre etmeniz konusunda size rehberlik edecektir. Bu bölümün sonunda, uygulama içi mesajları tetiklemenize ve push bildirimleri almanıza olanak tanıyan SDK'mızla temel bir entegrasyona sahip olacaksınız.

### 1. SDK ekleme

SDK'mızı Xcode Package Dependencies Manager (Swift Package Manager) veya CocoaPods kullanarak ekleyin. 4 mevcut kütüphane vardır. [Uygulama içi mesajlar](./in-app-messages-setup) ve/veya Konum takibi istemiyorsanız, bu paketleri atlayabilirsiniz.

| Kütüphane                  |                 Hedef                 |  Gereklilik  |
| -------------------------- | :-----------------------------------: | :----------: |
| **OneSignalExtension**     | OneSignalNotificationServiceExtension |       ✅      |
| **OneSignalFramework**     |                  App                  |       ✅      |
| **OneSignalInAppMessages** |                  App                  |   Önerilen   |
| **OneSignalLocation**      |                  App                  | İsteğe bağlı |

<Tabs>
  <Tab title="Xcode Package Dependencies">
    **File > Add Package Dependencies...** bölümüne gidin ve OneSignal SDK deposunun URL'sini girin:

    `https://github.com/OneSignal/OneSignal-XCFramework`

    **onesignal-xcframework** paketini seçin ve **Add Package** tıklayın.

    OneSignal-XCFramework için Package Products seçin.

    * **Önemli**: **OneSignalExtension**'ı OneSignalNotificationServiceExtension Target'a ekleyin.
    * **OneSignalFramework**'ü App Target'ınıza ekleyin.
    * Uygulama içi mesajlar (önerilen) ve/veya konum takibi kullanmayı planlıyorsanız, bu paketleri de App Target'ınıza ekleyin.

    <Frame caption="Uygulamanız konum takibi gerektirmiyorsa, bu örnekte gösterildiği gibi paketi kaldırabilirsiniz.">
      <img src="https://mintcdn.com/onesignal/YOTSrtBSoqdrJ37A/images/docs/4b094820f8ece0b91de19a2a64c09820c23bf8d478bb67fe862ac18254b5d52e-package_dependancies.png?fit=max&auto=format&n=YOTSrtBSoqdrJ37A&q=85&s=a017955414e52f224298de55a8211e13" width="2396" height="1680" data-path="images/docs/4b094820f8ece0b91de19a2a64c09820c23bf8d478bb67fe862ac18254b5d52e-package_dependancies.png" />
    </Frame>

    Daha fazla ayrıntı için [Apple'ın Adding package dependencies belgesine](https://developer.apple.com/documentation/xcode/adding-package-dependencies-to-your-app#Add-a-package-dependency) bakın.
  </Tab>

  <Tab title="CocoaPods">
    **Gereksinimler**: CocoaPods 1.16.2+ (Kurulum talimatları CocoaPods 1.16.2 kullanır).

    `Podfile` dosyanızı açın ve aşağıdakileri ekleyin:

    ```ruby Podfile theme={null}
      # If platform is uncommented, set to the same value as your minimum deployment target in Xcode
      # platform :ios, '15.0'

      target 'your_project_name' do
        pod 'OneSignal/OneSignal', '>= 5.2.9', '< 6.0'
        # If your app does not use In-App messages, you can remove this:
        pod 'OneSignal/OneSignalInAppMessages', '>= 5.2.9', '< 6.0'
        # If your app does not use CoreLocation, you can remove this:
        pod 'OneSignal/OneSignalLocation', '>= 5.2.9', '< 6.0'
        # Your other pods here
      end

      target 'OneSignalNotificationServiceExtension' do
        pod 'OneSignal/OneSignal', '>= 5.2.9', '< 6.0'
      end
    ```

    Bağımlılıkları ana uygulama hedefi ve OneSignalNotificationServiceExtension hedefine ekleyin. `platform` satırının yorumu kaldırılmışsa, Xcode'daki minimum dağıtım hedefi ile aynı değer olduğundan emin olun.

    OneSignal iOS SDK pod'unu indirmek ve projenize eklemek için aşağıdaki komutu çalıştırın:

    `pod repo update && pod install`

    Kurulum tamamlandıktan sonra, projenizin adını taşıyan *XCWorkspace* dosyasını açtığınızdan emin olun (örn., `<proje-adı>.xcworkspace`)

    <Note>
      OneSignal iOS SDK pod'unu kullanırken, projeyi açmak için yalnızca `.xcworkspace` dosyasını kullanmalısınız.
    </Note>

    Aşağıdaki hatalarla karşılaşabilirsiniz, bunları nasıl çözebileceğiniz aşağıda açıklanmıştır.

    <Accordion
      title="ArgumentError - \[Xcodeproj] Unable to find compatibility version string for
object version `70`."
    >
      CocoaPods, Xcode proje dosyalarınızı okumak için `xcodeproj` Ruby gem'ine dayanır. Şu anda, en son `xcodeproj` sürümü Xcode 16 tarafından tanıtılan object version 70'i tanımamaktadır. Bu nedenle CocoaPods `.xcodeproj` dosyanızı açmaya çalıştığında, bu hatayla çöker.

      1. Xcode'u kapatın.
      2. Projenizin `ios/<uygulamanız>.xcodeproj/project.pbxproj` dosyasına gidin.
      3. Bu satırı değiştirin: `objectVersion = 70;`
      4. Bununla değiştirin: `objectVersion = 55;`
      5. Kaydedin, kapatın ve `cd ios pod install cd ..` komutunu tekrar çalıştırın
    </Accordion>
  </Tab>
</Tabs>

### 2. SDK'yı başlatma

Xcode arayüz kurulumunuza bağlı olarak, bu seçenekleri izleyerek OneSignal'ı başlatın.

<Tabs>
  <Tab title="SwiftUI">
    SwiftUI arayüzü kullanıyorsanız, `<APP_NAME>App.swift` dosyanıza gidin ve sağlanan yöntemlerle OneSignal'ı başlatın.

    `YOUR_APP_ID` değerini OneSignal panonuzda **Settings > [Keys & IDs](./keys-and-ids)** bölümünde bulunan OneSignal App ID'niz ile değiştirin. OneSignal uygulamasına erişiminiz yoksa, [Ekip Üyelerinizden](./manage-team-members) sizi davet etmelerini isteyin.

    <CodeGroup>
      ```swift Swift theme={null}
      import SwiftUI
      import OneSignalFramework

      @main
      struct YOURAPP_NAME: App {
        //Connect the SwiftUI app to the UIKit app delegate
          @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate

          var body: some Scene {
              WindowGroup {
                  ContentView()
              }
          }
      }

      class AppDelegate: NSObject, UIApplicationDelegate {
          func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {

             // Enable verbose logging for debugging (remove in production)
             OneSignal.Debug.setLogLevel(.LL_VERBOSE)
             // Initialize with your OneSignal App ID
             OneSignal.initialize("YOUR_APP_ID", withLaunchOptions: launchOptions)
             // Use this method to prompt for push notifications.
             // We recommend removing this method after testing and instead use In-App Messages to prompt for notification permission.
             OneSignal.Notifications.requestPermission({ accepted in
               print("User accepted notifications: \(accepted)")
             }, fallbackToSettings: false)

             return true
          }
      }
      ```
    </CodeGroup>
  </Tab>

  <Tab title="Storyboard">
    Storyboard arayüzü kullanıyorsanız, AppDelegate dosyanıza gidin ve sağlanan yöntemlerle OneSignal'ı başlatın.

    `YOUR_APP_ID` değerini OneSignal panonuzda **Settings > [Keys & IDs](./keys-and-ids)** bölümünde bulunan OneSignal App ID'niz ile değiştirin. OneSignal uygulamasına erişiminiz yoksa, [Ekip Üyelerinizden](./manage-team-members) sizi davet etmelerini isteyin.

    <CodeGroup>
      ```swift Swift theme={null}
      //AppDelegate.swift
      import UIKit
      import OneSignalFramework

      @UIApplicationMain
      class AppDelegate: UIResponder, UIApplicationDelegate {

      func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions:
      [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        // Enable verbose logging for debugging (remove in production)
        OneSignal.Debug.setLogLevel(.LL_VERBOSE)
        // Initialize with your OneSignal App ID
        OneSignal.initialize("YOUR_APP_ID", withLaunchOptions: launchOptions)

        // Use this method to prompt for push notifications.
        // We recommend removing this method after testing and instead use In-App Messages to prompt for notification permission.
        OneSignal.Notifications.requestPermission({ accepted in
          print("User accepted notifications: \(accepted)")
        }, fallbackToSettings: false)


        return true
      }

      // Remaining contents of your AppDelegate Class...
      }
      ```

      ```objc Objective-C theme={null}
      #import <OneSignalFramework/OneSignalFramework.h>

      @implementation AppDelegate

      - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

        // Enable verbose logging for debugging (remove in production)
        [OneSignal.Debug setLogLevel:ONE_S_LL_VERBOSE];
        // Initialize with your OneSignal App ID
        [OneSignal initialize:@"YOUR_APP_ID" withLaunchOptions:launchOptions];
        // Use this method to prompt for push notifications.
        // We recommend removing this method after testing and instead use In-App Messages to prompt for notification permission.
        [OneSignal.Notifications requestPermission:^(BOOL accepted) {
          NSLog(@"User accepted notifications: %d", accepted);
        } fallbackToSettings:false];

        // Login your customer with externalId
        // [OneSignal login:@"EXTERNAL_ID"];

        return YES;
      }
      ```
    </CodeGroup>
  </Tab>
</Tabs>

***

## OneSignal SDK entegrasyonunu test etme

Bu kılavuz, push bildirimleri, abonelik kaydı ve uygulama içi mesajlaşmayı test ederek OneSignal SDK entegrasyonunuzun doğru çalıştığını doğrulamanıza yardımcı olur.

### Mobil abonelikleri kontrol etme

<Steps>
  <Step title="Uygulamanızı test cihazında başlatın.">
    Başlatma sırasında `requestPermission` yöntemini eklediyseniz, yerel push izin istemi otomatik olarak görünmelidir.

    <Frame caption="iOS ve Android push izin istemleri">
      <img src="https://mintcdn.com/onesignal/RWtLFPeffHrC81wI/images/docs/a90c2cc443f5fe9e7c80368c680a16cf1ca6203f7b28a0a6eec212add8510f80-Untitled_design_11.png?fit=max&auto=format&n=RWtLFPeffHrC81wI&q=85&s=96dbf224b3ae93b3d814712cdc5416ba" width="1920" height="1080" data-path="images/docs/a90c2cc443f5fe9e7c80368c680a16cf1ca6203f7b28a0a6eec212add8510f80-Untitled_design_11.png" />
    </Frame>
  </Step>

  <Step title="OneSignal panonuzu kontrol edin">
    İstemi kabul etmeden önce OneSignal panosunu kontrol edin:

    * **Audience > Subscriptions** bölümüne gidin.
    * "Never Subscribed" durumuna sahip yeni bir girdi görmelisiniz.

    <Frame caption="'Never Subscribed' durumuna sahip aboneliği gösteren pano">
      <img src="https://mintcdn.com/onesignal/Xl2NHJvxakrK4JbL/images/docs/f19fa5ada3572ce14447bb5639744e9da75cd7a3ab43ecc1a057f2ed92b38e6f-Screenshot_2025-03-16_at_14.55.39.png?fit=max&auto=format&n=Xl2NHJvxakrK4JbL&q=85&s=b04ca3217e22155841b500a55c7f1511" width="1588" height="976" data-path="images/docs/f19fa5ada3572ce14447bb5639744e9da75cd7a3ab43ecc1a057f2ed92b38e6f-Screenshot_2025-03-16_at_14.55.39.png" />
    </Frame>
  </Step>

  <Step title="Uygulamaya dönün ve istemde Allow'a dokunun." />

  <Step title="OneSignal panosu Subscriptions sayfasını yenileyin.">
    Abonelik durumu artık **Subscribed** göstermelidir.

    <Frame caption="'Subscribed' durumuna sahip aboneliği gösteren pano">
      <img src="https://mintcdn.com/onesignal/0qspEXXeJ8zJbkJ-/images/docs/85b0376cdcc6f93fb7b3895b18cd1788d2342776d7995909881e5c64dd40fb62-Screenshot_2025-03-16_at_15.57.34.png?fit=max&auto=format&n=0qspEXXeJ8zJbkJ-&q=85&s=c6abec64d102b84e30f6c9c0327808ef" width="1588" height="976" data-path="images/docs/85b0376cdcc6f93fb7b3895b18cd1788d2342776d7995909881e5c64dd40fb62-Screenshot_2025-03-16_at_15.57.34.png" />
    </Frame>

    <Check>Başarıyla bir [mobil abonelik](/docs/en/subscriptions) oluşturdunuz.
    Mobil abonelikler, kullanıcılar uygulamanızı bir cihazda ilk kez açtığında veya aynı cihazda uygulamanızı kaldırıp yeniden yüklediklerinde oluşturulur.</Check>
  </Step>
</Steps>

### Test aboneliklerini ayarlama

Test abonelikleri, mesaj göndermeden önce bir push bildirimini test etmek için yararlıdır.

<Steps>
  <Step title="Test Users'a ekleyin.">
    Panoda, aboneliğin yanında **Options (üç nokta)** düğmesine tıklayın ve **Add to Test Users** seçeneğini seçin.

    <Frame caption="Test Users'a bir cihaz ekleme">
      <img src="https://mintcdn.com/onesignal/NCUI56Tiw7V-s0dT/images/dashboard/add-to-test-subscriptions.png?fit=max&auto=format&n=NCUI56Tiw7V-s0dT&q=85&s=2455d4cd74ea4ad686f76730cd95bbaa" width="1188" height="742" data-path="images/dashboard/add-to-test-subscriptions.png" />
    </Frame>
  </Step>

  <Step title="Aboneliğinizi adlandırın.">
    **test users sekmesinde** daha sonra cihazınızı kolayca tanımlayabilmeniz için aboneliği adlandırın.
  </Step>

  <Step title="Bir test kullanıcıları segmenti oluşturun.">
    **Audience > Segments > New Segment** bölümüne gidin.
  </Step>

  <Step title="Segmenti adlandırın.">
    Segmenti `Test Users` olarak adlandırın (ad önemlidir çünkü daha sonra kullanılacaktır).
  </Step>

  <Step title="Test Users filtresini ekleyin ve Create Segment tıklayın.">
    <Frame caption="Test Users filtresi ile bir 'Test Users' segmenti oluşturma">
      <img src="https://mintcdn.com/onesignal/NCUI56Tiw7V-s0dT/images/dashboard/create-test-users-segment.png?fit=max&auto=format&n=NCUI56Tiw7V-s0dT&q=85&s=91b8a021be6e83662854e68ec3e1da04" width="1188" height="742" data-path="images/dashboard/create-test-users-segment.png" />
    </Frame>

    <Check>Başarıyla bir test kullanıcıları segmenti oluşturdunuz.
    Artık bu bireysel cihaza ve test kullanıcısı gruplarına mesaj göndermeyi test edebiliriz.</Check>
  </Step>
</Steps>

### API üzerinden test push gönderme

<Steps>
  <Step title="App API Key ve App ID'nizi alın.">
    OneSignal panonuzda **Settings > [Keys & IDs](/docs/en/keys-and-ids)** bölümüne gidin.
  </Step>

  <Step title="Sağlanan kodu güncelleyin.">
    Aşağıdaki koddaki `YOUR_APP_API_KEY` ve `YOUR_APP_ID` değerlerini gerçek anahtarlarınızla değiştirin. Bu kod, daha önce oluşturduğumuz `Test Users` segmentini kullanır.

    ```curl theme={null}
    curl -X \
    POST --url 'https://api.onesignal.com/notifications' \
     --header 'content-type: application/json; charset=utf-8' \
     --header 'authorization: Key YOUR_APP_API_KEY' \
     --data \
     '{
      "app_id": "YOUR_APP_ID",
      "target_channel": "push",
      "name": "Testing basic setup",
      "headings": {
      	"en": "👋"
      },
      "contents": {
        "en": "Hello world!"
      },
      "included_segments": [
        "Test Users"
      ],
      "ios_attachments": {
        "onesignal_logo": "https://avatars.githubusercontent.com/u/11823027?s=200&v=4"
      },
      "big_picture": "https://avatars.githubusercontent.com/u/11823027?s=200&v=4"
    }'
    ```
  </Step>

  <Step title="Kodu çalıştırın.">
    Kodu terminalinizde çalıştırın.
  </Step>

  <Step title="Görselleri ve onaylanmış teslimatı kontrol edin.">
    Tüm kurulum adımları başarıyla tamamlandıysa, test abonelikleri görsel içeren bir bildirim almalıdır:

    <Frame caption="iOS ve Android'de görsel içeren push bildirimi">
      <img src="https://mintcdn.com/onesignal/Z6xkXGfmy814If53/images/docs/e4e3e812eb6841ff11795a6ee0ea36eff483920ea9266733d6948ed34df3def3-Untitled_design_9.png?fit=max&auto=format&n=Z6xkXGfmy814If53&q=85&s=9bf6f4a73e38ec424b8cfec75a474a26" width="1200" height="800" data-path="images/docs/e4e3e812eb6841ff11795a6ee0ea36eff483920ea9266733d6948ed34df3def3-Untitled_design_9.png" />
    </Frame>

    <Info>Görseller daraltılmış bildirim görünümünde küçük görünecektir. Tam görseli görmek için bildirimi genişletin.</Info>
  </Step>

  <Step title="Onaylanmış teslimatı kontrol edin.">
    Panonuzda **Delivery > Sent Messages** bölümüne gidin, ardından istatistikleri görmek için mesaja tıklayın.

    **confirmed** istatistiğini görmelisiniz, bu cihazın push'u aldığı anlamına gelir.
    <Check>API'miz aracılığıyla bir segmente başarıyla bir bildirim gönderdiniz.</Check>

    <Warning>
      * Görsel almadınız mı? [Notification Service Extension'ınız](#ios-setup) eksik olabilir.
      * Onaylanmış teslimat yok mu? Sorun giderme kılavuzunu [buradan](/docs/en/confirmed-delivery#troubleshooting-confirmed-delivery) inceleyin.
      * Sorun mu yaşıyorsunuz? Api isteğini ve uygulama başlatmanın başından sonuna kadar olan log'u bir `.txt` dosyasına kopyalayın. Ardından her ikisini de `support@onesignal.com` ile paylaşın.
    </Warning>
  </Step>
</Steps>

### Uygulama içi mesaj gönderme

[Uygulama içi mesajlar](/docs/en/in-app-messages-setup), kullanıcılar uygulamanızı kullanırken onlarla iletişim kurmanıza olanak tanır.

<Steps>
  <Step title="Uygulamanızı cihazda kapatın veya arka plana alın.">
    Bunun nedeni, kullanıcıların yeni bir oturum başlamadan *önce* uygulama içi kitle kriterlerini karşılaması gerektiğidir. OneSignal'da, kullanıcı uygulamanızı en az 30 saniye arka planda veya kapalı kaldıktan sonra açtığında yeni bir oturum başlar. Daha fazla ayrıntı için [uygulama içi mesajların nasıl görüntülendiği](/docs/en/in-app-messages-setup#how-are-iams-displayed%3F) kılavuzumuza bakın.
  </Step>

  <Step title="Bir uygulama içi mesaj oluşturun.">
    * OneSignal panonuzda **Messages > In-App > New In-App** bölümüne gidin.
    * **Welcome** mesajını bulun ve seçin.
    * Kitlenizi daha önce kullandığımız **Test Users** segmenti olarak ayarlayın.

    <Frame caption="Bir uygulama içi mesajla 'Test Users' segmentini hedefleme">
      <img src="https://mintcdn.com/onesignal/3zq1PvSaqvUE2bIx/images/docs/2979dfb2c6e0711669ebe737d78d975dcfed9f8117bdd68846255b9fc91e4771-Screenshot_2025-03-17_at_14.56.23.png?fit=max&auto=format&n=3zq1PvSaqvUE2bIx&q=85&s=f705ee679a9248dab378305e15fa24bf" width="1410" height="752" data-path="images/docs/2979dfb2c6e0711669ebe737d78d975dcfed9f8117bdd68846255b9fc91e4771-Screenshot_2025-03-17_at_14.56.23.png" />
    </Frame>
  </Step>

  <Step title="İsterseniz mesaj içeriğini özelleştirin.">
    <Frame caption="Uygulama içi Welcome mesajının örnek özelleştirmesi">
      <img src="https://mintcdn.com/onesignal/YOTSrtBSoqdrJ37A/images/docs/4c511ebdb04f33055556b9969bab8deee0d62154573cf0b41ffb25cc8431e7c0-Screenshot_2025-03-17_at_14.59.37.png?fit=max&auto=format&n=YOTSrtBSoqdrJ37A&q=85&s=6134cc70e578d1055f770edcbad47efb" width="1646" height="1070" data-path="images/docs/4c511ebdb04f33055556b9969bab8deee0d62154573cf0b41ffb25cc8431e7c0-Screenshot_2025-03-17_at_14.59.37.png" />
    </Frame>
  </Step>

  <Step title="Trigger'ı 'On app open' olarak ayarlayın." />

  <Step title="Sıklığı planlayın.">
    **Schedule > How often do you want to show this message?** altında **Every time trigger conditions are satisfied** seçeneğini seçin.

    <Frame caption="Uygulama içi mesaj planlama seçenekleri">
      <img src="https://mintcdn.com/onesignal/9_Q1FZLh6C0BFLq-/images/docs/c48ccaf33a74d5aa442c768a18b8e642024b89305aae665d613aee1d8bde43ec-Screenshot_2025-03-17_at_15.00.40.png?fit=max&auto=format&n=9_Q1FZLh6C0BFLq-&q=85&s=9a57431acffa267d22af4e19052fb5ee" width="1646" height="1070" data-path="images/docs/c48ccaf33a74d5aa442c768a18b8e642024b89305aae665d613aee1d8bde43ec-Screenshot_2025-03-17_at_15.00.40.png" />
    </Frame>
  </Step>

  <Step title="Mesajı yayına alın.">
    Test Kullanıcılarınız uygulamayı her açtığında kullanılabilir olması için **Make Message Live** tıklayın.
  </Step>

  <Step title="Uygulamayı açın ve mesajı görün.">
    Uygulama içi mesaj yayına alındıktan sonra, uygulamanızı açın. Şunu görüntülediğini görmelisiniz:

    <Frame caption="Cihazlarda gösterilen Welcome uygulama içi mesajı">
      <img src="https://mintcdn.com/onesignal/RWtLFPeffHrC81wI/images/docs/a7ed4bb02be56900a65d2519e3d69f9c9b2c2a1c65fe740f07789e4ffe79cd67-Untitled_design_10.png?fit=max&auto=format&n=RWtLFPeffHrC81wI&q=85&s=6f692b569706ca39df0b4cc2b70f3de2" width="1920" height="1080" data-path="images/docs/a7ed4bb02be56900a65d2519e3d69f9c9b2c2a1c65fe740f07789e4ffe79cd67-Untitled_design_10.png" />
    </Frame>

    <Warning>
      Mesajı görmüyor musunuz?

      * Yeni bir oturum başlatın
        * Yeniden açmadan önce uygulamayı en az 30 saniye kapatmalı veya arka plana almalısınız. Bu, yeni bir oturumun başlatılmasını sağlar.
        * Daha fazla bilgi için [uygulama içi mesajların nasıl görüntülendiğine](/docs/en/in-app-messages-setup#how-are-iams-displayed%3F) bakın.
      * Hala `Test Users` segmentinde misiniz?
        * Yeniden yüklediyseniz veya cihaz değiştirdiyseniz, cihazı [Test Users](#set-up-test-users)'a yeniden ekleyin ve Test Users segmentinin bir parçası olduğunu onaylayın.
      * Sorun mu yaşıyorsunuz?
        * Yukarıdaki adımları tekrarlarken [Hata Ayıklama Günlüğü Alma](/docs/en/capturing-a-debug-log) yönergelerini izleyin. Bu, `support@onesignal.com` ile paylaşabileceğiniz ek kayıt oluşturur ve ne olduğunu araştırmamıza yardımcı oluruz.
    </Warning>
  </Step>
</Steps>

<Check>
  OneSignal SDK'yı başarıyla kurdunuz ve şunlar gibi önemli kavramları öğrendiniz:

  * [Abonelikleri](/docs/en/subscriptions) toplama, [Test abonelikleri](/docs/en/find-set-test-subscriptions) ayarlama ve [Segmentler](/docs/en/segmentation) oluşturma.
  * Segmentleri ve [Create message](/reference/create-message) API'mizi kullanarak görsellerle ve [Onaylanmış Teslimat](/docs/en/confirmed-delivery) ile [Push](/docs/en/push) gönderme.
  * [Uygulama içi mesajlar](/docs/en/in-app-messages-setup) gönderme.

  Uygulamanızdaki kullanıcıları tanımlamak ve ek özellikler kurmak için bu kılavuza devam edin.
</Check>

***

## Kullanıcı tanımlama

Daha önce mobil [Abonelikler](/docs/en/subscriptions) oluşturmayı gösterdik. Şimdi OneSignal SDK'yı kullanarak [Kullanıcıları](/docs/en/users) tüm abonelikleri (push, e-posta ve SMS dahil) boyunca tanımlamaya geçeceğiz. Platformlar arası kullanıcıları birleştirmenize ve etkileşim kurmanıza yardımcı olmak için External ID'ler, etiketler, çok kanallı abonelikler, gizlilik ve olay takibini ele alacağız.

### External ID atama

Backend'inizin kullanıcı tanımlayıcısını kullanarak cihazlar, e-posta adresleri ve telefon numaraları arasında kullanıcıları tutarlı bir şekilde tanımlamak için External ID kullanın. Bu, mesajlaşmanızın kanallar ve 3. taraf sistemler arasında birleşik kalmasını sağlar ([Entegrasyonlar](/docs/en/integrations) için özellikle önemlidir).

Uygulamanız tarafından her tanımlandıklarında SDK'mızın [`login` yöntemi](/docs/en/mobile-sdk-reference#login-external-id) ile External ID'yi ayarlayın.

<Note>
  OneSignal, abonelikler (Subscription ID) ve kullanıcılar (OneSignal ID) için benzersiz salt okunur ID'ler oluşturur.

  Kullanıcılar uygulamanızı farklı cihazlara indirdikçe, web sitenize abone oldukça ve/veya uygulamanızın dışında size e-posta adresleri ve telefon numaraları sağladıkça, yeni abonelikler oluşturulacaktır.

  Nasıl oluşturulduklarına bakılmaksızın, kullanıcıları tüm abonelikleri boyunca tanımlamak için SDK'mız aracılığıyla External ID'yi ayarlamanız şiddetle önerilir.
</Note>

### Veri etiketleri ekleme

[Etiketler](/docs/en/add-user-data-tags), kullanıcı özelliklerini (`username`, `role` veya tercihler gibi) ve olayları (`purchase_date`, `game_level` veya kullanıcı etkileşimleri gibi) depolamak için kullanabileceğiniz anahtar-değer çiftleri string verilerdir. Etiketler, gelişmiş [Mesaj Kişiselleştirme](/docs/en/message-personalization) ve [Segmentasyonu](/docs/en/segmentation) destekleyerek daha gelişmiş kullanım durumlarına olanak tanır.

Uygulamanızda olaylar meydana geldikçe SDK'mız [`addTag` ve `addTags` yöntemleri](/docs/en/mobile-sdk-reference#data-tags) ile etiketleri ayarlayın.

Bu örnekte, kullanıcı `current_level` adlı etiket tarafından tanımlanan ve `6` değerine ayarlanan 6. seviyeye ulaştı.

<Frame caption="OneSignal'da &#x22;current_level&#x22; adlı bir etiketi &#x22;6&#x22;'ya ayarlanmış bir kullanıcı profili">
  <img src="https://mintcdn.com/onesignal/4HyuQPBpu-4xjmQC/images/docs/d4674261847231079fecc176ba88065409c90943e3854b9df200457325a0aed4-Screenshot_2025-03-18_at_14.47.25.png?fit=max&auto=format&n=4HyuQPBpu-4xjmQC&q=85&s=91083bf83a4c03ea40d485b23f072259" width="1380" height="941" data-path="images/docs/d4674261847231079fecc176ba88065409c90943e3854b9df200457325a0aed4-Screenshot_2025-03-18_at_14.47.25.png" />
</Frame>

5 ile 10 arasında seviyeye sahip kullanıcılardan oluşan bir segment oluşturabilir ve hedeflenmiş ve kişiselleştirilmiş mesajlar göndermek için bunu kullanabiliriz:

<Frame caption="4'ten büyük ve 10'dan küçük current_level değerine sahip kullanıcıları hedefleyen bir segmenti gösteren segment editörü">
  <img src="https://mintcdn.com/onesignal/3zq1PvSaqvUE2bIx/images/docs/300d36b632a6f6d7017780457bbe2610b71767fd0db093c7611e59714dcbda5b-Screenshot_2025-03-18_at_14.49.56.png?fit=max&auto=format&n=3zq1PvSaqvUE2bIx&q=85&s=b84ab0d2c6eedbd6d4e7a2bf15afe103" width="1380" height="941" data-path="images/docs/300d36b632a6f6d7017780457bbe2610b71767fd0db093c7611e59714dcbda5b-Screenshot_2025-03-18_at_14.49.56.png" />
</Frame>

<br />

<Frame caption="Kişiselleştirilmiş bir mesajla Level 5-10 segmentini hedefleyen bir push bildirimi gösteren ekran görüntüsü">
  <img src="https://mintcdn.com/onesignal/tc0EvmtSSX56SX0c/images/docs/97e09b42d25c6d3f4c7cb0a6fff4dfb8893cbb4b283f7ff1f77977c33113319c-Screenshot_2025-03-18_at_14.55.47.png?fit=max&auto=format&n=tc0EvmtSSX56SX0c&q=85&s=c7839b12057d65a12a4eaddce6e2c11f" width="2764" height="2286" data-path="images/docs/97e09b42d25c6d3f4c7cb0a6fff4dfb8893cbb4b283f7ff1f77977c33113319c-Screenshot_2025-03-18_at_14.55.47.png" />
</Frame>

<br />

<Frame caption="Push bildirimi, kişiselleştirilmiş içerikle iOS ve Android cihazda alındı">
  <img src="https://mintcdn.com/onesignal/_KaXe4GQkxsEfa17/images/docs/3bf1810580f30984745017056383f151b874513b6bfb1445fb1016e5c9a79e82-Untitled_design_12.png?fit=max&auto=format&n=_KaXe4GQkxsEfa17&q=85&s=94b6e9eeeb5516285a256a72063a0906" width="1920" height="1080" data-path="images/docs/3bf1810580f30984745017056383f151b874513b6bfb1445fb1016e5c9a79e82-Untitled_design_12.png" />
</Frame>

### E-posta ve/veya SMS abonelikleri ekleme

Daha önce SDK'mızın push ve uygulama içi mesajlar göndermek için mobil abonelikler oluşturduğunu gördük. Karşılık gelen abonelikleri oluşturarak kullanıcılara e-posta ve SMS kanalları aracılığıyla da ulaşabilirsiniz.

* E-posta abonelikleri oluşturmak için [`addEmail` yöntemini](/docs/en/mobile-sdk-reference#addemail-%2C-removeemail) kullanın.
* SMS abonelikleri oluşturmak için [`addSms` yöntemini](/docs/en/mobile-sdk-reference#addsms-%2C-removesms) kullanın.

E-posta adresi ve/veya telefon numarası OneSignal uygulamasında zaten mevcutsa, SDK bunu mevcut kullanıcıya ekler, yineleme oluşturmaz.

Birleştirilmiş kullanıcıları panoda **Audience > Users** aracılığıyla veya [View user API](/reference/view-user) ile görüntüleyebilirsiniz.

<Frame caption="External ID tarafından birleştirilmiş push, e-posta ve SMS aboneliklerine sahip bir kullanıcı profili">
  <img src="https://mintcdn.com/onesignal/56ctKxZSV4m5VEkn/images/docs/b1cf9999d41da6e4ce333e1126612529b85eac47447bb0b434418d082f595acd-Screenshot_2025-03-18_at_14.43.46.png?fit=max&auto=format&n=56ctKxZSV4m5VEkn&q=85&s=7c3885b66e44e097fa0ed7c47f27c911" width="1506" height="848" data-path="images/docs/b1cf9999d41da6e4ce333e1126612529b85eac47447bb0b434418d082f595acd-Screenshot_2025-03-18_at_14.43.46.png" />
</Frame>

<Note>
  Çok kanallı iletişim için en iyi uygulamalar

  * E-posta veya SMS abonelikleri eklemeden önce açık onay alın.
  * Her iletişim kanalının faydalarını kullanıcılara açıklayın.
  * Kullanıcıların hangi kanalları tercih ettiklerini seçebilmeleri için kanal tercihleri sağlayın.
</Note>

***

### Gizlilik ve kullanıcı onayı

OneSignal'ın kullanıcı verilerini ne zaman topladığını kontrol etmek için SDK'nın onay kapısı yöntemlerini kullanın:

* [`setConsentRequired(true)`](/docs/en/mobile-sdk-reference#setconsentrequired): Onay verilene kadar veri toplamayı önler.
* [`setConsentGiven(true)`](/docs/en/mobile-sdk-reference#setconsentgiven): Onay verildikten sonra veri toplamayı etkinleştirir.

Daha fazlası için Gizlilik ve güvenlik belgelerimize bakın:

* [SDK tarafından toplanan veriler](/docs/en/data-collected-by-the-onesignal-sdk)
* [Kişisel verilerin işlenmesi](/docs/en/handling-personal-data)

***

## Push izinleri için istemde bulunma

Uygulama açılışında hemen `requestPermission()` çağırmak yerine, daha stratejik bir yaklaşım benimseyin. İzin istemeden önce push bildirimlerinin değerini açıklamak için uygulama içi mesaj kullanın.

En iyi uygulamalar ve uygulama ayrıntıları için [Push izinleri için istemde bulunma](/docs/en/prompt-for-push-permissions) kılavuzumuza bakın.

***

## Push, kullanıcı ve uygulama içi olayları dinleme

Kullanıcı eylemlerine ve durum değişikliklerine tepki vermek için SDK dinleyicilerini kullanın.

SDK, bağlanabileceğiniz birkaç olay dinleyicisi sağlar. Daha fazla ayrıntı için [SDK referans kılavuzumuza](/docs/en/mobile-sdk-reference) bakın.

### Push bildirimi olayları

* [`addClickListener()`](/docs/en/mobile-sdk-reference#addclicklistener-push): Bir bildirime dokunulduğunu algılar. [Deep Linking](/docs/en/deep-linking) için yararlıdır.
* [`addForegroundLifecycleListener()`](/docs/en/mobile-sdk-reference#addforegroundlifecyclelistener-push): Bildirimlerin ön planda nasıl davrandığını kontrol eder.

Tam özelleştirme için [Mobil Servis Uzantıları](/docs/en/service-extensions)'na bakın.

### Kullanıcı durumu değişiklikleri

* [Kullanıcı durumu için `addObserver()`](/docs/en/mobile-sdk-reference#addobserver-user-state): External ID'nin ne zaman ayarlandığını algılar.
* [`addPermissionObserver()`](/docs/en/mobile-sdk-reference#addpermissionobserver-push): Kullanıcının yerel push izin istemiyle belirli etkileşimini takip eder.
* [Push aboneliği için `addObserver()`](/docs/en/mobile-sdk-reference#addobserver-push-subscription-changes): Push abonelik durumu değiştiğinde takip eder.

### Uygulama içi mesaj olayları

* [`addClickListener()`](/docs/en/mobile-sdk-reference#addclicklistener-in-app): Uygulama içi tıklama eylemlerini işler. Deep linking veya olayları takip etmek için idealdir.
* [`addLifecycleListener()`](/docs/en/mobile-sdk-reference#addclicklistener-in-app): Uygulama içi mesajların tam yaşam döngüsünü takip eder (gösterildi, tıklandı, kapatıldı vb.).

***

## Metot swizzling'i devre dışı bırakma (isteğe bağlı)

Varsayılan olarak, OneSignal SDK push bildirimi temsilci yöntemlerini otomatik olarak işlemek için metot swizzling kullanır. Uygulamanızın swizzling'i devre dışı bırakması gerekiyorsa (örneğin, diğer SDK'larla çakışmaları önlemek veya bildirim temsilci yöntemleri üzerinde tam kontrol sağlamak için) `Info.plist` aracılığıyla bu özelliği devre dışı bırakabilirsiniz.

Swizzling devre dışı bırakıldığında, bildirim temsilci yöntemlerini OneSignal SDK'sına manuel olarak iletmeniz gerekir. Diğer tüm SDK özellikleri (dinleyiciler, gözlemciler, uygulama içi mesajlar, sonuçlar vb.) normal şekilde çalışmaya devam eder.

### Adım 1. Info.plist bayrağını ekle

Uygulamanızın `Info.plist` dosyasına aşağıdakini ekleyin:

```xml theme={null}
<key>OneSignal_disable_swizzling</key>
<true/>
```

SDK bu bayrağı algıladığında, başlangıçta tüm metot swizzling'i atlar ve manuel iletimi uygulamanızı hatırlatan bir uyarı kaydeder.

### Adım 2. UNUserNotificationCenter temsilcisini ayarla

`OneSignal.initialize`'ı çağırmadan **önce** `AppDelegate`'inizi `UNUserNotificationCenter` temsilcisi olarak ayarlayın. Bu olmadan, ön planda bildirim gösterimi ve bildirim dokunma işlemi çalışmayacaktır.

<CodeGroup>
  ```swift Swift theme={null}
  // In application(_:didFinishLaunchingWithOptions:), BEFORE OneSignal.initialize()
  UNUserNotificationCenter.current().delegate = self
  ```

  ```objc Objective-C theme={null}
  // In application:didFinishLaunchingWithOptions:, BEFORE [OneSignal initialize:]
  [UNUserNotificationCenter currentNotificationCenter].delegate = self;
  ```
</CodeGroup>

### Adım 3. Bildirim temsilci yöntemlerini ilet

`AppDelegate`'inizde aşağıdaki yöntemleri uygulayın. Tüm yöntemler `OneSignal.Notifications` aracılığıyla çağrılır.

**Token kaydı:**

<CodeGroup>
  ```swift Swift theme={null}
  func application(_ application: UIApplication,
                   didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
      OneSignal.Notifications.didRegisterForRemoteNotifications(application, deviceToken: deviceToken)
  }

  func application(_ application: UIApplication,
                   didFailToRegisterForRemoteNotificationsWithError error: Error) {
      OneSignal.Notifications.handleDidFailRegisterForRemoteNotification(error as NSError)
  }
  ```

  ```objc Objective-C theme={null}
  - (void)application:(UIApplication *)application
      didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
      [OneSignal.Notifications didRegisterForRemoteNotifications:application deviceToken:deviceToken];
  }

  - (void)application:(UIApplication *)application
      didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
      [OneSignal.Notifications handleDidFailRegisterForRemoteNotification:error];
  }
  ```
</CodeGroup>

**Arka plan / sessiz bildirimler:**

<CodeGroup>
  ```swift Swift theme={null}
  func application(_ application: UIApplication,
                   didReceiveRemoteNotification userInfo: [AnyHashable: Any],
                   fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
      OneSignal.Notifications.receiveRemoteNotification(application,
                                                        userInfo: userInfo,
                                                        completionHandler: completionHandler)
  }
  ```

  ```objc Objective-C theme={null}
  - (void)application:(UIApplication *)application
      didReceiveRemoteNotification:(NSDictionary *)userInfo
      fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
      [OneSignal.Notifications receiveRemoteNotification:application
                                                UserInfo:userInfo
                                       completionHandler:completionHandler];
  }
  ```
</CodeGroup>

**Ön planda bildirim görüntüleme:**

SDK, `OSNotification` nesnesiyle tamamlama bloğunuzu çağırır. Nil değilse, SDK bildirimin görüntülenmesini ister — tercih ettiğiniz sunum seçeneklerini geçirin. Nil ise (ör. bir IAM önizlemesi), sunum seçeneği geçirmeyin.

<CodeGroup>
  ```swift Swift theme={null}
  func userNotificationCenter(_ center: UNUserNotificationCenter,
                              willPresent notification: UNNotification,
                              withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
      OneSignal.Notifications.handleWillPresentNotificationInForeground(
          withPayload: notification.request.content.userInfo
      ) { notif in
          if notif != nil {
              if #available(iOS 14.0, *) {
                  completionHandler([.banner, .list, .sound])
              } else {
                  completionHandler([.alert, .sound])
              }
          } else {
              completionHandler([])
          }
      }
  }
  ```

  ```objc Objective-C theme={null}
  - (void)userNotificationCenter:(UNUserNotificationCenter *)center
         willPresentNotification:(UNNotification *)notification
           withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
      [OneSignal.Notifications
          handleWillPresentNotificationInForegroundWithPayload:notification.request.content.userInfo
          withCompletion:^(OSNotification *notif) {
              if (notif) {
                  if (@available(iOS 14.0, *)) {
                      completionHandler(UNNotificationPresentationOptionBanner |
                                        UNNotificationPresentationOptionList |
                                        UNNotificationPresentationOptionSound);
                  } else {
                      completionHandler(UNNotificationPresentationOptionAlert |
                                        UNNotificationPresentationOptionSound);
                  }
              } else {
                  completionHandler(UNNotificationPresentationOptionNone);
              }
          }];
  }
  ```
</CodeGroup>

<Note>
  `onWillDisplayNotification` yaşam döngüsü dinleyicisi ve `preventDefault` / `display` API'leri manuel iletimle çalışmaya devam eder. SDK, `handleWillPresentNotificationInForegroundWithPayload` içinden dinleyicilerinizi çağırır.
</Note>

**Bildirim dokunma / eylemi:**

<CodeGroup>
  ```swift Swift theme={null}
  func userNotificationCenter(_ center: UNUserNotificationCenter,
                              didReceive response: UNNotificationResponse,
                              withCompletionHandler completionHandler: @escaping () -> Void) {
      OneSignal.Notifications.handleNotificationResponse(response)
      completionHandler()
  }
  ```

  ```objc Objective-C theme={null}
  - (void)userNotificationCenter:(UNUserNotificationCenter *)center
      didReceiveNotificationResponse:(UNNotificationResponse *)response
               withCompletionHandler:(void (^)(void))completionHandler {
      [OneSignal.Notifications handleNotificationResponse:response];
      completionHandler();
  }
  ```
</CodeGroup>

### İsteğe bağlı: Rozet sayısını ayarla

Swizzling devre dışı bırakıldığında, SDK rozet değişikliklerini engelleyemez. Rozet sayısını ayarlamak ve OneSignal'in dahili rozet önbelleğini senkronize etmek için bu yöntemi kullanın:

<CodeGroup>
  ```swift Swift theme={null}
  OneSignal.Notifications.setBadgeCount(5)
  ```

  ```objc Objective-C theme={null}
  [OneSignal.Notifications setBadgeCount:5];
  ```
</CodeGroup>

### SwiftUI uygulamaları

SwiftUI uygulamalarının varsayılan olarak bir `AppDelegate`'i yoktur. Bir tane eklemek için `@UIApplicationDelegateAdaptor` kullanın ve ardından yukarıda gösterilen tüm iletme yöntemlerini uygulayın:

```swift Swift theme={null}
@main
struct YourApp: App {
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate

    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

class AppDelegate: NSObject, UIApplicationDelegate, UNUserNotificationCenterDelegate {
    func application(_ application: UIApplication,
                     didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool {
        UNUserNotificationCenter.current().delegate = self
        OneSignal.initialize("YOUR_APP_ID", withLaunchOptions: launchOptions)
        return true
    }

    // Implement all the forwarding methods shown above
}
```

### API referansı

| Yöntem                                                                    | Amaç                                                    |
| ------------------------------------------------------------------------- | ------------------------------------------------------- |
| `didRegisterForRemoteNotifications(_:deviceToken:)`                       | APNs cihaz belirtecini OneSignal'e ilet                 |
| `handleDidFailRegisterForRemoteNotification(_:)`                          | APNs kayıt hatasını ilet                                |
| `receiveRemoteNotification(_:userInfo:completionHandler:)`                | Arka plan/sessiz bildirimleri ilet                      |
| `handleWillPresentNotificationInForegroundWithPayload(_:withCompletion:)` | SDK işlemesi için ön plan bildirimini ilet              |
| `handleNotificationResponse(_:)`                                          | Bildirim dokunma/eylemini SDK'ya ilet                   |
| `setBadgeCount(_:)`                                                       | Rozet sayısını ayarla ve SDK önbelleğiyle senkronize et |

***

## Gelişmiş kurulum ve yetenekler

Entegrasyonunuzu geliştirmek için daha fazla yeteneği keşfedin:

* [🔁 Başka bir hizmetten OneSignal'a geçiş](/docs/en/migrating-to-onesignal)
* [🌍 Konum takibi](/docs/en/mobile-sdk-reference#location)
* [🔗 Deep Linking](/docs/en/deep-linking)
* [🔌 Entegrasyonlar](/docs/en/integrations)
* [🧩 Mobil Servis Uzantıları](/docs/en/service-extensions)
* [🛎️ Eylem düğmeleri](/docs/en/action-buttons)
* [🌐 Çok dilli mesajlaşma](/docs/en/multi-language-messaging)
* [🛡️ Kimlik Doğrulama](/docs/en/identity-verification)
* [📊 Özel Sonuçlar](/docs/en/custom-outcomes)
* [📲 Canlı Aktiviteler](/docs/en/live-activities)

### Mobil SDK kurulumu ve referansı

[Mobil push kurulumu](/docs/en/mobile-push-setup) kılavuzunu inceleyerek tüm temel özellikleri etkinleştirdiğinizden emin olun.

Mevcut yöntemler ve yapılandırma seçenekleri hakkında tam ayrıntılar için [Mobil SDK referansını](/docs/en/mobile-sdk-reference) ziyaret edin.

<Check>Tebrikler! Mobil SDK kurulum kılavuzunu başarıyla tamamladınız.</Check>

***

<Info>
  Need help?

  Chat with our Support team or email `support@onesignal.com`

  Please include:

  * Details of the issue you're experiencing and steps to reproduce if available
  * Your OneSignal App ID
  * The External ID or Subscription ID if applicable
  * The URL to the message you tested in the OneSignal Dashboard if applicable
  * Any relevant [logs or error messages](/docs/en/capturing-a-debug-log)

  We're happy to help!
</Info>

***
