5

所以我成功地将我的 Windows Phone 8 应用程序连接到 Live API,我也成功地从我的 hotmail 帐户中读取数据。

我可以访问所需的客户端 ID 和实时访问令牌。

但是当我退出并重新启动我的应用程序时,我失去了对会话和客户端对象的所有引用,我必须重新开始这个过程。

我不想用网络掩码惹恼用户,他必须再次同意他在每次启动应用程序时为我提供所需的权限。但是我也没有找到一种方法来获得对会话对象的引用,而无需这一步。

登录掩码仅在安装应用程序后第一次显示,之后仅显示上述屏幕。但是用户每次都接受这个还是挺烦人的。

我已经尝试序列化会话对象,这是不可能的,因为该类没有标准构造函数。

也许可以使用实时访问令牌创建一个新会话,但我还没有找到这样做的方法。

有任何想法吗?我做错了什么,我知道有一种方法可以在不提示用户的情况下再次登录。我感谢每一个想法。

我使用的一些代码:

    /// <summary>
    /// This method is responsible for authenticating an user asyncronesly to Windows Live.
    /// </summary>
    public void InitAuth()
    {
        this.authClient.LoginCompleted +=
            new EventHandler<LoginCompletedEventArgs>(this.AuthClientLoginCompleted);

        this.authClient.LoginAsync(someScopes);
    }

    /// <summary>
    /// This method is called when the Login process has been completed (successfully or with error).
    /// </summary>
    private void AuthClientLoginCompleted(object sender, LoginCompletedEventArgs e)
    {
        if (e.Status == LiveConnectSessionStatus.Connected)
        {
            LiveConnector.ConnectSession = e.Session; // where do I save this session for reuse?
            this.connectClient = new LiveConnectClient(LiveConnector.ConnectSession);

            // can I use this access token to create a new session later?
            LiveConnector.LiveAccessToken = LiveConnector.ConnectSession.AccessToken;

            Debug.WriteLine("Logged in.");
        }
        else if (e.Error != null)
        {
            Debug.WriteLine("Error signing in: " + e.Error.ToString());
        }
    }

我尝试使用 LiveAuthClient.InitializeAsync - 重新启动应用程序后在后台登录的方法,但会话对象保持为空:

// this is called after application is restarted
private void ReLogin()
{
    LiveAuthClient client = new LiveAuthClient(LiveConnector.ClientID);
            client.InitializeCompleted += OnInitializeCompleted;
            client.InitializeAsync(someScopes);
}


private void OnInitializeCompleted(object sender, LoginCompletedEventArgs e)
    {
        Debug.WriteLine("***************** Inititalisation completed **********");
        Debug.WriteLine(e.Status); // is undefined
        Debug.WriteLine(e.Session); // is empty
    }

有谁知道我如何在重新启动应用程序后访问新会话?

4

2 回答 2

9

经过整整两天的时间寻找我犯的错误,我终于发现了我做错了什么:我必须使用 wl.offline_access 范围来完成这项工作!

让我在这里引用另一个用户:

“如果您的应用程序使用 wl.offline_access 范围,那么 live:SignInButton 控件会为您保存并自动加载它。只需使用 SessionChanged 事件来捕获会话对象。这样用户只需登录一次。” (参见WP7 如何在 TombStoning 期间存储 LiveConnectSession?

现在一切又变得有趣了。不敢相信这是问题所在。测试和工作。好的!

于 2012-11-04T17:39:21.460 回答
2

我自己一直在努力让它在 Windows Live + Azure 移动服务应用程序上运行,所以我想我会在这里发布一个完整的工作代码示例,因为我已经让它工作了。

关键部分是 wl.offline_access 范围和对 InitializeAsync 的调用。

注意:此示例还连接到 Windows Azure 移动服务。如果您不使用它,只需删除与 MobileService 相关的内容。

    private static LiveConnectSession _session;
    private static readonly string[] scopes = new[] {"wl.signin", "wl.offline_access", "wl.basic"};

    private async System.Threading.Tasks.Task Authenticate()
    {
        try
        {
            var liveIdClient = new LiveAuthClient("YOUR_CLIENT_ID");
            var initResult = await liveIdClient.InitializeAsync(scopes);

            _session = initResult.Session;


            if (null != _session)
            {
                await MobileService.LoginWithMicrosoftAccountAsync(_session.AuthenticationToken);
            }

            if (null == _session)
            {
                LiveLoginResult result = await liveIdClient.LoginAsync(scopes);

                if (result.Status == LiveConnectSessionStatus.Connected)
                {
                    _session = result.Session;
                    await MobileService.LoginWithMicrosoftAccountAsync(result.Session.AuthenticationToken);

                }
                else
                {
                    _session = null;
                    MessageBox.Show("Unable to authenticate with Windows Live.", "Login failed :(", MessageBoxButton.OK);
                }
            }
        }
        finally
        {
        }
    }
于 2013-07-11T19:21:03.867 回答