質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.06%

LineSDKでユーザープロフィールが取得できない。

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 548

score 9

経緯

Line連携実装したく、実機で自身のLineアカウントのプロフィールを取得する
テストアプリを作成しています。

テストアプリ完成イメージ

MUSHIKAGO APPS MEMOさんのこの記事の以下の写真部分までが実現したいテストアプリの完成状態です
イメージ説明

参考にしたサイト

LineSDK公式:ここは一から順番に実施しました
追憶行:コードはこちらを拝借しています。*一部エラーが出て変更

困りごと

分析(下記)しても特段のエラーはないように見えるにも関わらず、プロフィールが取得できない。

エラー詳細

コンソール内に出ている内容を調査した。
イメージ説明

エラー①内容
[LineSDK] Trying to start another login process while the previous one still valid.
This login process is ignore. Set `allowRecreatingLoginProcess` in login parameterif you want to allow this action.
エラー②内容
2020-01-12 04:39:21.180639+0900 LineLogin[12494:4817465] Can't end BackgroundTask: no background
task exists with identifier 2 (0x2), or it may have already been ended. Break in UIApplicationEndBackgroundTaskError() to debug.

ソースコード

# ファイル構成

一部cocoapods構成でうまくいかずやり直した経緯があるので、
構成が正しいのか自信がないです。
イメージ説明

# LoginViewController.swift
import UIKit
import Foundation
import LineSDK

class LineViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func login(_ sender: Any) {
        LoginManager.shared.login(permissions: [.profile], in: self) {
            result in
            switch result {
            case .success(let loginResult):
                print("throw")
                if let profile = loginResult.userProfile {
                    print("User ID: \(profile.userID)")
                    print("User Display Name: \(profile.displayName)")
                    print("User Icon: \(String(describing: profile.pictureURL))")
                }
            case .failure(let error):
                print(error)
            }
        }
    }
}
# エラーを返している部分(LineSDK内 : LoginConfiguration.swift)

イメージ説明

/// Logs in to the LINE Platform.
    ///
    /// - Parameters:
    ///   - permissions: The set of permissions requested by your app. The default value is
    ///                  `[.profile]`.
    ///   - viewController: The the view controller that presents the login view controller. If `nil`, the topmost
    ///                     view controller in the current view controller hierarchy will be used.
    ///   - parameters: The parameters used during the login process. For more information,
    ///                 see `LoginManager.Parameters`.
    ///   - completion: The completion closure to be invoked when the login action is finished.
    /// - Returns: The `LoginProcess` object which indicates that this method has started the login process.
    ///
    /// - Note:
    ///   Only one process can be started at a time. Do not call this method again to start a new login process
    ///   before `completion` is invoked.
    ///
    ///   If the value of `permissions` contains `.profile`, the user profile will be retrieved during the login
    ///   process and contained in the `userProfile` property of the `LoginResult` object in `completion`.
    ///   Otherwise, the `userProfile` property will be `nil`. Use this profile to identify your user. For
    ///   more information, see `UserProfile`.
    ///
    ///   An access token will be issued if the user authorizes your app. This token and a refresh token
    ///   will be automatically stored in the keychain of your app for later use. You do not need to
    ///   refresh the access token manually because any API call will attempt to refresh the access token if
    ///   necessary. However, if you need to refresh the access token manually, use the
    ///   `API.Auth.refreshAccessToken(with:)` method.
    ///
    @discardableResult
    public func login(
        permissions: Set<LoginPermission> = [.profile],
        in viewController: UIViewController? = nil,
        parameters: LoginManager.Parameters = .init(),
        completionHandler completion: @escaping (Result<LoginResult, LineSDKError>) -> Void
    ) -> LoginProcess?
    {
        lock.lock()
        defer { lock.unlock() }

        if !parameters.allowRecreatingLoginProcess && isAuthorizing {
            Log.print("Trying to start another login process while the previous one still valid. " +
            "This login process is ignore. Set `allowRecreatingLoginProcess` in login parameter" +
            "if you want to allow this action.")
            return nil
        }

        if parameters.allowRecreatingLoginProcess && isAuthorizing {
            if let process = currentProcess {
                self.currentProcess?.onFail.call(
                    LineSDKError.generalError(reason: .processDiscarded(process))
                )
            } else {
                Log.assertionFailure("The current process should exist. If you trigger this failure," +
                    " please report on the issue page: https://github.com/line/line-sdk-ios-swift/issues")
            }
        }

        let process = LoginProcess(
            configuration: LoginConfiguration.shared,
            scopes: permissions,
            parameters: parameters,
            viewController: viewController)
        process.onSucceed.delegate(on: self) { [unowned process] (self, result) in
            self.currentProcess = nil
            self.postLogin(
                token: result.token,
                response: result.response,
                process: process,
                completionHandler: completion)
        }
        process.onFail.delegate(on: self) { (self, error) in
            self.currentProcess = nil
            completion(.failure(error.sdkError))
        }

        process.start()

        self.currentProcess = process
        return currentProcess
    }
allowRecreatingLoginProcessの宣言部分
        /// Sets the nonce value for ID token verification. This value is used when requesting user authorization
        /// with `.openID` permission to prevent replay attacks to your backend server. If not set, LINE SDK will
        /// generate a random value as the token nonce. Whether set or not, LINE SDK verifies against the nonce value
        /// in received ID token locally.
        public var IDTokenNonce: String? = nil

        #if targetEnvironment(macCatalyst)
        public var allowRecreatingLoginProcess = true
        #else
        public var allowRecreatingLoginProcess = false
        #endif
isAuthorizingの宣言部分
    /// Checks and returns whether the authorizing process is currently ongoing.
    public var isAuthorizing: Bool {
        return currentProcess != nil
    }

エラー①分析

login関数内にBreakPointを設置してloginボタン押下直後のパラメーター

Printing description of parameters:
▿ Parameters
  - onlyWebLogin : false
  - botPromptStyle : nil
  - preferredWebPageLanguage : nil
  - IDTokenNonce : nil
  - allowRecreatingLoginProcess : false


上記ログイン関数内の[!parameters.allowRecreatingLoginProcess && isAuthorizing]にひかかっており、
parameters.allowRecreatingLoginProcessはこの時点でfalseなので、if条件としては、
!parameters.allowRecreatingLoginProcess //true
かつ
isAuthorizing true
でこのif分に入っていることは理解できた。
ただ、これはlog出すだけで、その後のlet process = LoginProcessには入っていくように見えます。
そこで、そこにBreakPoint設置して、loginボタン押下。processの中身は↓
これを見る限り悪いところがわかりませんでした。
イメージ説明

エラー②分析

こちらに関しては、stackoverflowにてiOS13特有の問題だとのコメントを見つけました。
Finally I've created an empty project Single View App. Only code generated by Xcode, I run the app on simulator, put it in background and I see the same warning. So I can say it's an iOS 13 issue. I hope Apple will fix it quickly because in Crashlytics I found some crash in my app caused by it.

ここまでの分析の結果、プロセス流れているように見えるのに、結果が返ってこない。と言う感じで
暗礁に乗り上げてしまっています。

どなたかご教授頂けると幸いです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る