2017年12月25日 星期一

for xamarin ios,javascript call back to UIView

有些程式在web已經寫好了,想要xamarin UI中應用的話,
就ios而言,就可以利用"WebKit"了
今天就先討論從javascript丟回來呼叫xamarin UI怎麼做
==============某個要查看網頁的viewcontroller======
    public partial class MyMapViewController : UIViewController, IWKScriptMessageHandler {
        public MyMapViewController () : base("MyMapViewController ", null) {
        }

        public override void DidReceiveMemoryWarning() {
            base.DidReceiveMemoryWarning();
         
            // Release any cached data, images, etc that aren't in use.
        }

        public override void ViewDidLoad() {
            base.ViewDidLoad();

            var userController = new WKUserContentController();
            userController.AddScriptMessageHandler(this, "myApp");
            var config = new WKWebViewConfiguration {
                UserContentController = userController
            };
            var webkitView= new WebKit.WKWebView(viewContainScroll.Frame, config);
            webkitView.LoadRequest(new Foundation.NSUrlRequest(new NSUrl("你的web網址")));
            webkitView.ContentMode = UIViewContentMode.ScaleToFill;
            this.View.AddSubview(webkitView);
       }

public void DidReceiveScriptMessage(WKUserContentController userContentController,           WKScriptMessage message) {
            var msg = message.Body.ToString();
            System.Diagnostics.Debug.WriteLine(msg);
        }

============================================
手機端好了,再來就是看遙遠的雲端了
===============================
 <html>
   <body>
    <script type="text/javascript">
       //找個按鈕觸發這個doCallBack吧
       var doCallBack = function ( paraStr) {
            //以下的動作就會呼叫包含他的webkitview所AddScriptMessageHandler的物件的     
            //「DidReceiveScriptMessage」的函數來接受訊息了
            window.webkit.messageHandlers.myApp.postMessage("param=" + paraStr);
        }
         ...
         ...
         .....
    </script>
   </body>
</html>
================================
完整的討論來源,請參考這裡
現在的前端的工程師不只是二刀流的,
通常是剪刀菜刀剃頭刀手術刀小李飛刀都要會了

2017年12月22日 星期五

繪製半透明的png於底圖上之

正如同「身為一個汽車維修員,有個錘子在身邊,也很合邏輯」一樣
工程師嘛,圖片加工也要會是很自然不過的事了,特別是你有用到平面圖的機制時
「I am here」標示本來是不需要半透明的,基於方便參考其他地標時,還是給個半透明的版本好了
===================================================
               ...
               ...
              ...
              var Alpha=0.55f;
                Bitmap bmpIamHere = new Bitmap(imgIamHereIcon);
                Color background = bmpIamHere.GetPixel(0, 0);
                 //設定透明色為.....
                bmpIamHere.MakeTransparent(background);
                Graphics gfxMap = Graphics.FromImage(imgMap);
                //set alpha value.
                ColorMatrix cm = new ColorMatrix();
                cm.Matrix33 = Alpha;
                ImageAttributes ia = new ImageAttributes();
                ia.SetColorMatrix(cm);
             
                //沒有 Alpha值時,直接繪製,gfxMap.DrawImage(bmpIamHere, (float)markAtX, (float)markAtY, bmpIamHere.Width, bmpIamHere.Height);
               //有alpha值時,請用以下方式
                gfxMap.DrawImage(bmpIamHere, new Rectangle((int)markAtX, (int)markAtY, bmpIamHere.Width, bmpIamHere.Height), 0, 0, bmpIamHere.Width, bmpIamHere.Height, GraphicsUnit.Pixel, ia);
                ...
               ...
               ...
=================================================
來源在此

加油了

2017年12月20日 星期三

ERROR ITMS-90502: "Invalid Bundle. Apps that only contain the arm64 slice must also have 'arm64' in the list of UIRequiredDeviceCapabilities in Info.plist."

在用 application Launcher 上傳ipa到 iTunes connect  時
遇到以下的狀況:
「ERROR ITMS-90502: "Invalid Bundle. Apps that only contain the arm64 slice must also have 'arm64' in the list of UIRequiredDeviceCapabilities in Info.plist."」
這樣的問題直接就是去Info.plist去改:
==============================
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>arm64</string>
</array>
===============================
(從原來的armv7改成arm64就可以了)
記得:就算是只做testflight,也要把media.xcassets中的 icon都指定完才可以上beta測試
還有,用application launcher上傳完ipa檔後,不要只是在  iTunes connect的web介面去看「activities/活動」看它有沒有上傳
有時.......是不會出現的, iTunes connect會把問題寄到你的email而不是在application launcher上傳驗證後就直接給你答案.
多注意點不同的資訊管道吧

2017年12月10日 星期日

for xamarin android :如何自行觸發FCM中 service「onTokenRefresh」事件

相信大家都已經會基本的FCM的推播架構了
不過,或許你會問「如何觸發FirebaseInstanceIdService 中的OnTokenRefresh事件」
 官方的回應是安裝,反安裝套件,或是過一段時間會重行配置token
有個不錯的觸發方式可以參考
=======在某個activity中=================
 ...
...
... 按鈕click事件

btnDeleteToken.Click +=  delegate (object sender, EventArgs e) {
                 //注意,deleteFcmInstanace一定要另起執行緒執行,不能在MAIN_THREAD中執行
                var th = new System.Threading.Thread(
                      () => {
                          deleteFcmInstanace();
                      }
                 );
                th.Start();
            };
...
...
...
void deleteFcmInstanace(){
                Firebase.Iid.FirebaseInstanceId.Instance.DeleteInstanceId();
                Log.Debug("DONE", "delete token works");
               //一定要再InitializeApp,否則取得的token是null的
              //以下動作執行後,就會觸發FirebaseInstanceIdService 中的OnTokenRefresh事件
                Firebase.FirebaseApp.InitializeApp(this);
 var refreshedToken = Firebase.Iid.FirebaseInstanceId.Instance.Token;
}

====================================
做這事是有點不實際,只是想要驗證一下罷了,大家應該用不到
不過「好奇心」是所有programmer應該有的吧