新浪微博UWP版-实现‘分享功能’的艰难路
索引
介绍
在整个Team的共同努力下,在众多WPer的期待下,Weibo UWP版终于正式发布了。有关Weibo UWP版更多的信息请大家参考这篇博客。
我个人是今年年初才进公司的,之前没有做过正规大型的UWP项目,只是平时出于个人喜爱做了一些跟Windows10相关的小东西。幸亏组里的其他几位Colleagues有一些经验,给我帮助了不少。大概在第一版提交测试之后,老板带领我们开了一个小会,规划了一下下一版本应该新增的几个功能,主要包括:夜间模式、搜索以及分享这三个。我被指定主要负责完成‘分享’这个功能,大概就是能将外部的‘照片’、‘链接’以及‘文本’通过系统分享渠道分享到微博中。当时感觉功能尤其简单,花一两天就能搞定,最终却发现困难重重。
遇到的问题
‘分享’这个功能要求微博APP作为数据的接收方,能够接收外部APP传过来的数据:

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

以上两种情况是对立的,前者接收数据,而后者发送数据。
搞懂原理之后,其实实现起来非常简单。本质上就是一个APP唤起另外一个APP(关于APP之间的数据交换和唤醒请参考这篇博客),我们只需要在APP接收方(即微博UWP)中的App这个Class中重写OnShareTargetActivated(ShareTargetActivatedEventArgs args)这个方法即可,然后在该方法中解析数据(如果需要),最后显示最终的分享界面。
现在你可能会说,如此简单,为什么会出现问题呢?是的,一开始我也觉得非常简单,迅速地将代码写完了,在OnShareTargetActivated方法中大概的逻辑是这样的(以分享图片为例):

就在我摁下F5心想大功告成的时候,灾难出现了:每次不管是弹出‘登录界面’还是‘分享界面’时,主APP总会Crash。而且会报“you are accessing interface provided by another thread”的ErrorMsg。!我没有跨线程访问控件啊。
寻求帮助
之后我连续Google了两天,除了StackOverflow上面有一篇跟我遇到相似的问题之外(关键还没人回复),其余什么思路也找不到。最后实在没有办法,抱着试一试的心态咨询了一下USA那边负责App2App方面的同事:
--------------------------Mail----------------------------

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

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

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

---------------------------------------------------------
我的怀疑得到证实之后,心中大喜,终于知道原因了。但是我马上一想:即使同时存在两个UI线程,各自单独实例化自己的Pages、Controls等UI资源,为什么会报错呢?这时候我就开始怀疑之前别人写过的Pages、Controls内部代码是不是有问题。
由于刚接触项目不久,还不是完全清楚整个项目代码,尤其是那些已经稳定了几乎不会变的部分。我挨个打开‘登录界面’和‘分享界面’中涉及到的控件文件,挨个查看,最终发现了根本原因:
几乎大部分控件使用了单例模式。
是的,你没有听错,大部分控件都包含Static Instance这个静态属性,所有后台代码都是通过该静态属性去使用控件的。
最终的解决方案
知道原因了,下一步就是开始解决问题。那么怎样去解决呢?我刚开始打算将涉及到的控件(登录页面、分享页面使用了多种控件)、页面中的单例模式全部去掉,即使用正常的初始化。后来发现由于依赖太强,改完一个之后所有一连串的Class全部要改,这样波及到的文件太多太多。我不太敢这样下手,毕竟改动太大,可能会影响原来代码的稳定性。
最后取了一个折中的办法,将依赖性不高的文件改了,依赖性太高的Control我干脆复制了一份代码,另外取了一个相似的名称(万幸这样的Class最终发现只有三个)。
最终效果
最终问题顺利解决了。分享时可以正常弹出登录界面以及分享界面。下面传一张分享界面的图(分享图片为例,均来自模拟器的截图):

