# Objective-CのコードでSDKを使用する

# 概要

LINE SDK for iOS SwiftはすべてSwiftで書かれていますが、Objective-Cのプロジェクトで使用できます。方法は2つあります。

# オプション1:言語混在プロジェクトを作成する

SwiftとSwift/Objective-Cの相互運用の経験がある場合は、LINE SDK for iOS SwiftをObjective-Cのプロジェクトに直接組み込み、Swift言語でLINE SDKのAPIを呼び出すことをお勧めします。

Objective-Cの既存のプロジェクトは、Objective-CとSwiftの言語混在プロジェクトに変換できます。言語混在プロジェクトに、LINE SDK for iOS Swiftと処理を受け渡しするSwiftのファイルを追加できます。

Swiftのファイル内で必要な宣言をObjective-Cから利用するには、宣言に@objc属性または@objcMembers属性を付与してください。これらの属性について詳しくは、Swift.orgの「Attributes (opens new window)」を参照してください。

Swiftのファイルをプロジェクトにインポートすると、Xcodeにより自動的にブリッジングヘッダーファイルが生成されます。これにより、それらのファイルをObjective-Cのコードでも利用できるようになります。ブリッジングヘッダーについて詳しくは、Appleの「Importing Swift into Objective-C (opens new window)」を参照してください。

SwiftのクラスをObjective-Cのプロジェクトで使えるようにするうえで、以下の記事も役に立ちます。

# オプション2:Objective-Cラッパーを使う

Objective-CのコードでLINE SDK for iOS Swiftと処理を受け渡しするには、LINE SDK for iOS Swiftに含まれるObjective-Cラッパーを使います。オプション1とは異なり、Objective-Cラッパーフレームワークをプロジェクトに追加する必要があります。ここでは、Objective-Cラッパーの基本概念、インストール、および一般的な使い方について説明します。

LINE SDK for iOS SwiftはSwiftのコードにのみ対応しています。SDKをObjective-Cのコードに対応させるため、Objective-CラッパーはコアSDK上に実装されています。LINE SDK for iOS Swiftの中核的な機能のほとんどを、ラッパーを介して利用できます。Swiftと完全な互換性がないObjective-Cの仕様の制限により、一部の機能はObjective-Cラッパーで利用できません。

本来のSDKと名前衝突を起こさないように、タイプとほとんどのSDKコンポーネントの名前に「LineSDK」というプリフィックスが付きます。ラッパーの設定には追加的な手順も伴います。

ラッパーはLINE SDK for iOS Swiftを使うための一時的な手段であることに留意してください。LINE SDK for iOS Swiftの機能をフル活用するには、プロジェクトをSwiftに移行する事を推奨します。

# インストール

# 前提条件

LINE SDK for iOSをビルドしてObjective-Cラッパーを介して使用するには、以下が必要です。

  • デプロイメントターゲットとしてiOS 11.0以降
  • Xcode 10以降

# CocoaPods

CocoaPodsについて詳しくない場合は、『CocoaPods Getting Started Guide (opens new window)』を参照してください。CocoaPodsを使ってLINE SDK for iOS Swiftをアプリに組み込む前に、作業環境にCocoaPodsのgemをインストールする必要があります。

  1. Podfileを準備したら、ターゲットに以下のpodコマンドを追加します。

    platform :ios, '11.0'
    use_frameworks!
    
    target '<Your App Target Name>' do
        pod 'LineSDKSwift/ObjC', '~> 5.0'
    end
    
  2. 以下のコマンドを実行します。

    $ pod install
    
  3. LINE SDK for iOS Swiftがダウンロードされ、Xcodeのワークスペースに組み込まれます。

# SDKをインポートする

LINE SDK for iOS SwiftをObjective-Cラッパーと共にObjective-Cのプロジェクトにインポートするには、以下のように@import LineSDK;を追加します。

#import "ViewController.h"
@import LineSDK;

@implementation ViewController
// ...
@end

# Carthage

Carthage (opens new window)は分散型の依存性マネージャーで、ライブラリをビルドしてバイナリのフレームワークとして利用できます。

  1. Carthageツールをインストールするには、Homebrew (opens new window)を使います。

    $ brew update
    $ brew install carthage
    
  2. Carthageを使ってLINE SDK for iOS SwiftをXcodeプロジェクトに組み込むには、CartfileにSDKのGitHubリポジトリを以下のように指定します。

    github "line/line-sdk-ios-swift" ~> 5.0
    
  3. 以下のコマンドを実行してLINE SDK for iOS Swiftをビルドします。

    $ carthage update line-sdk-ios-swift
    

