新浪微博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来进行分享功能开发的一些基本步骤和注意点,帮助朋友们避免一些坑.好了 ...
随机推荐
- 【转载】兼容php5,php7的cURL文件上传示例
转载来自: http://www.huanlinna.com/2016/06/25/coding/php5-php7-upload-demo-via-curl.html https://segment ...
- 用python读写excel(xlrd、xlwt)
最近需要从多个excel表里面用各种方式整理一些数据,虽然说原来用过java做这类事情,但是由于最近在学python,所以当然就决定用python尝试一下了.发现python果然简洁很多.这里简单记录 ...
- .NET 项目代码风格要求
原文:http://kb.cnblogs.com/page/179593/ 项目代码风格要求 PDF版下载:项目代码风格要求V1.0.pdf 代码风格没有正确与否,重要的是整齐划一,这是我拟的一份&l ...
- iOS路径沙盒文件管理(转载)
iOS路径沙盒文件管理,看到博主总结的很好,转载过来,原文:http://www.aichengxu.com/view/35264 一.iOS中的沙盒机制 iOS应用程序只能对自己创建的文件系统读取文 ...
- 在 Delphi 中判断一个字符是中文的方法
http://blog.163.com/l1_jun/blog/static/143863882011741124581/ 由于 Delphi2005 支持中文标识符,在编写 PASCAL 词法分析器 ...
- 转: Delphi的OverRide、OverLoad和Virtual方法
http://blog.csdn.net/ckli/article/details/2201418 override 重写 也叫覆盖 .方法的重写Overriding和重载Overloading是Ja ...
- ASP.NET中GridView数据导出到Excel
/// <summary> /// 导出按钮 /// </summary> /// <param name="sender"></para ...
- brew管理node的版本
摘要 nvm可以.brew怎么去切换不同的node版本 转载请注明出处:http://my.oschina.net/uniquejava/blog/491030 brew详解:http://stack ...
- 同步机制 note
1.信号量与互斥体的不同之处: 不需要由最初获取它的那个线程来释放. 信号量可以用来调停对资源池的访问. 2. 条件变量: 允许任意复杂的条件表达式作为等待条件,允许更复杂的调度策略.
- HTML5 学习笔记(二)——HTML5新增属性与表单元素
目录 一.HTML5新增属性 1.1.contextmenu 1.2.contentEditable 1.3.hidden 1.4.draggable 1.5.data-* 1.6.placehold ...