新浪微博UWP版-实现‘分享功能’的艰难路

时间:2023-01-09 19:04:40

索引

介绍

在整个Team的共同努力下,在众多WPer的期待下,Weibo UWP版终于正式发布了。有关Weibo UWP版更多的信息请大家参考这篇博客

我个人是今年年初才进公司的,之前没有做过正规大型的UWP项目,只是平时出于个人喜爱做了一些跟Windows10相关的小东西。幸亏组里的其他几位Colleagues有一些经验,给我帮助了不少。大概在第一版提交测试之后,老板带领我们开了一个小会,规划了一下下一版本应该新增的几个功能,主要包括:夜间模式、搜索以及分享这三个。我被指定主要负责完成‘分享’这个功能,大概就是能将外部的‘照片’、‘链接’以及‘文本’通过系统分享渠道分享到微博中。当时感觉功能尤其简单,花一两天就能搞定,最终却发现困难重重。

遇到的问题

‘分享’这个功能要求微博APP作为数据的接收方,能够接收外部APP传过来的数据:

新浪微博UWP版-实现‘分享功能’的艰难路

如上图所示,用户可以分享‘图片’、‘URL’以及文本等内容到微博中。注意这里的微博APP是作为‘数据接收方(Receiver)’,这次主要讨论的是这种情况。下图显示的是APP作为‘数据发送方(Sender)’的情况:

新浪微博UWP版-实现‘分享功能’的艰难路

以上两种情况是对立的,前者接收数据,而后者发送数据。

搞懂原理之后,其实实现起来非常简单。本质上就是一个APP唤起另外一个APP(关于APP之间的数据交换和唤醒请参考这篇博客),我们只需要在APP接收方(即微博UWP)中的App这个Class中重写OnShareTargetActivated(ShareTargetActivatedEventArgs args)这个方法即可,然后在该方法中解析数据(如果需要),最后显示最终的分享界面。

现在你可能会说,如此简单,为什么会出现问题呢?是的,一开始我也觉得非常简单,迅速地将代码写完了,在OnShareTargetActivated方法中大概的逻辑是这样的(以分享图片为例):

新浪微博UWP版-实现‘分享功能’的艰难路

就在我摁下F5心想大功告成的时候,灾难出现了:每次不管是弹出‘登录界面’还是‘分享界面’时,主APP总会Crash。而且会报“you are accessing interface provided by another thread”的ErrorMsg。!我没有跨线程访问控件啊。

寻求帮助

之后我连续Google了两天,除了*上面有一篇跟我遇到相似的问题之外(关键还没人回复),其余什么思路也找不到。最后实在没有办法,抱着试一试的心态咨询了一下USA那边负责App2App方面的同事:

--------------------------Mail----------------------------

新浪微博UWP版-实现‘分享功能’的艰难路

----------------------------------------------------------

发完邮件后我继续在网上找答案,仍然没有找到解决方案。就在我对这个bug迷茫不知所措的时候,有人给我回复邮件了:

--------------------------Mail----------------------------

新浪微博UWP版-实现‘分享功能’的艰难路

----------------------------------------------------------

大概的意思是MSDN上的描述有错误,他们计划更正,但是并没有回复我为什么会报那个错误。之后我继续询问:

--------------------------Mail---------------------------

新浪微博UWP版-实现‘分享功能’的艰难路

---------------------------------------------------------

这个时候我已经开始怀疑同一个App中存在了两个UI Thread的可能。不过多久,对方给我回复,证实了我的怀疑是对的:

--------------------------Mail---------------------------

新浪微博UWP版-实现‘分享功能’的艰难路

---------------------------------------------------------

我的怀疑得到证实之后,心中大喜,终于知道原因了。但是我马上一想:即使同时存在两个UI线程,各自单独实例化自己的Pages、Controls等UI资源,为什么会报错呢?这时候我就开始怀疑之前别人写过的Pages、Controls内部代码是不是有问题。

由于刚接触项目不久,还不是完全清楚整个项目代码,尤其是那些已经稳定了几乎不会变的部分。我挨个打开‘登录界面’和‘分享界面’中涉及到的控件文件,挨个查看,最终发现了根本原因:

几乎大部分控件使用了单例模式。

是的,你没有听错,大部分控件都包含Static Instance这个静态属性,所有后台代码都是通过该静态属性去使用控件的。

最终的解决方案

知道原因了,下一步就是开始解决问题。那么怎样去解决呢?我刚开始打算将涉及到的控件(登录页面、分享页面使用了多种控件)、页面中的单例模式全部去掉,即使用正常的初始化。后来发现由于依赖太强,改完一个之后所有一连串的Class全部要改,这样波及到的文件太多太多。我不太敢这样下手,毕竟改动太大,可能会影响原来代码的稳定性。

最后取了一个折中的办法,将依赖性不高的文件改了,依赖性太高的Control我干脆复制了一份代码,另外取了一个相似的名称(万幸这样的Class最终发现只有三个)。

 

最终效果

最终问题顺利解决了。分享时可以正常弹出登录界面以及分享界面。下面传一张分享界面的图(分享图片为例,均来自模拟器的截图):

新浪微博UWP版-实现‘分享功能’的艰难路  新浪微博UWP版-实现‘分享功能’的艰难路  新浪微博UWP版-实现‘分享功能’的艰难路

