2021年2月24日 星期三

APNS從by certificate 到by jwt 的升級側記

apns一直都運作的好端端的, app客戶說要再加一個姊妹作,但是仍用同樣的apns機制(因為資料源都是一樣,只是內容有點差異)
於是故事就這樣展開了
目前apns server是windows server 2012,web project 是asp.net 4.5
參考以下的方式改寫了推播apns那段 
從此公主跟PG就過著幸福快樂的生活了.....想的美

當你trace到 var secretKey = CngKey.Import 時,會遇到「system cannot find the file specified 」例外,
可是明明路徑都正確啊......是的,你需要比較高的權限
相對的,你的application pool identity也要提高權限
然後....
你明明在IDE中執行httpClient.SendAsync都很正常,可是怎麼放在iis給他執行就出現這種例外
「call to SSPI failed, see inner exception. StackTrace:   at System.Net.Security.SslState.InternalEndProcessAuthentication(LazyAsyncResult lazyResult)
...
..
...」
答案是......server 2012的IIS不支援http/2
所以,請把你的server升級到server 2016再來打怪吧

花了半天升級了server,結果又是在httpClient.SendAsync出錯,這時是....「timeout」!?
可是明明在IDE debug確又正常啊.....
那就是要升級你的framework的時候了,把專案從4.5升級到4.6吧
(前輩如是說的.....https://stackoverflow.com/questions/32685151/how-to-make-the-net-httpclient-use-http-2-0)
還有,別再用httpTwo了而是用「WinHttpHandler」,如同第33則po文一樣--
-------------------
1.Make sure you are on the latest version of Windows 10.

2.Install WinHttpHandler:

Install-Package System.Net.Http.WinHttpHandler

3.Extend WinHttpHandler to add http2.0 support:

public class Http2CustomHandler : WinHttpHandler
{
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
    {
        request.Version = new Version("2.0");
        return base.SendAsync(request, cancellationToken);
    }
}

4.Pass above handler to the HttpClient constructor

using (var httpClient = new HttpClient(new Http2CustomHandler()))
{
      // your custom code
}
---------------------------------
(所以就是要用非同步的方式去呼叫了,沒差,用執行緒去做就是了)
雖然案主說你就再申請一個apns 憑證嘛.何必這樣大費周章?
可是每一個憑證每年都要換證,就是怕在換證時uer漏接了重要的訊息
這次一做,日後很多個APP都可以共用,也沒有期限問題,長痛不如短痛啊,根本性地解決問題,不亦快哉?

2021年2月21日 星期日

SecKeyChain.Add return Security.SecStatusCode.MissingEntitlement !?

 在xamarin ios經常更新,以往的加解密函數現在出現這現象
----code----

var s = new SecRecord(SecKind.GenericPassword) {

                ValueData = NSData.FromString(value),

                Generic = NSData.FromString(key),

                Invisible = true,

                CreationDate = NSDate.Now


            };

            var err = SecKeyChain.Add(s);

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

結果err傳回值是「Security.SecStatusCode.MissingEntitlement

好在別人已經踢到鐵板了,請參考以下的方式修改

https://forums.xamarin.com/discussion/145357/seckeychain-add-return-security-secstatuscode-missingentitlement

注意,其中的
------------

<key>keychain-access-groups</key>

<array>

<string>$(AppIdentifierPrefix)你的appBundle ID</string>

</array>

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

紅色字$(AppIdentifierPrefix)要去掉,

這是用vs2019 IOS manifest Editor打開加入keychain選項他自己加上去的

要小心--盡信editor不如無editor


加油!!