概要
このガイドでは、最新の Azure Mobile Apps iOS SDK を使用して一般的なシナリオを実行する方法について説明します。 Azure Mobile Apps を初めて使用する場合は、まず Azure Mobile Apps クイック スタート を完了してバックエンドを作成し、テーブルを作成し、ビルド済みの iOS Xcode プロジェクトをダウンロードします。 このガイドでは、クライアント側の iOS SDK に焦点を当てます。 バックエンドのサーバー側 SDK の詳細については、サーバー SDK のハウツーを参照してください。
参照ドキュメント
iOS クライアント SDK のリファレンス ドキュメントは、 Azure Mobile Apps iOS クライアント リファレンスにあります。
サポートされているプラットフォーム
iOS SDK では、iOS バージョン 8.0 以降の Objective-C プロジェクト、Swift 2.2 プロジェクト、および Swift 2.3 プロジェクトがサポートされています。
"サーバー フロー" 認証では、表示される UI に WebView が使用されます。 デバイスが WebView UI を表示できない場合は、製品の範囲外にある別の認証方法が必要です。 したがって、この SDK は、ウォッチタイプまたは同様に制限されたデバイスには適していません。
セットアップと前提条件
このガイドでは、テーブルを含むバックエンドを作成していることを前提としています。 このガイドでは、テーブルにこれらのチュートリアルのテーブルと同じスキーマがあることを前提としています。 また、このガイドでは、コードで MicrosoftAzureMobile.framework
を参照し、 MicrosoftAzureMobile/MicrosoftAzureMobile.h
をインポートすることを前提としています。
方法: クライアントを作成する
プロジェクト内の Azure Mobile Apps バックエンドにアクセスするには、 MSClient
を作成します。 AppUrl
をアプリの URL に置き換えます。 gatewayURLString
とapplicationKey
は空のままにすることができます。 認証用のゲートウェイを設定する場合は、ゲートウェイ URL を gatewayURLString
に入力します。
Objective-C:
MSClient *client = [MSClient clientWithApplicationURLString:@"AppUrl"];
Swift:
let client = MSClient(applicationURLString: "AppUrl")
方法: テーブル参照を作成する
データにアクセスまたは更新するには、バックエンド テーブルへの参照を作成します。 TodoItem
をテーブルの名前に置き換える
Objective-C:
MSTable *table = [client tableWithName:@"TodoItem"];
Swift:
let table = client.tableWithName("TodoItem")
方法: データのクエリを実行する
データベース クエリを作成するには、 MSTable
オブジェクトに対してクエリを実行します。 次のクエリでは、 TodoItem
内のすべての項目を取得し、各項目のテキストをログに記録します。
Objective-C:
[table readWithCompletion:^(MSQueryResult *result, NSError *error) {
if(error) { // error is nil if no error occurred
NSLog(@"ERROR %@", error);
} else {
for(NSDictionary *item in result.items) { // items is NSArray of records that match query
NSLog(@"Todo Item: %@", [item objectForKey:@"text"]);
}
}
}];
Swift:
table.readWithCompletion { (result, error) in
if let err = error {
print("ERROR ", err)
} else if let items = result?.items {
for item in items {
print("Todo Item: ", item["text"])
}
}
}
方法: 返されたデータをフィルター処理する
結果をフィルター処理するために、使用可能なオプションは多数あります。
述語を使用してフィルター処理するには、 NSPredicate
と readWithPredicate
を使用します。 次のフィルターは、不完全な Todo 項目のみを検索するためにデータを返しました。
Objective-C:
// Create a predicate that finds items where complete is false
NSPredicate * predicate = [NSPredicate predicateWithFormat:@"complete == NO"];
// Query the TodoItem table
[table readWithPredicate:predicate completion:^(MSQueryResult *result, NSError *error) {
if(error) {
NSLog(@"ERROR %@", error);
} else {
for(NSDictionary *item in result.items) {
NSLog(@"Todo Item: %@", [item objectForKey:@"text"]);
}
}
}];
Swift:
// Create a predicate that finds items where complete is false
let predicate = NSPredicate(format: "complete == NO")
// Query the TodoItem table
table.readWithPredicate(predicate) { (result, error) in
if let err = error {
print("ERROR ", err)
} else if let items = result?.items {
for item in items {
print("Todo Item: ", item["text"])
}
}
}
方法: MSQuery を使用する
複雑なクエリ (並べ替えやページングを含む) を実行するには、 MSQuery
オブジェクトを直接作成するか、述語を使用して作成します。
Objective-C:
MSQuery *query = [table query];
MSQuery *query = [table queryWithPredicate: [NSPredicate predicateWithFormat:@"complete == NO"]];
Swift:
let query = table.query()
let query = table.queryWithPredicate(NSPredicate(format: "complete == NO"))
MSQuery
では、いくつかのクエリ動作を制御できます。
- 結果の順序を指定する
- 返すフィールドを制限する
- 返すレコードの数を制限する
- 応答の合計カウントを指定する
- 要求でカスタム クエリ文字列パラメーターを指定する
- 追加の関数を適用する
オブジェクトのMSQuery
を呼び出して、readWithCompletion
クエリを実行します。
方法: MSQuery でデータを並べ替える
結果を並べ替えるには、例を見てみましょう。 フィールド 'text' を昇順で並べ替え、次に "完了" 降順で並べ替えるには、次のように MSQuery
呼び出します。
Objective-C:
[query orderByAscending:@"text"];
[query orderByDescending:@"complete"];
[query readWithCompletion:^(MSQueryResult *result, NSError *error) {
if(error) {
NSLog(@"ERROR %@", error);
} else {
for(NSDictionary *item in result.items) {
NSLog(@"Todo Item: %@", [item objectForKey:@"text"]);
}
}
}];
Swift:
query.orderByAscending("text")
query.orderByDescending("complete")
query.readWithCompletion { (result, error) in
if let err = error {
print("ERROR ", err)
} else if let items = result?.items {
for item in items {
print("Todo Item: ", item["text"])
}
}
}
方法: MSQuery を使用してフィールドを制限し、クエリ文字列パラメーターを展開する
クエリで返されるフィールドを制限するには、 selectFields プロパティのフィールドの名前を指定します。 この例では、テキストフィールドと入力済みフィールドのみが返されます。
Objective-C:
query.selectFields = @[@"text", @"complete"];
Swift:
query.selectFields = ["text", "complete"]
サーバー要求に追加のクエリ文字列パラメーターを含めるには (たとえば、カスタム サーバー側スクリプトで使用されるため)、次のように query.parameters
設定します。
Objective-C:
query.parameters = @{
@"myKey1" : @"value1",
@"myKey2" : @"value2",
};
Swift:
query.parameters = ["myKey1": "value1", "myKey2": "value2"]
方法: ページ サイズを構成する
Azure Mobile Apps では、ページ サイズによって、バックエンド テーブルから一度にプルされるレコードの数が制御されます。 その後、 pull
データを呼び出すと、このページ サイズに基づいて、プルするレコードがなくなったまでデータがバッチ処理されます。
次に示すように、 MSPullSettings を使用してページ サイズを構成できます。 既定のページ サイズは 50 で、次の例では 3 に変更されます。
パフォーマンス上の理由から、別のページ サイズを構成できます。 多数の小さなデータ レコードがある場合、ページ サイズが大きいと、サーバーラウンドトリップの数が減ります。
この設定では、クライアント側のページ サイズのみを制御します。 クライアントが Mobile Apps バックエンドでサポートされているよりも大きいページ サイズを要求した場合、ページ サイズは、バックエンドがサポートするように構成されている最大サイズに制限されます。
この設定は、バイト サイズではなく、データ レコードの数でもあります。
クライアント のページ サイズを大きくする場合は、サーバーのページ サイズも大きくする必要があります。 これを行う手順については、「 方法: テーブルのページング サイズを調整する」 を参照してください。
Objective-C:
MSPullSettings *pullSettings = [[MSPullSettings alloc] initWithPageSize:3];
[table pullWithQuery:query queryId:@nil settings:pullSettings
completion:^(NSError * _Nullable error) {
if(error) {
NSLog(@"ERROR %@", error);
}
}];
Swift:
let pullSettings = MSPullSettings(pageSize: 3)
table.pullWithQuery(query, queryId:nil, settings: pullSettings) { (error) in
if let err = error {
print("ERROR ", err)
}
}
方法: データを挿入する
新しいテーブル行を挿入するには、 NSDictionary
を作成し、 table insert
を呼び出します。 動的スキーマが有効になっている場合、Azure App Service モバイル バックエンドは、NSDictionary
に基づいて新しい列を自動的に生成します。
id
が指定されていない場合、バックエンドは自動的に新しい一意の ID を生成します。 メール アドレス、ユーザー名、または独自のカスタム値を ID として使用する独自の id
を指定します。 独自の ID を指定すると、結合やビジネス指向のデータベース ロジックが容易になる場合があります。
result
には、挿入された新しい項目が含まれています。 サーバー ロジックによっては、サーバーに渡されたものと比較して追加または変更されたデータが含まれる場合があります。
Objective-C:
NSDictionary *newItem = @{@"id": @"custom-id", @"text": @"my new item", @"complete" : @NO};
[table insert:newItem completion:^(NSDictionary *result, NSError *error) {
if(error) {
NSLog(@"ERROR %@", error);
} else {
NSLog(@"Todo Item: %@", [result objectForKey:@"text"]);
}
}];
Swift:
let newItem = ["id": "custom-id", "text": "my new item", "complete": false]
table.insert(newItem) { (result, error) in
if let err = error {
print("ERROR ", err)
} else if let item = result {
print("Todo Item: ", item["text"])
}
}
方法: データを変更する
既存の行を更新するには、項目を変更し、 update
を呼び出します。
Objective-C:
NSMutableDictionary *newItem = [oldItem mutableCopy]; // oldItem is NSDictionary
[newItem setValue:@"Updated text" forKey:@"text"];
[table update:newItem completion:^(NSDictionary *result, NSError *error) {
if(error) {
NSLog(@"ERROR %@", error);
} else {
NSLog(@"Todo Item: %@", [result objectForKey:@"text"]);
}
}];
Swift:
if let newItem = oldItem.mutableCopy() as? NSMutableDictionary {
newItem["text"] = "Updated text"
table2.update(newItem as [NSObject: AnyObject], completion: { (result, error) -> Void in
if let err = error {
print("ERROR ", err)
} else if let item = result {
print("Todo Item: ", item["text"])
}
})
}
または、行 ID と更新されたフィールドを指定します。
Objective-C:
[table update:@{@"id":@"custom-id", @"text":"my EDITED item"} completion:^(NSDictionary *result, NSError *error) {
if(error) {
NSLog(@"ERROR %@", error);
} else {
NSLog(@"Todo Item: %@", [result objectForKey:@"text"]);
}
}];
Swift:
table.update(["id": "custom-id", "text": "my EDITED item"]) { (result, error) in
if let err = error {
print("ERROR ", err)
} else if let item = result {
print("Todo Item: ", item["text"])
}
}
更新を行うときは、少なくとも id
属性を設定する必要があります。
方法: データを削除する
項目を削除するには、その項目で delete
を呼び出します。
Objective-C:
[table delete:item completion:^(id itemId, NSError *error) {
if(error) {
NSLog(@"ERROR %@", error);
} else {
NSLog(@"Todo Item ID: %@", itemId);
}
}];
Swift:
table.delete(newItem as [NSObject: AnyObject]) { (itemId, error) in
if let err = error {
print("ERROR ", err)
} else {
print("Todo Item ID: ", itemId)
}
}
または、行 ID を指定して削除します。
Objective-C:
[table deleteWithId:@"37BBF396-11F0-4B39-85C8-B319C729AF6D" completion:^(id itemId, NSError *error) {
if(error) {
NSLog(@"ERROR %@", error);
} else {
NSLog(@"Todo Item ID: %@", itemId);
}
}];
Swift:
table.deleteWithId("37BBF396-11F0-4B39-85C8-B319C729AF6D") { (itemId, error) in
if let err = error {
print("ERROR ", err)
} else {
print("Todo Item ID: ", itemId)
}
}
少なくとも、削除を行うときは、 id
属性を設定する必要があります。
方法: カスタム API を呼び出す
カスタム API を使用すると、任意のバックエンド機能を公開できます。 テーブル操作に対応する必要はありません。 メッセージングをより詳細に制御できるだけでなく、ヘッダーの読み取り/設定や応答本文の形式の変更も可能です。
カスタム API を呼び出すには、 MSClient.invokeAPI
を呼び出します。 要求と応答のコンテンツは JSON として扱われます。 他のメディアの種類を使用するには、invokeAPI
の他のオーバーロードを使用します。 GET
要求ではなくPOST
要求を行うには、パラメーター HTTPMethod
を "GET"
に設定し、パラメーター body
を nil
に設定します (GET 要求にはメッセージ本文がないため)。カスタム API で他の HTTP 動詞がサポートされている場合は、HTTPMethod
を適切に変更します。
Objective-C:
[self.client invokeAPI:@"sendEmail"
body:@{ @"contents": @"Hello world!" }
HTTPMethod:@"POST"
parameters:@{ @"to": @"bill@contoso.com", @"subject" : @"Hi!" }
headers:nil
completion: ^(NSData *result, NSHTTPURLResponse *response, NSError *error) {
if(error) {
NSLog(@"ERROR %@", error);
} else {
// Do something with result
}
}];
Swift:
client.invokeAPI("sendEmail",
body: [ "contents": "Hello World" ],
HTTPMethod: "POST",
parameters: [ "to": "bill@contoso.com", "subject" : "Hi!" ],
headers: nil)
{
(result, response, error) -> Void in
if let err = error {
print("ERROR ", err)
} else if let res = result {
// Do something with result
}
}
方法: クロスプラットフォーム通知を送信するプッシュ テンプレートを登録する
テンプレートを登録するには、クライアント アプリで client.push registerDeviceToken メソッドにテンプレートを渡します。
Objective-C:
[client.push registerDeviceToken:deviceToken template:iOSTemplate completion:^(NSError *error) {
if(error) {
NSLog(@"ERROR %@", error);
}
}];
Swift:
client.push?.registerDeviceToken(NSData(), template: iOSTemplate, completion: { (error) in
if let err = error {
print("ERROR ", err)
}
})
テンプレートは NSDictionary 型であり、次の形式で複数のテンプレートを含めることができます。
Objective-C:
NSDictionary *iOSTemplate = @{ @"templateName": @{ @"body": @{ @"aps": @{ @"alert": @"$(message)" } } } };
Swift:
let iOSTemplate = ["templateName": ["body": ["aps": ["alert": "$(message)"]]]]
すべてのタグは、セキュリティ要求から削除されます。 インストール内のインストールまたはテンプレートにタグを追加するには、「 Azure Mobile Apps 用 .NET バックエンド サーバー SDK の操作」を参照してください。 これらの登録済みテンプレートを使用して通知を送信するには、 Notification Hubs API を使用します。
方法: エラーを処理する
Azure App Service モバイル バックエンドを呼び出すと、完了ブロックには NSError
パラメーターが含まれます。 エラーが発生した場合、このパラメーターは nil 以外です。 コードでは、前のコード スニペットに示すように、このパラメーターを確認し、必要に応じてエラーを処理する必要があります。
ファイル <WindowsAzureMobileServices/MSError.h>
は、定数 MSErrorResponseKey
、 MSErrorRequestKey
、および MSErrorServerItemKey
を定義します。 エラーに関連するその他のデータを取得するには:
Objective-C:
NSDictionary *serverItem = [error.userInfo objectForKey:MSErrorServerItemKey];
Swift:
let serverItem = error.userInfo[MSErrorServerItemKey]
さらに、このファイルでは、エラー コードごとに定数が定義されます。
Objective-C:
if (error.code == MSErrorPreconditionFailed) {
Swift:
if (error.code == MSErrorPreconditionFailed) {
方法: Active Directory 認証ライブラリを使用してユーザーを認証する
Active Directory 認証ライブラリ (ADAL) を使用して、Azure Active Directory を使用してアプリケーションにユーザーをサインインさせることができます。 ID プロバイダー SDK を使用したクライアント フロー認証は、 loginWithProvider:completion:
方法を使用する方が望ましいです。 クライアント フロー認証は、よりネイティブな UX の操作性を提供し、追加のカスタマイズを可能にします。
App Service for Active Directory ログインの構成方法に関するチュートリアルに従って、AAD サインイン用のモバイル アプリ バックエンドを構成します。 ネイティブ クライアント アプリケーションを登録するオプションの手順を必ず完了してください。 iOS の場合、リダイレクト URI は
<app-scheme>://<bundle-id>
形式にすることをお勧めします。 詳細については、 ADAL iOS クイック スタートを参照してください。Cocoapods を使用して ADAL をインストールします。 次の定義を含むように Podfile を編集し、 YOUR-PROJECT を Xcode プロジェクトの名前に置き換えます。
source 'https://github.com/CocoaPods/Specs.git' link_with ['YOUR-PROJECT'] xcodeproj 'YOUR-PROJECT'
そしてポッド:
pod 'ADALiOS'
ターミナルを使用して、プロジェクトを含むディレクトリから
pod install
を実行し、生成された Xcode ワークスペース (プロジェクトではなく) を開きます。使用している言語に応じて、次のコードをアプリケーションに追加します。 それぞれで、次の置換を行います。
- INSERT-AUTHORITY-HERE を、アプリケーションをプロビジョニングしたテナントの名前に置き換えます。 形式は
https://login.microsoftonline.com/contoso.onmicrosoft.com
する必要があります。 この値は、Azure portalの Azure Active Directory の [ドメイン] タブからコピーできます。 - INSERT-RESOURCE-ID-HERE をモバイル アプリ バックエンドのクライアント ID に置き換えます。 クライアント ID は、ポータルの [Azure Active Directory 設定] の [詳細設定] タブから取得できます。
- INSERT-CLIENT-ID-HERE を、ネイティブ クライアント アプリケーションからコピーしたクライアント ID に置き換えます。
- INSERT-REDIRECT-URI-HERE を、HTTPS スキームを使用して、サイトの /.auth/login/done エンドポイントに置き換えます。 この値は、
https://contoso.azurewebsites.net/.auth/login/done
のようになります。
- INSERT-AUTHORITY-HERE を、アプリケーションをプロビジョニングしたテナントの名前に置き換えます。 形式は
Objective-C:
#import <ADALiOS/ADAuthenticationContext.h>
#import <ADALiOS/ADAuthenticationSettings.h>
// ...
- (void) authenticate:(UIViewController*) parent
completion:(void (^) (MSUser*, NSError*))completionBlock;
{
NSString *authority = @"INSERT-AUTHORITY-HERE";
NSString *resourceId = @"INSERT-RESOURCE-ID-HERE";
NSString *clientId = @"INSERT-CLIENT-ID-HERE";
NSURL *redirectUri = [[NSURL alloc]initWithString:@"INSERT-REDIRECT-URI-HERE"];
ADAuthenticationError *error;
ADAuthenticationContext *authContext = [ADAuthenticationContext authenticationContextWithAuthority:authority error:&error];
authContext.parentController = parent;
[ADAuthenticationSettings sharedInstance].enableFullScreen = YES;
[authContext acquireTokenWithResource:resourceId
clientId:clientId
redirectUri:redirectUri
completionBlock:^(ADAuthenticationResult *result) {
if (result.status != AD_SUCCEEDED)
{
completionBlock(nil, result.error);;
}
else
{
NSDictionary *payload = @{
@"access_token" : result.tokenCacheStoreItem.accessToken
};
[client loginWithProvider:@"aad" token:payload completion:completionBlock];
}
}];
}
Swift:
// add the following imports to your bridging header:
// #import <ADALiOS/ADAuthenticationContext.h>
// #import <ADALiOS/ADAuthenticationSettings.h>
func authenticate(parent: UIViewController, completion: (MSUser?, NSError?) -> Void) {
let authority = "INSERT-AUTHORITY-HERE"
let resourceId = "INSERT-RESOURCE-ID-HERE"
let clientId = "INSERT-CLIENT-ID-HERE"
let redirectUri = NSURL(string: "INSERT-REDIRECT-URI-HERE")
var error: AutoreleasingUnsafeMutablePointer<ADAuthenticationError?> = nil
let authContext = ADAuthenticationContext(authority: authority, error: error)
authContext.parentController = parent
ADAuthenticationSettings.sharedInstance().enableFullScreen = true
authContext.acquireTokenWithResource(resourceId, clientId: clientId, redirectUri: redirectUri) { (result) in
if result.status != AD_SUCCEEDED {
completion(nil, result.error)
}
else {
let payload: [String: String] = ["access_token": result.tokenCacheStoreItem.accessToken]
client.loginWithProvider("aad", token: payload, completion: completion)
}
}
}
方法: Facebook SDK for iOS でユーザーを認証する
Facebook SDK for iOS を使用して、Facebook を使用してアプリケーションにユーザーをサインインさせることができます。 loginWithProvider:completion:
方法を使用する場合は、クライアント フロー認証を使用することをお勧めします。 クライアント フロー認証は、よりネイティブな UX の操作性を提供し、追加のカスタマイズを可能にします。
App Service for Facebook ログイン の構成方法に関するチュートリアルに従って、Facebook サインイン用のモバイル アプリ バックエンドを構成します。
Facebook SDK for iOSをインストールするには、Facebook SDK for iOS - 入門ガイドに従ってください。 アプリを作成する代わりに、既存の登録に iOS プラットフォームを追加できます。
Facebook のドキュメントには、アプリ デリゲートに Objective-C コードがいくつか含まれています。 Swift を使用している場合は、AppDelegate.swift に次の翻訳を使用できます。
// Add the following import to your bridging header: // #import <FBSDKCoreKit/FBSDKCoreKit.h> func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool { FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions) // Add any custom logic here. return true } func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool { let handled = FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation) // Add any custom logic here. return handled }
プロジェクトに
FBSDKCoreKit.framework
を追加するだけでなく、同じ方法でFBSDKLoginKit.framework
への参照も追加します。使用している言語に応じて、次のコードをアプリケーションに追加します。
Objective-C:
#import <FBSDKLoginKit/FBSDKLoginKit.h> #import <FBSDKCoreKit/FBSDKAccessToken.h> // ... - (void) authenticate:(UIViewController*) parent completion:(void (^) (MSUser*, NSError*)) completionBlock; { FBSDKLoginManager *loginManager = [[FBSDKLoginManager alloc] init]; [loginManager logInWithReadPermissions: @[@"public_profile"] fromViewController:parent handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) { if (error) { completionBlock(nil, error); } else if (result.isCancelled) { completionBlock(nil, error); } else { NSDictionary *payload = @{ @"access_token":result.token.tokenString }; [client loginWithProvider:@"facebook" token:payload completion:completionBlock]; } }]; }
Swift:
// Add the following imports to your bridging header: // #import <FBSDKLoginKit/FBSDKLoginKit.h> // #import <FBSDKCoreKit/FBSDKAccessToken.h> func authenticate(parent: UIViewController, completion: (MSUser?, NSError?) -> Void) { let loginManager = FBSDKLoginManager() loginManager.logInWithReadPermissions(["public_profile"], fromViewController: parent) { (result, error) in if (error != nil) { completion(nil, error) } else if result.isCancelled { completion(nil, error) } else { let payload: [String: String] = ["access_token": result.token.tokenString] client.loginWithProvider("facebook", token: payload, completion: completion) } } }
方法: Twitter Fabric for iOS でユーザーを認証する
Fabric for iOS を使用して、Twitter を使用してユーザーをアプリケーションにサインインさせることができます。 クライアント フロー認証は、よりネイティブな UX の操作性を提供し、追加のカスタマイズが可能であるため、 loginWithProvider:completion:
メソッドを使用することをお勧めします。
Twitter ログイン用の App Service を構成する方法 に関するチュートリアルに従って、Twitter サインイン用のモバイル アプリ バックエンドを構成します。
Fabric for iOS - 入門ガイドドキュメントに従い、TwitterKit を設定して、Fabric をプロジェクトに追加します。
注
既定では、Fabric によって Twitter アプリケーションが自動的に作成されます。 次のコード スニペットを使用して、先ほど作成したコンシューマー キーとコンシューマー シークレットを登録することで、アプリケーションの作成を回避できます。 または、App Service に提供するコンシューマー キーとコンシューマー シークレットの値を 、Fabric ダッシュボードに表示される値に置き換えることができます。 このオプションを選択する場合は、コールバック URL をプレースホルダー値 (
https://<yoursitename>.azurewebsites.net/.auth/login/twitter/callback
など) に設定してください。前に作成したシークレットを使用する場合は、アプリ デリゲートに次のコードを追加します。
Objective-C:
#import <Fabric/Fabric.h> #import <TwitterKit/TwitterKit.h> // ... - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [[Twitter sharedInstance] startWithConsumerKey:@"your_key" consumerSecret:@"your_secret"]; [Fabric with:@[[Twitter class]]]; // Add any custom logic here. return YES; }
Swift:
import Fabric import TwitterKit // ... func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool { Twitter.sharedInstance().startWithConsumerKey("your_key", consumerSecret: "your_secret") Fabric.with([Twitter.self]) // Add any custom logic here. return true }
使用している言語に応じて、次のコードをアプリケーションに追加します。
Objective-C:
#import <TwitterKit/TwitterKit.h> // ... - (void)authenticate:(UIViewController*)parent completion:(void (^) (MSUser*, NSError*))completionBlock { [[Twitter sharedInstance] logInWithCompletion:^(TWTRSession *session, NSError *error) { if (session) { NSDictionary *payload = @{ @"access_token":session.authToken, @"access_token_secret":session.authTokenSecret }; [client loginWithProvider:@"twitter" token:payload completion:completionBlock]; } else { completionBlock(nil, error); } }]; }
Swift:
import TwitterKit // ... func authenticate(parent: UIViewController, completion: (MSUser?, NSError?) -> Void) { let client = self.table!.client Twitter.sharedInstance().logInWithCompletion { session, error in if (session != nil) { let payload: [String: String] = ["access_token": session!.authToken, "access_token_secret": session!.authTokenSecret] client.loginWithProvider("twitter", token: payload, completion: completion) } else { completion(nil, error) } } }
方法: Google Sign-In SDK for iOS でユーザーを認証する
Google Sign-In SDK for iOS を使用して、Google アカウントを使用してユーザーをアプリケーションにサインインさせることができます。 Google は最近、OAuth セキュリティ ポリシーの変更を発表しました。 これらのポリシーの変更には、今後 Google SDK を使用する必要があります。
App Service for Google ログインの構成方法に関するチュートリアルに従って、 Google サインイン用の モバイル アプリ バックエンドを構成します。
「Google Sign-In for iOS - ドキュメントの統合を開始する」に従って、Google SDK for iOS を インストールします。 「バックエンド サーバーで認証する」セクションはスキップできます。
使用している言語に応じて、デリゲートの
signIn:didSignInForUser:withError:
メソッドに次のコードを追加します。Objective-C:
NSDictionary *payload = @{ @"id_token":user.authentication.idToken, @"authorization_code":user.serverAuthCode }; [client loginWithProvider:@"google" token:payload completion:^(MSUser *user, NSError *error) { // ... }];
Swift:
let payload: [String: String] = ["id_token": user.authentication.idToken, "authorization_code": user.serverAuthCode] client.loginWithProvider("google", token: payload) { (user, error) in // ... }
また、アプリ デリゲートの
application:didFinishLaunchingWithOptions:
に次のコードを追加してください。"SERVER_CLIENT_ID" は、手順 1 で App Service の構成に使用したのと同じ ID に置き換えます。Objective-C:
[GIDSignIn sharedInstance].serverClientID = @"SERVER_CLIENT_ID";
Swift:
GIDSignIn.sharedInstance().serverClientID = "SERVER_CLIENT_ID"
使用している言語に従って、
GIDSignInUIDelegate
プロトコルを実装する UIViewController のアプリケーションに次のコードを追加します。 もう一度サインインする前にサインアウトされ、資格情報を再度入力する必要はありませんが、同意ダイアログが表示されます。 セッション トークンの有効期限が切れている場合にのみ、このメソッドを呼び出します。Objective-C:
#import <Google/SignIn.h> // ... - (void)authenticate { [GIDSignIn sharedInstance].uiDelegate = self; [[GIDSignIn sharedInstance] signOut]; [[GIDSignIn sharedInstance] signIn]; }
Swift:
// ... func authenticate() { GIDSignIn.sharedInstance().uiDelegate = self GIDSignIn.sharedInstance().signOut() GIDSignIn.sharedInstance().signIn() }