以上是我解决一个问题的完整过程,从发现问题,到寻求帮助到最终问题的完美解决。没有下载微博UWP版的童鞋可以去试一下了! 很多功能都会在下一版中加进去,包括这篇文章中说到的‘分享’。

注:分享、搜索等功能如果不出意外的话,下一版本会发布。

新浪微博UWP版-实现‘分享功能’的艰难路的更多相关文章

  1. 【完全开源】知乎日报UWP版(下篇):商店APP、github源码、功能说明。Windows APP 良心出品。

    目录 说明 功能 截图+视频 关于源码和声明 说明 陆陆续续大概花了一个月的时间,APP算是基本完成了.12月份一直在外出差,在出差期间进行了两次功能完善,然后断断续续修补了一些bug,到目前为止,我 ...

  2. 【Android进阶】使用第三方平台ShareSDK实现新浪微博的一键分享功能

    在公司最近的一个项目中,需要实现一键分享功能,在这里我使用的是第三方平台ShareSDK,将使用经验与大家分享 先看效果图 主界面 分享界面 由于第一次使用,所以需要先进行新浪授权,授权界面 分享结果 ...

  3. 在Android中使App高速、简单地支持新浪微博、微信、QQ、facebook等十几个主流社交平台的分享功能

    前言 在如今的APP或者游戏中,分享功能差点儿已经成为标配.分享功能不但能够满足用户的需求.也能够为产品带来很多其它的用户,甚至能够对用户的行为.活跃度.年龄段等情况进行数据统计,使得软件公司能够对产 ...

  4. react native一键分享功能实现&原理和注意点(支持微信、qq、新浪微博等)

    目前手机使用的一键分享SDK比较主流的有两个:一个是ShareSDK,另一个是友盟分享. 又因为友盟功能比较多且比较全,比如说友盟统计.友盟推送等,所以本文重点介绍的是友盟分享功能在rn上的应用以及要 ...

  5. js实现QQ、微信、新浪微博分享功能

    微信分享需要手机扫描二维码,需要对url进行编码.在https协议下,扫描二维码时,浏览器打不开可能时安全证书导致的. var shareModel = { /** * 分享QQ好友 * @param ...

  6. android 实现分享功能两种方法

    当我想做一个智能的记事本的时候,我就在尝试自己写一组分享功能.后来才知道,原来每个社交软件中都有自己的分享接口. 这就大大减少了我们的代码量了. 第一种方法:特点--简单 package com.ex ...

  7. 【完全开源】知乎日报UWP版(上篇):界面设计、官方API分析

    目录 说明 使用Fiddler分析android版API 部分效果图 关于源码 说明 在做博客园UWP版的时候其实就有做知乎日报的打算了,前段时间一直出差,在酒店里用Fiddler简单的分析了一下An ...

  8. iOS快速集成友盟社会化分享功能(v6.1.1)

    1.  U-Share SDK集成 1.1 下载U-Share SDK 通过iOS社会化组件选择所需的社交平台后进行下载,下载链接http://dev.umeng.com/social/ios/sdk ...

  9. Android中使用ShareSDK集成分享功能

    引言      现在APP开发集成分享功能已经是非常普遍的需求了.其他集成分享技术我没有使用过,今天我就来介绍下使用ShareSDK来进行分享功能开发的一些基本步骤和注意点,帮助朋友们避免一些坑.好了 ...

随机推荐

  1. js学习之函数的参数传递

    我们都知道在 ECMAScript 中,数据类型分为原始类型(又称值类型/基本类型)和引用类型(又称对象类型):这里我将按照这两种类型分别对函数进行传参,看一下到底发生了什么. 参数的理解 首先,我们 ...

  2. 动手动脑小程序——TryAndCatch

    import java.util.Scanner; public class Gade { public static void main(String[] args) {  // TODO 自动生成 ...

  3. 【LeetCode】172. Factorial Trailing Zeroes

    Factorial Trailing Zeroes Given an integer n, return the number of trailing zeroes in n!. Note: Your ...

  4. bzoj 2435: [Noi2011]道路修建 树上 dp

    2435: [Noi2011]道路修建 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...

  5. HDOJ(HDU) 2186 悼念512汶川大地震遇难同胞——一定要记住我爱你

    Problem Description 当抢救人员发现她的时候,她已经死了,是被垮塌下来的房子压死的,透过那一堆废墟的的间隙可以看到她死亡的姿势,双膝跪着,整个上身向前匍匐着,双手扶着地支撑着身体,有 ...

  6. Reso | The Linux Command Line 的中文版

    http://book.haoduoshipin.com/tlcl/book/zh/ 本书是 The Linux Command Line 的中文版, 为大家提供了多种不同的阅读方式. 中英文双语版- ...

  7. CentOS 漏洞修补

    以前没注意 今后得实时更新系统漏洞和补丁了! 1.Bash软件安全漏洞检测及解决方案 http://netsecurity.51cto.com/art/201409/452322.htm

  8. 下载python的Crypto库出现的问题的解决:ModuleNotFoundError: No module named 'Crypto'

    在网上找了很多下载Crypto的方法,感觉作用都不算很大,然后自己瞎搞瞎搞就搞好了

  9. linux判断文件大小

    第一条code ll -s | tail -n +2 | awk '$1 >= 10 {print $1,$10 "容量大于10"} $1 <= 9 {print $1 ...

  10. spring注入bean的三种方法

    在Spring的世界中, 我们通常会利用bean config file 或者 annotation注解方式来配置bean. 在第一种利用bean config file(spring xml)方式中 ...