以下のセクションに記載された手順に従って、ビルドされたLineSDK.frameworkファイルとLineSDKObjC.frameworkファイルをXcodeプロジェクトに追加できます。

# フレームワークファイルをXcodeプロジェクトにリンクする

Carthage/Build/iOSフォルダーからLineSDK.frameworkファイルとLineSDKObjC.frameworkファイルをドラッグして、アプリのターゲットの[Build Phases]設定タブの[Link Binary With Libraries]セクションにドロップします。

# ビルドフェーズでフレームワークファイルをコピーする
  1. アプリのターゲットの[Build Phases]設定タブで [+]アイコンをクリックして、[New Run Script Phase]を選択します。以下の内容で実行スクリプトを作成します。

    /usr/local/bin/carthage copy-frameworks
    
  2. フレームワークファイルのパスを[Input Files]セクションに追加します。

    $(SRCROOT)/Carthage/Build/iOS/LineSDK.framework
    $(SRCROOT)/Carthage/Build/iOS/LineSDKObjC.framework
    
  3. フレームワークファイルのパスを[Output Files]セクションに追加します。

    $(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/LineSDK.framework
    $(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/LineSDKObjC.framework
    

[Build Phases]設定タブは以下のようになるはずです。

iOS SDK Swift ObjCのリンクの[Build Phase] タブに[Link Binary with Library]、[Copy Bundle Resources]、および [Run Script] サブタブが表示されます。

# [Always Embed Swift Standard Libraries]オプションを有効にする

[Build Settings]設定タブで[Always Embed Swift Standard Libraries](ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES)オプションを[YES]に設定して、Swiftの標準ライブラリを最終的なアプリバンドルに含めます。

# SDKをインポートする

LINE SDK for iOS SwiftをObjective-Cラッパーと共にObjective-Cのプロジェクトにインポートするには、以下のように@import LineSDKObjC;を追加します。

#import "ViewController.h"
@import LineSDKObjC;

@implementation ViewController
// ...
@end

# 命名規則

Objective-Cラッパーを使う場合、タイプとほとんどのSDKコンポーネントの名前に「LineSDK」というプリフィックスが付きます。以下のコードサンプルは、よく実行されるタスクのObjective-Cでの制御方法を示しています。

# 複数の権限を指定してユーザーをログインさせる

NSSet *permissions = [NSSet setWithObjects:
                          [LineSDKLoginPermission profile],
                          [LineSDKLoginPermission openID],
                          nil];
[[LineSDKLoginManager sharedManager]
    loginWithPermissions:permissions
        inViewController:self
              parameters:nil
       completionHandler:^(LineSDKLoginResult *result, NSError *error) {
           if (result) {
               NSLog(@"User Name: %@", result.userProfile.displayName);
           } else {
               NSLog(@"Error: %@", error);
           }
       }
 ];

# ユーザープロフィールを取得する

[LineSDKAPI getProfileWithCompletionHandler:
    ^(LineSDKUserProfile * _Nullable profile, NSError * _Nullable error)
{
    if (profile) {
        NSLog(@"User Name: %@", profile.displayName);
    } else {
        NSLog(@"Error: %@", error);
    }
}];

# Objective-Cラッパーでエラーを制御する

Objective-Cの規則に対応するため、Objective-CラッパーはNSErrorオブジェクトをスローします。以下のコードでは、エラーがLINE SDKに関係するのかどうかを確認しています。

NSError *error = // ... An error from LINE SDK ObjC Wrapper
if ([error.domain isEqualToString:[LineSDKErrorConstant errorDomain]]) {
    // SDK Error
}

ラッパーからスローされるすべてのエラーは、本来のLINE SDK for iOS Swiftからスローされるのと同じcodeプロパティとuserInfoプロパティを持ちます。それらを使ってエラーの原因を確認できます。

if (error.code == 2004) {
    // invalidHTTPStatusAPIError
    NSNumber *statusCode = error.userInfo[[LineSDKErrorConstant userInfoKeyStatusCode]];
    if ([statusCode integerValue] == 403) {
        // Permission granting issue. Ask for authorization with enough permission again.
    }
}

エラーを特定して制御する方法については、「エラーを制御する」を参照してください。