以上是我解决一个问题的完整过程,从发现问题,到寻求帮助到最终问题的完美解决。没有下载微博UWP版的童鞋可以去试一下了! 很多功能都会在下一版中加进去,包括这篇文章中说到的‘分享’。
注:分享、搜索等功能如果不出意外的话,下一版本会发布。
新浪微博UWP版-实现‘分享功能’的艰难路的更多相关文章
- 【完全开源】知乎日报UWP版(下篇):商店APP、github源码、功能说明。Windows APP 良心出品。
目录 说明 功能 截图+视频 关于源码和声明 说明 陆陆续续大概花了一个月的时间,APP算是基本完成了.12月份一直在外出差,在出差期间进行了两次功能完善,然后断断续续修补了一些bug,到目前为止,我 ...
- 【Android进阶】使用第三方平台ShareSDK实现新浪微博的一键分享功能
在公司最近的一个项目中,需要实现一键分享功能,在这里我使用的是第三方平台ShareSDK,将使用经验与大家分享 先看效果图 主界面 分享界面 由于第一次使用,所以需要先进行新浪授权,授权界面 分享结果 ...
- 在Android中使App高速、简单地支持新浪微博、微信、QQ、facebook等十几个主流社交平台的分享功能
前言 在如今的APP或者游戏中,分享功能差点儿已经成为标配.分享功能不但能够满足用户的需求.也能够为产品带来很多其它的用户,甚至能够对用户的行为.活跃度.年龄段等情况进行数据统计,使得软件公司能够对产 ...
- react native一键分享功能实现&原理和注意点(支持微信、qq、新浪微博等)
目前手机使用的一键分享SDK比较主流的有两个:一个是ShareSDK,另一个是友盟分享. 又因为友盟功能比较多且比较全,比如说友盟统计.友盟推送等,所以本文重点介绍的是友盟分享功能在rn上的应用以及要 ...
- js实现QQ、微信、新浪微博分享功能
微信分享需要手机扫描二维码,需要对url进行编码.在https协议下,扫描二维码时,浏览器打不开可能时安全证书导致的. var shareModel = { /** * 分享QQ好友 * @param ...
- android 实现分享功能两种方法
当我想做一个智能的记事本的时候,我就在尝试自己写一组分享功能.后来才知道,原来每个社交软件中都有自己的分享接口. 这就大大减少了我们的代码量了. 第一种方法:特点--简单 package com.ex ...
- 【完全开源】知乎日报UWP版(上篇):界面设计、官方API分析
目录 说明 使用Fiddler分析android版API 部分效果图 关于源码 说明 在做博客园UWP版的时候其实就有做知乎日报的打算了,前段时间一直出差,在酒店里用Fiddler简单的分析了一下An ...
- iOS快速集成友盟社会化分享功能(v6.1.1)
1. U-Share SDK集成 1.1 下载U-Share SDK 通过iOS社会化组件选择所需的社交平台后进行下载,下载链接http://dev.umeng.com/social/ios/sdk ...
- Android中使用ShareSDK集成分享功能
引言 现在APP开发集成分享功能已经是非常普遍的需求了.其他集成分享技术我没有使用过,今天我就来介绍下使用ShareSDK来进行分享功能开发的一些基本步骤和注意点,帮助朋友们避免一些坑.好了 ...
随机推荐
- Python-面向对象(类)一
一.如何创建类 class cls: pass 二.创建方法 构造方法: __init__(self, arg) obj = 类('a1') 普通方法: obj = 类('xxx') obj.普通方法 ...
- 华为荣耀6 H60-L02/L12(联通版)救砖包【适用于无限重启】
本帖最后由 HOT米粒 于 2014-11-16 20:43 编辑 华为荣耀6 H60-L02/L12(联通版)救砖包[适用于无限重启]说明: 1.本工具包用于华为荣耀6 H60-L02(联通版): ...
- jQuery之ajax错误调试分析
jQuery中把ajax封装得非常好.但是日常开发中,我偶尔还是会遇到ajax报错.这里简单分析一下ajax报错 一般的jQuery用法如下,ajax通过post方式提交"汤姆和老鼠&quo ...
- mac osx Forbidden You don't have permission to access / on this server解决方法
(1)首先查看*.conf 是否有读写权限,如果没有要将文件赋予读写权限,比如 localhost.conf (2)再查看/Users/username/Sites/localhost/文件夹是否有i ...
- 图论 - 寻找fly真迹
一天fly正坐在课堂上发呆,突然,他注意到了桌面上的一个字符串S1S2S3S4...Sn,这个字符串只由字符"a","b"和"c"构成.刚好 ...
- js学习笔记 (继续)
转义字符不断行的空白格 nbsp:1 2半方大的空白 ensp 1 2全方大的空白 emsp 1 2小于号 < <大于号 > >双引号 " "AND符号 & ...
- 遍历datatable的方法
+方法一:DataTable dt = dataSet.Tables[0];for(int i = 0 ; i < dt.Rows.Count ; i++){string strName = d ...
- Avoiding InvokeRequired
Just read a good article to do cross-thread calling in an easy and elegant way. It is amazing for it ...
- Salesforce学习笔记(一)
Force平台简介 一.Force平台应用程序的优点1.以数据为中心的应用程序(一个对象就是一个数据库表) 由于该平台以数据库为中心,它让你能够编写以数据为中心的应用程序.以数据为中心的应用程序是基于 ...
- 从源代码构建 Go 开发环境
从源代码构建 Go 开发环境 Go 1.5 之前的版本 安装C 语言开发环境 在Go 1.5 之前的版本(比如 1.3.1.4),都会部分的依赖 C 语言的工具链,所以如果你有C 语言的开发环境,就可 ...