diff --git a/.github/fabricbot.json b/.github/fabricbot.json
index 1857296f70..6b523c758c 100644
--- a/.github/fabricbot.json
+++ b/.github/fabricbot.json
@@ -32,6 +32,233 @@
]
}
},
+ {
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "IssuesOnlyResponder",
+ "version": "1.0",
+ "config": {
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "name": "labelAdded",
+ "parameters": {
+ "label": "need-repro"
+ }
+ }
+ ]
+ },
+ "eventType": "issue",
+ "eventNames": [
+ "issues",
+ "project_card"
+ ],
+ "taskName": "Add comment when 'need-repro' is applied to issue",
+ "actions": [
+ {
+ "name": "addReply",
+ "parameters": {
+ "comment": "Hi @${issueAuthor}. We have added the \"need-repro\" label to this issue, which indicates that we require steps and sample code to reproduce the issue before we can take further action. Please try to create a minimal sample project/solution or code samples which reproduce the issue, ideally as a GitHub repo that we can clone. See more details about creating repros here: https://github.com/xamarin/xamarin-macios/blob/main/docs/bug-repro.md\n\nThis issue will be closed automatically in 7 days if we do not hear back from you by then - please feel free to re-open it if you come back to this issue after that time."
+ }
+ }
+ ]
+ }
+ },
+ {
+ "taskType": "scheduled",
+ "capabilityId": "ScheduledSearch",
+ "subCapability": "ScheduledSearch",
+ "version": "1.1",
+ "config": {
+ "frequency": [
+ {
+ "weekDay": 1,
+ "hours": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23
+ ],
+ "timezoneOffset": -5
+ },
+ {
+ "weekDay": 2,
+ "hours": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23
+ ],
+ "timezoneOffset": -5
+ },
+ {
+ "weekDay": 3,
+ "hours": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23
+ ],
+ "timezoneOffset": -5
+ },
+ {
+ "weekDay": 4,
+ "hours": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23
+ ],
+ "timezoneOffset": -5
+ },
+ {
+ "weekDay": 5,
+ "hours": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23
+ ],
+ "timezoneOffset": -5
+ }
+ ],
+ "searchTerms": [
+ {
+ "name": "isIssue",
+ "parameters": {}
+ },
+ {
+ "name": "isOpen",
+ "parameters": {}
+ }, {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "need-info"
+ }
+ },
+ {
+ "name": "noActivitySince",
+ "parameters": {
+ "days": 7
+ }
+ }
+ ],
+ "taskName": "[Idle Issue Management] Close stale 'need-info' issues",
+ "actions": [
+ {
+ "name": "addReply",
+ "parameters": {
+ "comment": "Hi @${issueAuthor}. Due to inactivity, we will be closing this issue. Please feel free to re-open this issue if the issue persists. For enhanced visibility, if over 7 days have passed, please open a new issue and link this issue there. Thank you."
+ }
+ },
+ {
+ "name": "closeIssue",
+ "parameters": {}
+ }
+ ]
+ }
+ },
{
"taskType": "scheduled",
"capabilityId": "ScheduledSearch",
@@ -199,12 +426,12 @@
"name": "isOpen",
"parameters": {}
},
- {
- "name": "hasLabel",
- "parameters": {
- "label": "need-info"
- }
- },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "need-repro"
+ }
+ },
{
"name": "noActivitySince",
"parameters": {
@@ -212,7 +439,7 @@
}
}
],
- "taskName": "[Idle Issue Management] Close stale 'need-info' issues",
+ "taskName": "[Idle Issue Management] Close stale 'need-repro' issues",
"actions": [
{
"name": "addReply",
@@ -246,12 +473,23 @@
"name": "isOpen",
"parameters": {}
},
- {
- "name": "hasLabel",
- "parameters": {
- "label": "need-info"
- }
- },
+ {
+ "operator": "or",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "need-info"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "need-repro"
+ }
+ }
+ ]
+ },
{
"operator": "not",
"operands": [
@@ -280,7 +518,7 @@
"eventNames": [
"issue_comment"
],
- "taskName": "[Idle Issue Management] Replace 'need-info' with 'need-attention' label when the customer comments on an issue",
+ "taskName": "[Idle Issue Management] Replace 'need-info' and 'need-repro' with 'need-attention' label when the customer comments on an issue",
"actions": [
{
"name": "removeLabel",
@@ -288,6 +526,12 @@
"label": "need-info"
}
},
+ {
+ "name": "removeLabel",
+ "parameters": {
+ "label": "need-repro"
+ }
+ },
{
"name": "addLabel",
"parameters": {
@@ -379,6 +623,12 @@
"label": "need-info"
}
},
+ {
+ "name": "removeLabel",
+ "parameters": {
+ "label": "need-repro"
+ }
+ },
{
"name": "addLabel",
"parameters": {
@@ -544,5 +794,228 @@
}
]
}
- }
+ },
+ {
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "IssuesOnlyResponder",
+ "version": "1.0",
+ "config": {
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "name": "isOpen",
+ "parameters": {}
+ },
+ {
+ "name": "labelAdded",
+ "parameters": {
+ "label": "move-to-vs-feedback"
+ }
+ }
+ ]
+ },
+ "eventType": "issue",
+ "eventNames": [
+ "issues",
+ "project_card"
+ ],
+ "taskName": "Ask user to use VS Feedback for VS issues",
+ "actions": [
+ {
+ "name": "addReply",
+ "parameters": {
+ "comment": "Thanks for the issue report @${issueAuthor}! This issue appears to be a problem with Visual Studio, so we ask that you use the VS feedback tool to report the issue. That way it will get to the routed to the team that owns this experience in VS.\n\nIf you encounter a problem with Visual Studio, we want to know about it so that we can diagnose and fix it. By using the Report a Problem tool, you can collect detailed information about the problem, and send it to Microsoft with just a few button clicks.\n\n1. Go to the [Visual Studio for Windows feedback tool](https://docs.microsoft.com/visualstudio/ide/how-to-report-a-problem-with-visual-studio?view=vs-2022) or [Visual Studio for Mac feedback tool](https://learn.microsoft.com/en-us/visualstudio/mac/report-a-problem?view=vsmac-2022) to report the issue\n2. Close this bug, and consider adding a link to the VS Feedback issue so that others can follow its activity there.\n\nThis issue will be automatically closed in 3 days if there are no further comments."
+ }
+ }
+ ]
+ }
+ },
+ {
+ "taskType": "scheduled",
+ "capabilityId": "ScheduledSearch",
+ "subCapability": "ScheduledSearch",
+ "version": "1.1",
+ "config": {
+ "frequency": [
+ {
+ "weekDay": 0,
+ "hours": [
+ 0,
+ 6,
+ 12,
+ 18
+ ]
+ },
+ {
+ "weekDay": 1,
+ "hours": [
+ 0,
+ 6,
+ 12,
+ 18
+ ]
+ },
+ {
+ "weekDay": 2,
+ "hours": [
+ 0,
+ 6,
+ 12,
+ 18
+ ]
+ },
+ {
+ "weekDay": 3,
+ "hours": [
+ 0,
+ 6,
+ 12,
+ 18
+ ]
+ },
+ {
+ "weekDay": 4,
+ "hours": [
+ 0,
+ 6,
+ 12,
+ 18
+ ]
+ },
+ {
+ "weekDay": 5,
+ "hours": [
+ 0,
+ 6,
+ 12,
+ 18
+ ]
+ },
+ {
+ "weekDay": 6,
+ "hours": [
+ 0,
+ 6,
+ 12,
+ 18
+ ]
+ }
+ ],
+ "searchTerms": [
+ {
+ "name": "isOpen",
+ "parameters": {}
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "move-to-vs-feedback"
+ }
+ },
+ {
+ "name": "noActivitySince",
+ "parameters": {
+ "days": 3
+ }
+ }
+ ],
+ "taskName": "Close 'move-to-vs-feedback' after 3 days of no activity",
+ "actions": [
+ {
+ "name": "addReply",
+ "parameters": {
+ "comment": "This issue is being closed due to inactivity. If this issue is still affecting you, please follow the steps above to use the VS Feedback Tool to report the issue."
+ }
+ },
+ {
+ "name": "closeIssue",
+ "parameters": {}
+ }
+ ]
+ }
+ },
+ {
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "IssueCommentResponder",
+ "version": "1.0",
+ "config": {
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "name": "isOpen",
+ "parameters": {}
+ },
+ {
+ "name": "isAction",
+ "parameters": {
+ "action": "created"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "move-to-vs-feedback"
+ }
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "noActivitySince",
+ "parameters": {
+ "days": 3
+ }
+ }
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isCloseAndComment",
+ "parameters": {}
+ }
+ ]
+ },
+ {
+ "name": "isActivitySender",
+ "parameters": {
+ "user": {
+ "type": "author"
+ }
+ }
+ },
+ {
+ "name": "activitySenderHasPermissions",
+ "parameters": {
+ "permissions": "none"
+ }
+ }
+ ]
+ },
+ "eventType": "issue",
+ "eventNames": [
+ "issue_comment"
+ ],
+ "taskName": "For issues labeled with 'move-to-vs-feedback' mark as 'need-attention' if there is activity",
+ "actions": [
+ {
+ "name": "removeLabel",
+ "parameters": {
+ "label": "move-to-vs-feedback"
+ }
+ },
+ {
+ "name": "addLabel",
+ "parameters": {
+ "label": "need-attention"
+ }
+ }
+ ]
+ }
+ }
]
diff --git a/DOWNLOADS.md b/DOWNLOADS.md
index 8ad7ec547f..5fc055e2df 100644
--- a/DOWNLOADS.md
+++ b/DOWNLOADS.md
@@ -2,7 +2,8 @@
| Date | Version | Package | Release Notes |
|------|---------|---------|---------------|
-|2022/09/27|16.0.0.72|[xamarin.ios-16.0.0.72.pkg](https://download.visualstudio.microsoft.com/download/pr/60e4de68-2380-4aa3-b12e-2c65838a0bdb/656877ed7c3b5e5b94f7d2fbeb886655/xamarin.ios-16.0.0.72.pkg)||
+|2022/12/15|16.1.1.27|[xamarin.ios-16.1.1.27.pkg](https://download.visualstudio.microsoft.com/download/pr/c8bc547f-869e-4d64-a271-f8b3a29ee545/3d8cfa414fa3e4005dd5b9b9d3817aa4/xamarin.ios-16.1.1.27.pkg)||
+|2022/10/11|16.0.0.72|[xamarin.ios-16.0.0.72.pkg](https://download.visualstudio.microsoft.com/download/pr/81c41aaa-a3d7-4875-8416-d04b472379b7/21d9f6c5ad3a6bc2479b2ec4b0685b6c/xamarin.ios-16.0.0.72.pkg)||
|2022/08/09|15.12.0.2|[xamarin.ios-15.12.0.2.pkg](https://download.visualstudio.microsoft.com/download/pr/e81e04d3-768a-4310-9c9b-f32e8ba00eaa/0e27caf0877adb5c6fe6d634d26da40a/xamarin.ios-15.12.0.2.pkg)||
|2022/06/14|15.10.0.5|[xamarin.ios-15.10.0.5.pkg](https://download.visualstudio.microsoft.com/download/pr/09e9572f-1c2a-4d79-a1e8-5469de9410e8/3c7be8df7e8249f2c3142e4c10ae5523/xamarin.ios-15.10.0.5.pkg)||
|2022/05/23|15.10.0.1|[xamarin.ios-15.10.0.1.pkg](https://download.visualstudio.microsoft.com/download/pr/afed6f32-67b3-4684-b0a4-e2b74d751bce/efaa7d62658b8285baafc2d6fc8f930a/xamarin.ios-15.10.0.1.pkg)||
@@ -169,6 +170,7 @@
| Date | Version | Package | Release Notes |
|------|---------|---------|---------------|
+|2022/12/15|9.0.0.27|[xamarin.mac-9.0.0.27.pkg](https://download.visualstudio.microsoft.com/download/pr/c8bc547f-869e-4d64-a271-f8b3a29ee545/4fbfc55453fe36fe5bf4128d6d495911/xamarin.mac-9.0.0.27.pkg)||
|2022/08/09|8.12.0.2|[xamarin.mac-8.12.0.2.pkg](https://download.visualstudio.microsoft.com/download/pr/e81e04d3-768a-4310-9c9b-f32e8ba00eaa/bcff5cca8701bc5871b8892fd32fb3e6/xamarin.mac-8.12.0.2.pkg)||
|2022/06/14|8.10.0.5|[xamarin.mac-8.10.0.5.pkg](https://download.visualstudio.microsoft.com/download/pr/09e9572f-1c2a-4d79-a1e8-5469de9410e8/f4ee484851ac275ccd51fcee70451fb0/xamarin.mac-8.10.0.5.pkg)||
|2022/05/23|8.10.0.1|[xamarin.mac-8.10.0.1.pkg](https://download.visualstudio.microsoft.com/download/pr/afed6f32-67b3-4684-b0a4-e2b74d751bce/7a6059ca429d778d1e1a3525a337eb66/xamarin.mac-8.10.0.1.pkg)||
diff --git a/Localize/loc/cs/dotnet/Templates/Microsoft.iOS.Templates/ios/csharp/.template.config/localize/templatestrings.json.lcl b/Localize/loc/cs/dotnet/Templates/Microsoft.iOS.Templates/ios/csharp/.template.config/localize/templatestrings.json.lcl
new file mode 100644
index 0000000000..3215885075
--- /dev/null
+++ b/Localize/loc/cs/dotnet/Templates/Microsoft.iOS.Templates/ios/csharp/.template.config/localize/templatestrings.json.lcl
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+ -
+
+
-
+
+
-
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/cs/dotnet/Templates/Microsoft.iOS.Templates/ios/fsharp/.template.config/localize/templatestrings.json.lcl b/Localize/loc/cs/dotnet/Templates/Microsoft.iOS.Templates/ios/fsharp/.template.config/localize/templatestrings.json.lcl
new file mode 100644
index 0000000000..42140c1ba9
--- /dev/null
+++ b/Localize/loc/cs/dotnet/Templates/Microsoft.iOS.Templates/ios/fsharp/.template.config/localize/templatestrings.json.lcl
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+ -
+
+
-
+
+
-
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/de/dotnet/Templates/Microsoft.iOS.Templates/ios/csharp/.template.config/localize/templatestrings.json.lcl b/Localize/loc/de/dotnet/Templates/Microsoft.iOS.Templates/ios/csharp/.template.config/localize/templatestrings.json.lcl
new file mode 100644
index 0000000000..081899164f
--- /dev/null
+++ b/Localize/loc/de/dotnet/Templates/Microsoft.iOS.Templates/ios/csharp/.template.config/localize/templatestrings.json.lcl
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+ -
+
+
-
+
+
-
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/de/dotnet/Templates/Microsoft.iOS.Templates/ios/fsharp/.template.config/localize/templatestrings.json.lcl b/Localize/loc/de/dotnet/Templates/Microsoft.iOS.Templates/ios/fsharp/.template.config/localize/templatestrings.json.lcl
new file mode 100644
index 0000000000..b55adfa227
--- /dev/null
+++ b/Localize/loc/de/dotnet/Templates/Microsoft.iOS.Templates/ios/fsharp/.template.config/localize/templatestrings.json.lcl
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+ -
+
+
-
+
+
-
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/es/dotnet/Templates/Microsoft.iOS.Templates/ios/csharp/.template.config/localize/templatestrings.json.lcl b/Localize/loc/es/dotnet/Templates/Microsoft.iOS.Templates/ios/csharp/.template.config/localize/templatestrings.json.lcl
new file mode 100644
index 0000000000..a0c6486fa5
--- /dev/null
+++ b/Localize/loc/es/dotnet/Templates/Microsoft.iOS.Templates/ios/csharp/.template.config/localize/templatestrings.json.lcl
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+ -
+
+
-
+
+
-
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/es/dotnet/Templates/Microsoft.iOS.Templates/ios/fsharp/.template.config/localize/templatestrings.json.lcl b/Localize/loc/es/dotnet/Templates/Microsoft.iOS.Templates/ios/fsharp/.template.config/localize/templatestrings.json.lcl
new file mode 100644
index 0000000000..25badf1c14
--- /dev/null
+++ b/Localize/loc/es/dotnet/Templates/Microsoft.iOS.Templates/ios/fsharp/.template.config/localize/templatestrings.json.lcl
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+ -
+
+
-
+
+
-
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/fr/dotnet/Templates/Microsoft.iOS.Templates/ios/csharp/.template.config/localize/templatestrings.json.lcl b/Localize/loc/fr/dotnet/Templates/Microsoft.iOS.Templates/ios/csharp/.template.config/localize/templatestrings.json.lcl
new file mode 100644
index 0000000000..ad53bd30e3
--- /dev/null
+++ b/Localize/loc/fr/dotnet/Templates/Microsoft.iOS.Templates/ios/csharp/.template.config/localize/templatestrings.json.lcl
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+ -
+
+
-
+
+
-
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/fr/dotnet/Templates/Microsoft.iOS.Templates/ios/fsharp/.template.config/localize/templatestrings.json.lcl b/Localize/loc/fr/dotnet/Templates/Microsoft.iOS.Templates/ios/fsharp/.template.config/localize/templatestrings.json.lcl
new file mode 100644
index 0000000000..1f4f47b1d6
--- /dev/null
+++ b/Localize/loc/fr/dotnet/Templates/Microsoft.iOS.Templates/ios/fsharp/.template.config/localize/templatestrings.json.lcl
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+ -
+
+
-
+
+
-
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/it/dotnet/Templates/Microsoft.iOS.Templates/ios/csharp/.template.config/localize/templatestrings.json.lcl b/Localize/loc/it/dotnet/Templates/Microsoft.iOS.Templates/ios/csharp/.template.config/localize/templatestrings.json.lcl
new file mode 100644
index 0000000000..91b11ed76a
--- /dev/null
+++ b/Localize/loc/it/dotnet/Templates/Microsoft.iOS.Templates/ios/csharp/.template.config/localize/templatestrings.json.lcl
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+ -
+
+
-
+
+
-
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/it/dotnet/Templates/Microsoft.iOS.Templates/ios/fsharp/.template.config/localize/templatestrings.json.lcl b/Localize/loc/it/dotnet/Templates/Microsoft.iOS.Templates/ios/fsharp/.template.config/localize/templatestrings.json.lcl
new file mode 100644
index 0000000000..7dfa3fc178
--- /dev/null
+++ b/Localize/loc/it/dotnet/Templates/Microsoft.iOS.Templates/ios/fsharp/.template.config/localize/templatestrings.json.lcl
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+ -
+
+
-
+
+
-
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/ja/dotnet/Templates/Microsoft.iOS.Templates/ios/csharp/.template.config/localize/templatestrings.json.lcl b/Localize/loc/ja/dotnet/Templates/Microsoft.iOS.Templates/ios/csharp/.template.config/localize/templatestrings.json.lcl
new file mode 100644
index 0000000000..9ac5a0742a
--- /dev/null
+++ b/Localize/loc/ja/dotnet/Templates/Microsoft.iOS.Templates/ios/csharp/.template.config/localize/templatestrings.json.lcl
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+ -
+
+
-
+
+
-
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/ja/dotnet/Templates/Microsoft.iOS.Templates/ios/fsharp/.template.config/localize/templatestrings.json.lcl b/Localize/loc/ja/dotnet/Templates/Microsoft.iOS.Templates/ios/fsharp/.template.config/localize/templatestrings.json.lcl
new file mode 100644
index 0000000000..ba8d0b1081
--- /dev/null
+++ b/Localize/loc/ja/dotnet/Templates/Microsoft.iOS.Templates/ios/fsharp/.template.config/localize/templatestrings.json.lcl
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+ -
+
+
-
+
+
-
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/ko/dotnet/Templates/Microsoft.iOS.Templates/ios/csharp/.template.config/localize/templatestrings.json.lcl b/Localize/loc/ko/dotnet/Templates/Microsoft.iOS.Templates/ios/csharp/.template.config/localize/templatestrings.json.lcl
new file mode 100644
index 0000000000..5fc63f6d7a
--- /dev/null
+++ b/Localize/loc/ko/dotnet/Templates/Microsoft.iOS.Templates/ios/csharp/.template.config/localize/templatestrings.json.lcl
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+ -
+
+
-
+
+
-
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/ko/dotnet/Templates/Microsoft.iOS.Templates/ios/fsharp/.template.config/localize/templatestrings.json.lcl b/Localize/loc/ko/dotnet/Templates/Microsoft.iOS.Templates/ios/fsharp/.template.config/localize/templatestrings.json.lcl
new file mode 100644
index 0000000000..7ab158983f
--- /dev/null
+++ b/Localize/loc/ko/dotnet/Templates/Microsoft.iOS.Templates/ios/fsharp/.template.config/localize/templatestrings.json.lcl
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+ -
+
+
-
+
+
-
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/pl/dotnet/Templates/Microsoft.iOS.Templates/ios/csharp/.template.config/localize/templatestrings.json.lcl b/Localize/loc/pl/dotnet/Templates/Microsoft.iOS.Templates/ios/csharp/.template.config/localize/templatestrings.json.lcl
new file mode 100644
index 0000000000..0c68f0df46
--- /dev/null
+++ b/Localize/loc/pl/dotnet/Templates/Microsoft.iOS.Templates/ios/csharp/.template.config/localize/templatestrings.json.lcl
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+ -
+
+
-
+
+
-
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/pl/dotnet/Templates/Microsoft.iOS.Templates/ios/fsharp/.template.config/localize/templatestrings.json.lcl b/Localize/loc/pl/dotnet/Templates/Microsoft.iOS.Templates/ios/fsharp/.template.config/localize/templatestrings.json.lcl
new file mode 100644
index 0000000000..7c170f79b1
--- /dev/null
+++ b/Localize/loc/pl/dotnet/Templates/Microsoft.iOS.Templates/ios/fsharp/.template.config/localize/templatestrings.json.lcl
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+ -
+
+
-
+
+
-
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/pt-BR/dotnet/Templates/Microsoft.iOS.Templates/ios/csharp/.template.config/localize/templatestrings.json.lcl b/Localize/loc/pt-BR/dotnet/Templates/Microsoft.iOS.Templates/ios/csharp/.template.config/localize/templatestrings.json.lcl
new file mode 100644
index 0000000000..5e2b0616f6
--- /dev/null
+++ b/Localize/loc/pt-BR/dotnet/Templates/Microsoft.iOS.Templates/ios/csharp/.template.config/localize/templatestrings.json.lcl
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+ -
+
+
-
+
+
-
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/pt-BR/dotnet/Templates/Microsoft.iOS.Templates/ios/fsharp/.template.config/localize/templatestrings.json.lcl b/Localize/loc/pt-BR/dotnet/Templates/Microsoft.iOS.Templates/ios/fsharp/.template.config/localize/templatestrings.json.lcl
new file mode 100644
index 0000000000..d5a39daf4b
--- /dev/null
+++ b/Localize/loc/pt-BR/dotnet/Templates/Microsoft.iOS.Templates/ios/fsharp/.template.config/localize/templatestrings.json.lcl
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+ -
+
+
-
+
+
-
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/ru/dotnet/Templates/Microsoft.iOS.Templates/ios/csharp/.template.config/localize/templatestrings.json.lcl b/Localize/loc/ru/dotnet/Templates/Microsoft.iOS.Templates/ios/csharp/.template.config/localize/templatestrings.json.lcl
new file mode 100644
index 0000000000..d32131a85f
--- /dev/null
+++ b/Localize/loc/ru/dotnet/Templates/Microsoft.iOS.Templates/ios/csharp/.template.config/localize/templatestrings.json.lcl
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+ -
+
+
-
+
+
-
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/ru/dotnet/Templates/Microsoft.iOS.Templates/ios/fsharp/.template.config/localize/templatestrings.json.lcl b/Localize/loc/ru/dotnet/Templates/Microsoft.iOS.Templates/ios/fsharp/.template.config/localize/templatestrings.json.lcl
new file mode 100644
index 0000000000..39b67d8628
--- /dev/null
+++ b/Localize/loc/ru/dotnet/Templates/Microsoft.iOS.Templates/ios/fsharp/.template.config/localize/templatestrings.json.lcl
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+ -
+
+
-
+
+
-
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/tr/dotnet/Templates/Microsoft.iOS.Templates/ios/csharp/.template.config/localize/templatestrings.json.lcl b/Localize/loc/tr/dotnet/Templates/Microsoft.iOS.Templates/ios/csharp/.template.config/localize/templatestrings.json.lcl
new file mode 100644
index 0000000000..586f7a51ff
--- /dev/null
+++ b/Localize/loc/tr/dotnet/Templates/Microsoft.iOS.Templates/ios/csharp/.template.config/localize/templatestrings.json.lcl
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+ -
+
+
-
+
+
-
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/tr/dotnet/Templates/Microsoft.iOS.Templates/ios/fsharp/.template.config/localize/templatestrings.json.lcl b/Localize/loc/tr/dotnet/Templates/Microsoft.iOS.Templates/ios/fsharp/.template.config/localize/templatestrings.json.lcl
new file mode 100644
index 0000000000..5392194bc6
--- /dev/null
+++ b/Localize/loc/tr/dotnet/Templates/Microsoft.iOS.Templates/ios/fsharp/.template.config/localize/templatestrings.json.lcl
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+ -
+
+
-
+
+
-
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/zh-Hans/dotnet/Templates/Microsoft.iOS.Templates/ios/csharp/.template.config/localize/templatestrings.json.lcl b/Localize/loc/zh-Hans/dotnet/Templates/Microsoft.iOS.Templates/ios/csharp/.template.config/localize/templatestrings.json.lcl
new file mode 100644
index 0000000000..5f085aef3b
--- /dev/null
+++ b/Localize/loc/zh-Hans/dotnet/Templates/Microsoft.iOS.Templates/ios/csharp/.template.config/localize/templatestrings.json.lcl
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+ -
+
+
-
+
+
-
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/zh-Hans/dotnet/Templates/Microsoft.iOS.Templates/ios/fsharp/.template.config/localize/templatestrings.json.lcl b/Localize/loc/zh-Hans/dotnet/Templates/Microsoft.iOS.Templates/ios/fsharp/.template.config/localize/templatestrings.json.lcl
new file mode 100644
index 0000000000..a90bac6529
--- /dev/null
+++ b/Localize/loc/zh-Hans/dotnet/Templates/Microsoft.iOS.Templates/ios/fsharp/.template.config/localize/templatestrings.json.lcl
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+ -
+
+
-
+
+
-
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/zh-Hant/dotnet/Templates/Microsoft.iOS.Templates/ios/csharp/.template.config/localize/templatestrings.json.lcl b/Localize/loc/zh-Hant/dotnet/Templates/Microsoft.iOS.Templates/ios/csharp/.template.config/localize/templatestrings.json.lcl
new file mode 100644
index 0000000000..c23fbfa3ad
--- /dev/null
+++ b/Localize/loc/zh-Hant/dotnet/Templates/Microsoft.iOS.Templates/ios/csharp/.template.config/localize/templatestrings.json.lcl
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+ -
+
+
-
+
+
-
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Localize/loc/zh-Hant/dotnet/Templates/Microsoft.iOS.Templates/ios/fsharp/.template.config/localize/templatestrings.json.lcl b/Localize/loc/zh-Hant/dotnet/Templates/Microsoft.iOS.Templates/ios/fsharp/.template.config/localize/templatestrings.json.lcl
new file mode 100644
index 0000000000..b80576c389
--- /dev/null
+++ b/Localize/loc/zh-Hant/dotnet/Templates/Microsoft.iOS.Templates/ios/fsharp/.template.config/localize/templatestrings.json.lcl
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+ -
+
+
-
+
+
-
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/bug-repro.md b/docs/bug-repro.md
new file mode 100644
index 0000000000..ec0796b2a5
--- /dev/null
+++ b/docs/bug-repro.md
@@ -0,0 +1,159 @@
+# Bug Report Reproduction Guide
+
+First of all, thank you for reporting this potential bug. Nobody likes bugs
+and to help us diagnose and resolve your potential issue as effective and
+quickly as possible, we would like to give you a bit more information about
+why we ask you for a reproducible example of the problem, and how to provide
+one.
+
+## What is a reproduction?
+
+A reproduction, reproducible example or just repro for short is the most basic
+code to demonstrate the issue that you're seeing. It's the simplest way to
+reproduce the issue. Ideally, you should be able to reproduce the issue by
+just running the code in the project you have provided and see the problem. If
+any reproduction steps are needed, either note them in the issue or include
+them in the project somehow.
+
+## Why do we ask for a reproducible example?
+
+Depending on your project a codebase can be pretty big. The bigger your
+project, the more factors that can be of influence on a bug or issue that you
+might be seeing.
+
+In order to be sure that this is something that is happening in the Apple SDKs
+for .NET and not something in your code (or a combination of these things), it
+is super helpful to have a small sample that reproduces the issue. This way we
+can:
+
+* better pinpoint the source of the issue
+* therefore, we can fix the issue faster
+* and we can make sure that the issue is not a false positive
+
+It also acts as a double-edged sword. When you take your code apart
+piece-by-piece in a new project, adding things back one by one, it will become
+very clear what different factors are at play here and you might discover that
+the issue might be something in your code. At the very least you will be able
+to provide a very detailed description of what you're seeing. That helps us
+get to the cause faster and resolve the issue quicker.
+
+### I just want to report a bug, why do you want a reproduction?
+
+We hear this a lot. We understand you're busy, we're all busy! A reproduction
+is not just about pleasing us or you doing our work. As already mentioned
+above, it will help you get a better understanding of where the issue is
+exactly. We've seen lots of cases where people realized, through a
+reproduction, that the solution was right within their reach. Regardless of it
+being a bug in this .NET SDK or not.
+
+We like to see this as a team effort.
+
+#### But I don't have time for this!
+
+Please help us, help you! This is an open-source project under the MIT
+license. We care about our project and therefore by extension also about your
+project. But realize that when you come onto our repo, maybe frustrated
+because things are not working and you just drop a one-liner, no reproduction,
+mentioning that you don't have the time, that's also not very motivating for
+us. On the other end of these GitHub issues are still people. People that are
+doing their best to move this project forward, people that do not enjoying
+seeing you being blocked.
+
+Also consider how that comes across. If you don't have the time to report in
+detail what is going on, then really how important is the issue? If this is
+really important and blocking you, it would seem to make sense to prioritize
+getting us all the details to help resolve this faster. We are all here to
+help you. But remember that we don't know your project and we don't know any
+details, please help us understand and be nice.
+
+## How to provide a reproduction project?
+
+With a reproduction we want to rule out a couple of things:
+
+* The issue is not in your code, but in the iOS/tvOS/macOS/Mac Catalyst SDKs for .NET.
+* The issue has not been already resolved in the latest version of the SDK.
+
+Therefore we would like to propose the following steps to create a reproduction sample:
+
+* Check if you are using the latest version of the .NET workloads and you can
+ still reproduce the issue.
+* If yes, please check any available preview versions and see if you can
+ reproduce the issue.
+* If you still can, please check to see if there are is an issue already
+ opened on the repository for it:
+ * If there is, see if you can add any more detail about your specific case,
+ that might help to resolve it quicker. If you don't have any additional
+ information, add an emoji to the first post of the issue so we know how
+ many people are impacted by this.
+ * When in doubt, always file a new issue. It's much easier to mark an issue
+ as a duplicate of another, than it is to split an issue into two (or more)
+ isssues after an extensive conversation in the issue that effectively
+ derailed the original issue because it turned out to be something
+ unrelated.
+* If there is no issue for it yet, please open one and provide detailed
+ answers to everything in the New Issue form.
+
+At this point we would love for you to include the reproduction.
+
+* Start with a File > New .NET iOS / tvOS / macOS / Mac Catalyst project, in
+ other words, a clean, new project. Make sure that you are using the last
+ version of the .NET workloads.
+* Start extracting the code from your project, piece-by-piece, until you have
+ reached the issue.
+* Try to remove some code or make small changes to see how that influences the
+ issue you're seeing. Remove any code that is not needed to reproduce the
+ issue. This is noise and will interfere with getting to a cause and
+ solution.
+* Put the code on a GitHub repository and include that link in the issue that
+ you're opening.
+* Get a [binary build log][1] and attach that to the issue as well.
+
+> **Warning**
+>
+> **We can't accept any zip files attached to the issue.** If we need the code
+> in a zip, we can get that from the GitHub repository. This will also make it
+> easier to collaborate. If we think we spot something that doesn't look
+> right, we can open a PR on your repro repo (😬) and you can easily see the
+> differences.
+
+## Why can't you just download my zip file reproduction?!
+
+While we've never had problems with this, it is still a potential attack
+vector for hackers and other malicious people. Even unzipping a zip file could
+execute code, let alone load code into Visual Studio that we could not
+(easily) look at before opening it. Because we value your safety and privacy
+as well as our own, we want to make sure that none of this can happen.
+
+Also, by putting it in a GitHub repo it's easier to potentially collaborate.
+We (and our amazing community!) can comment on a piece of code right then and
+there and help you further. It can even serve as a nice example for other
+people!
+
+If you don't like to have a lot of repos, you could opt for a repo where on
+the `main` branch you put a File > New Project, and from there create branches
+for different issues.
+
+## Big don'ts!
+
+- Never put any sensitive information in your code. No API keys, credentials,
+ personal information, etc.
+- Never put any propriatary code in your reproduction. We are contractually
+ not allowed to look at code that you do not own without big legal hassles
+ and NDA's, that's not fun for anyone.
+- Never submit binaries (mostly covered by putting it on a GitHub repo)
+- Do not reference external data-sources, this should rarely be needed.
+- Always refer to concrete version numbers. Avoid saying "this happens in the
+ latest version". We don't know if you're using a preview version or maybe
+ you _think_ you're using the latest version but actually aren't. To avoid
+ any confusion, always refer to exact version numbers.
+
+# That's it!
+
+The first time might take you a bit longer to go through all this, but once
+you've done it you'll see it isn't that much more work and it will benefit the
+process a lot.
+
+Thank you so much for taking some of your valuable time to make .NET MAUI the
+best version it can be! We really appreciate it.
+
+[1]: https://github.com/xamarin/xamarin-macios/wiki/Diagnosis#binary-build-logs
diff --git a/dotnet/targets/Xamarin.Shared.Sdk.targets b/dotnet/targets/Xamarin.Shared.Sdk.targets
index 94b11f47af..ca379559a4 100644
--- a/dotnet/targets/Xamarin.Shared.Sdk.targets
+++ b/dotnet/targets/Xamarin.Shared.Sdk.targets
@@ -198,7 +198,6 @@
_CollectBundleResources;
_RunRidSpecificBuild;
- _CompileEntitlements;
_DetectAppManifest;
_ReadAppManifest;
_WriteAppManifest;
@@ -221,7 +220,6 @@
_CreatePkgInfo;
_SmeltMetal;
_TemperMetal;
- _CompileEntitlements;
_DetectAppManifest;
_ReadAppManifest;
_WriteAppManifest;
@@ -248,13 +246,13 @@
_CreateDebugSettings;
_CreateDebugConfiguration;
+ _CompileEntitlements;
$(CreateAppBundleDependsOn);
$(CreateAppBundleDependsOn);
- _CompileEntitlements;
_CreateMergedAppBundle;
_PostProcessAppBundle;
@@ -330,6 +328,7 @@
_ProcessedColladaAssetsPath=$(_ProcessedColladaAssetsPath);
_ProcessedTextureAtlasesPath=$(_ProcessedTextureAtlasesPath);
_ProcessedCoreMLModelsPath=$(_ProcessedCoreMLModelsPath);
+ _CompiledEntitlementsPath=$(_CompiledEntitlementsPath);
@@ -1579,7 +1578,7 @@
<_CreateDumpExecutableToSign Include="@(_CreateDumpExecutable -> '$(_DylibPublishDir)%(RelativePath)')" KeepMetadata="false">
$(_CodesignAllocate)
true
- $(IntermediateOutputPath)Entitlements.xcent
+ $(_CompiledEntitlementsPath)
$(CodesignExtraArgs)
$(CodesignKeychain)
$(_PreparedResourceRules)
diff --git a/msbuild/Xamarin.Mac.Tasks/Xamarin.Mac.Common.targets b/msbuild/Xamarin.Mac.Tasks/Xamarin.Mac.Common.targets
index b89871f6f5..86bdc40fef 100644
--- a/msbuild/Xamarin.Mac.Tasks/Xamarin.Mac.Common.targets
+++ b/msbuild/Xamarin.Mac.Tasks/Xamarin.Mac.Common.targets
@@ -27,7 +27,6 @@ Copyright (C) 2014 Xamarin. All rights reserved.
<_PreparedResourceRules>
- <_AppBundleName>$(AssemblyName)
diff --git a/msbuild/Xamarin.Shared/Xamarin.Shared.props b/msbuild/Xamarin.Shared/Xamarin.Shared.props
index e4bf312178..10f0530f89 100644
--- a/msbuild/Xamarin.Shared/Xamarin.Shared.props
+++ b/msbuild/Xamarin.Shared/Xamarin.Shared.props
@@ -307,6 +307,8 @@ Copyright (C) 2020 Microsoft. All rights reserved.
all
+
+ <_AppBundleName>$(AssemblyName)
diff --git a/msbuild/Xamarin.Shared/Xamarin.Shared.targets b/msbuild/Xamarin.Shared/Xamarin.Shared.targets
index 079b2e686f..b50f783288 100644
--- a/msbuild/Xamarin.Shared/Xamarin.Shared.targets
+++ b/msbuild/Xamarin.Shared/Xamarin.Shared.targets
@@ -164,8 +164,8 @@ Copyright (C) 2018 Microsoft. All rights reserved.
Outputs="$(BindingResourcePath).stamp">
@@ -644,7 +644,7 @@ Copyright (C) 2018 Microsoft. All rights reserved.
+ Outputs="$(_CompiledEntitlementsPath)">
@@ -658,7 +658,7 @@ Copyright (C) 2018 Microsoft. All rights reserved.
BundleIdentifier="$(_BundleIdentifier)"
CustomEntitlements="@(CustomEntitlements)"
Entitlements="$(CodesignEntitlements)"
- CompiledEntitlements="$(DeviceSpecificIntermediateOutputPath)Entitlements.xcent"
+ CompiledEntitlements="$(_CompiledEntitlementsPath)"
IsAppExtension="$(IsAppExtension)"
ProvisioningProfile="$(_ProvisioningProfile)"
SdkIsSimulator="$(_SdkIsSimulator)"
@@ -685,6 +685,10 @@ Copyright (C) 2018 Microsoft. All rights reserved.
+
+
+
+
@@ -1132,6 +1136,7 @@ Copyright (C) 2018 Microsoft. All rights reserved.
<_ProcessedColladaAssetsPath Condition="'$(_ProcessedColladaAssetsPath)' == ''">$(DeviceSpecificIntermediateOutputPath)collada\_ProcessedColladaAssetsPath.items
<_ProcessedTextureAtlasesPath Condition="'$(_ProcessedTextureAtlasesPath)' == ''">$(DeviceSpecificIntermediateOutputPath)atlas\_ProcessedTextureAtlasesPath.items
<_ProcessedCoreMLModelsPath Condition="'$(_ProcessedCoreMLModelsPath)' == ''">$(DeviceSpecificIntermediateOutputPath)coremlc\_ProcessedCoreMLModelsPath.items
+ <_CompiledEntitlementsPath Condition="'$(_CompiledEntitlementsPath)' == ''">$(DeviceSpecificIntermediateOutputPath)Entitlements.xcent
<_SaveProcessedItems Condition="'$(RuntimeIdentifiers)' != '' And '$(UsingAppleNETSdk)' == 'true'">true
diff --git a/msbuild/Xamarin.iOS.Tasks/Xamarin.iOS.Common.targets b/msbuild/Xamarin.iOS.Tasks/Xamarin.iOS.Common.targets
index af563fb3d8..abf710a05d 100644
--- a/msbuild/Xamarin.iOS.Tasks/Xamarin.iOS.Common.targets
+++ b/msbuild/Xamarin.iOS.Tasks/Xamarin.iOS.Common.targets
@@ -27,7 +27,6 @@ Copyright (C) 2013-2016 Xamarin. All rights reserved.
<_CanDeployToDeviceOrSimulator Condition="('$(OutputType)' == 'Exe' Or '$(IsAppExtension)' == 'true') And '$(IsWatchApp)' == 'false'">True
<_PreparedResourceRules>
- <_AppBundleName>$(AssemblyName)
diff --git a/runtime/runtime.m b/runtime/runtime.m
index e83c64b015..d063c23d5c 100644
--- a/runtime/runtime.m
+++ b/runtime/runtime.m
@@ -2830,6 +2830,16 @@ xamarin_locate_assembly_resource_for_root (const char *root, const char *culture
} else if (xamarin_file_exists (path)) {
return true;
}
+
+ if (culture != NULL && *culture != 0) {
+ // culture-specific directory
+ if (snprintf (path, pathlen, "%s/%s/.xamarin/%s/%s", root, culture, RUNTIMEIDENTIFIER, resource) < 0) {
+ LOG (PRODUCT ": Failed to construct path for assembly resource (root directory: '%s', culture: '%s', resource: '%s', runtimeidentifier: %s): %s", root, culture, resource, RUNTIMEIDENTIFIER, strerror (errno));
+ return false;
+ } else if (xamarin_file_exists (path)) {
+ return true;
+ }
+ }
#endif
// just the file, no extensions, etc.
diff --git a/src/AVFoundation/AVAudioPlayer.cs b/src/AVFoundation/AVAudioPlayer.cs
index c1111dfbea..c24c47f09f 100644
--- a/src/AVFoundation/AVAudioPlayer.cs
+++ b/src/AVFoundation/AVAudioPlayer.cs
@@ -23,8 +23,8 @@
//
using Foundation;
using ObjCRuntime;
-using AudioToolbox;
using System;
+using System.Runtime.InteropServices;
#nullable enable
@@ -32,58 +32,48 @@ namespace AVFoundation {
#if !WATCH
public partial class AVAudioPlayer {
+ [DllImport (Constants.ObjectiveCLibrary, EntryPoint = "objc_msgSend")]
+ unsafe static extern IntPtr objc_msgSend (IntPtr receiver, IntPtr selector, IntPtr arg1, IntPtr* arg2);
+
public static AVAudioPlayer? FromUrl (NSUrl url, out NSError? error)
{
+ error = null;
+ IntPtr url__handle__ = url!.GetNonNullHandle (nameof (url));
+ IntPtr handle = Messaging.IntPtr_objc_msgSend (class_ptr, Selector.GetHandle ("alloc"));
+ IntPtr errorptr = IntPtr.Zero;
+ if (handle == IntPtr.Zero)
+ return null;
unsafe {
- IntPtr errhandle;
- IntPtr ptrtohandle = (IntPtr) (&errhandle);
-
- var ap = new AVAudioPlayer (url, ptrtohandle);
- if (ap.Handle == IntPtr.Zero) {
- error = Runtime.GetNSObject (errhandle);
- return null;
- } else
- error = null;
- return ap;
+ handle = objc_msgSend (handle, Selector.GetHandle ("initWithContentsOfURL:error:"), url__handle__, &errorptr);
}
+ error = Runtime.GetNSObject (errorptr);
+ return Runtime.GetNSObject (handle, owns: true);
}
public static AVAudioPlayer? FromUrl (NSUrl url)
{
- unsafe {
- var ap = new AVAudioPlayer (url, IntPtr.Zero);
- if (ap.Handle == IntPtr.Zero)
- return null;
-
- return ap;
- }
+ return FromUrl (url, out _);
}
public static AVAudioPlayer? FromData (NSData data, out NSError? error)
{
- unsafe {
- IntPtr errhandle;
- IntPtr ptrtohandle = (IntPtr) (&errhandle);
+ error = null;
+ IntPtr data__handle__ = data!.GetNonNullHandle (nameof (data));
+ IntPtr errorptr = IntPtr.Zero;
+ IntPtr handle = Messaging.IntPtr_objc_msgSend (class_ptr, Selector.GetHandle ("alloc"));
- var ap = new AVAudioPlayer (data, ptrtohandle);
- if (ap.Handle == IntPtr.Zero) {
- error = Runtime.GetNSObject (errhandle);
- return null;
- } else
- error = null;
- return ap;
+ if (handle == IntPtr.Zero)
+ return null;
+ unsafe {
+ handle = objc_msgSend (handle, Selector.GetHandle ("initWithData:error:"), data__handle__, &errorptr);
}
+ error = Runtime.GetNSObject (errorptr);
+ return Runtime.GetNSObject (handle, owns: true);
}
public static AVAudioPlayer? FromData (NSData data)
{
- unsafe {
- var ap = new AVAudioPlayer (data, IntPtr.Zero);
- if (ap.Handle == IntPtr.Zero)
- return null;
-
- return ap;
- }
+ return FromData (data, out _);
}
}
#endif // !WATCH
diff --git a/src/AVFoundation/Events.cs b/src/AVFoundation/Events.cs
index 4804cb674d..0b1f85719f 100644
--- a/src/AVFoundation/Events.cs
+++ b/src/AVFoundation/Events.cs
@@ -361,11 +361,12 @@ namespace AVFoundation {
}
#if NET
- [SupportedOSPlatform ("macos11.0")]
+ [UnsupportedOSPlatform ("macos")]
[SupportedOSPlatform ("ios")]
[SupportedOSPlatform ("maccatalyst")]
- [SupportedOSPlatform ("tvos")]
+ [UnsupportedOSPlatform ("tvos")]
[ObsoletedOSPlatform ("ios6.0", "Use 'AVAudioSession.Notification.ObserveInterruption' instead.")]
+ [ObsoletedOSPlatform ("maccatalyst13.1", "Use 'AVAudioSession.Notification.ObserveInterruption' instead.")]
#else
[Deprecated (PlatformName.iOS, 6, 0, message: "Use 'AVAudioSession.Notification.ObserveInterruption' instead.")]
#endif
@@ -380,11 +381,12 @@ namespace AVFoundation {
}
#if NET
- [SupportedOSPlatform ("macos11.0")]
+ [UnsupportedOSPlatform ("macos")]
[SupportedOSPlatform ("ios")]
[SupportedOSPlatform ("maccatalyst")]
- [SupportedOSPlatform ("tvos")]
+ [UnsupportedOSPlatform ("tvos")]
[ObsoletedOSPlatform ("ios6.0", "Use 'AVAudioSession.Notification.ObserveInterruption' instead.")]
+ [ObsoletedOSPlatform ("maccatalyst13.1", "Use 'AVAudioSession.Notification.ObserveInterruption' instead.")]
#else
[Deprecated (PlatformName.iOS, 6, 0, message: "Use 'AVAudioSession.Notification.ObserveInterruption' instead.")]
#endif
@@ -399,11 +401,12 @@ namespace AVFoundation {
}
#if NET
- [SupportedOSPlatform ("macos11.0")]
+ [UnsupportedOSPlatform ("macos")]
[SupportedOSPlatform ("ios")]
[SupportedOSPlatform ("maccatalyst")]
- [SupportedOSPlatform ("tvos")]
+ [UnsupportedOSPlatform ("tvos")]
[ObsoletedOSPlatform ("ios6.0", "Use 'AVAudioSession.Notification.ObserveAudioRouteChange' instead.")]
+ [ObsoletedOSPlatform ("maccatalyst13.1", "Use 'AVAudioSession.Notification.ObserveAudioRouteChange' instead.")]
#else
[Deprecated (PlatformName.iOS, 6, 0, message: "Use 'AVAudioSession.Notification.ObserveAudioRouteChange' instead.")]
#endif
@@ -418,11 +421,12 @@ namespace AVFoundation {
}
#if NET
- [SupportedOSPlatform ("macos11.0")]
+ [UnsupportedOSPlatform ("macos")]
[SupportedOSPlatform ("ios")]
[SupportedOSPlatform ("maccatalyst")]
- [SupportedOSPlatform ("tvos")]
+ [UnsupportedOSPlatform ("tvos")]
[ObsoletedOSPlatform ("ios6.0", "Use 'AVAudioSession.Notification.ObserveAudioRouteChange' instead.")]
+ [ObsoletedOSPlatform ("maccatalyst13.1", "Use 'AVAudioSession.Notification.ObserveAudioRouteChange' instead.")]
#else
[Deprecated (PlatformName.iOS, 6, 0, message: "Use 'AVAudioSession.Notification.ObserveAudioRouteChange' instead.")]
#endif
@@ -437,11 +441,12 @@ namespace AVFoundation {
}
#if NET
- [SupportedOSPlatform ("macos11.0")]
+ [UnsupportedOSPlatform ("macos")]
[SupportedOSPlatform ("ios")]
[SupportedOSPlatform ("maccatalyst")]
- [SupportedOSPlatform ("tvos")]
+ [UnsupportedOSPlatform ("tvos")]
[ObsoletedOSPlatform ("ios6.0", "Use 'AVAudioSession.Notification.ObserveAudioRouteChange' instead.")]
+ [ObsoletedOSPlatform ("maccatalyst13.1", "Use 'AVAudioSession.Notification.ObserveAudioRouteChange' instead.")]
#else
[Deprecated (PlatformName.iOS, 6, 0, message: "Use 'AVAudioSession.Notification.ObserveAudioRouteChange' instead.")]
#endif
@@ -457,11 +462,12 @@ namespace AVFoundation {
}
#if NET
- [SupportedOSPlatform ("macos11.0")]
+ [UnsupportedOSPlatform ("macos")]
[SupportedOSPlatform ("ios")]
[SupportedOSPlatform ("maccatalyst")]
- [SupportedOSPlatform ("tvos")]
+ [UnsupportedOSPlatform ("tvos")]
[ObsoletedOSPlatform ("ios6.0", "Use 'AVAudioSession.Notification.ObserveAudioRouteChange' instead.")]
+ [ObsoletedOSPlatform ("maccatalyst13.1", "Use 'AVAudioSession.Notification.ObserveAudioRouteChange' instead.")]
#else
[Deprecated (PlatformName.iOS, 6, 0, message: "Use 'AVAudioSession.Notification.ObserveAudioRouteChange' instead.")]
#endif
@@ -477,11 +483,12 @@ namespace AVFoundation {
}
#if NET
- [SupportedOSPlatform ("macos11.0")]
+ [UnsupportedOSPlatform ("macos")]
[SupportedOSPlatform ("ios")]
[SupportedOSPlatform ("maccatalyst")]
- [SupportedOSPlatform ("tvos")]
+ [UnsupportedOSPlatform ("tvos")]
[ObsoletedOSPlatform ("ios6.0", "Use 'AVAudioSession.Notification.ObserveAudioRouteChange' instead.")]
+ [ObsoletedOSPlatform ("maccatalyst13.1", "Use 'AVAudioSession.Notification.ObserveAudioRouteChange' instead.")]
#else
[Deprecated (PlatformName.iOS, 6, 0, message: "Use 'AVAudioSession.Notification.ObserveAudioRouteChange' instead.")]
#endif
diff --git a/src/AddressBookUI/.gitignore b/src/AddressBookUI/.gitignore
deleted file mode 100644
index 94053bc9bd..0000000000
--- a/src/AddressBookUI/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/*.g.cs
diff --git a/src/AppKit/.gitignore b/src/AppKit/.gitignore
deleted file mode 100644
index bd99fb0524..0000000000
--- a/src/AppKit/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-*.g.cs
diff --git a/src/AppKit/NSWindow.cs b/src/AppKit/NSWindow.cs
index 71604a914f..d9be1d2406 100644
--- a/src/AppKit/NSWindow.cs
+++ b/src/AppKit/NSWindow.cs
@@ -59,6 +59,7 @@ namespace AppKit {
}
}
+#if !NET
static IntPtr selInitWithWindowRef = Selector.GetHandle ("initWithWindowRef:");
// Do not actually export because NSObjectFlag is not exportable.
@@ -74,10 +75,15 @@ namespace AppKit {
}
InitializeReleasedWhenClosed ();
}
+#endif
static public NSWindow FromWindowRef (IntPtr windowRef)
{
+#if NET
+ return new NSWindow (windowRef);
+#else
return new NSWindow (windowRef, NSObjectFlag.Empty);
+#endif
}
void InitializeReleasedWhenClosed ()
diff --git a/src/AudioUnit/AUEnums.cs b/src/AudioUnit/AUEnums.cs
index 8011ee073f..62584f384e 100644
--- a/src/AudioUnit/AUEnums.cs
+++ b/src/AudioUnit/AUEnums.cs
@@ -172,7 +172,11 @@ namespace AudioUnit {
System = 0,
}
-#if !XAMCORE_3_0 || MONOMAC || __MACCATALYST__
+ [MacCatalyst (13, 1)]
+ [NoTV, NoWatch]
+#if NET
+ [NoiOS]
+#endif
public enum AudioObjectPropertySelector : uint {
PropertyDevices = 1684370979, // 'dev#'
Devices = 1684370979, // 'dev#'
@@ -189,20 +193,16 @@ namespace AudioUnit {
TranslateUIDToBox = 1969841250, // 'uidb'
ClockDeviceList = 1668049699, //'clk#'
TranslateUidToClockDevice = 1969841251, // 'uidc',
-#if XAMCORE_3_0
- [NoiOS][NoTV]
-#endif
+#if !XAMCORE_5_0
[MacCatalyst (13, 1)] // This is required for .NET, because otherwise the generator thinks it's not available because it's not available on iOS.
[Deprecated (PlatformName.iOS, 15, 0, message: "Use the 'ProcessIsMain' element instead.")]
+ [Deprecated (PlatformName.TvOS, 15, 0, message: "Use the 'ProcessIsMain' element instead.")]
[Deprecated (PlatformName.MacCatalyst, 15, 0, message: "Use the 'ProcessIsMain' element instead.")]
[Deprecated (PlatformName.MacOSX, 12, 0, message: "Use the 'ProcessIsMain' element instead.")]
[Obsolete ("Use the 'ProcessIsMain' element instead.")]
ProcessIsMaster = 1835103092, // 'mast'
-#if !XAMCORE_3_0
- [iOS (15, 0)]
-#else
+#endif // !XAMCORE_5_0
[NoiOS]
-#endif
[MacCatalyst (15, 0), Mac (12, 0), NoTV, NoWatch]
ProcessIsMain = 1835100526, // 'main'
IsInitingOrExiting = 1768845172, // 'inot'
@@ -217,15 +217,16 @@ namespace AudioUnit {
ActualSampleRate = 1634955892,// 'asrt',
ClockDevice = 1634755428, // 'apcd',
IOThreadOSWorkgroup = 1869838183, // 'oswg'
-#if !XAMCORE_3_0
- [iOS (15, 0)]
-#else
[NoiOS]
-#endif
[MacCatalyst (15, 0), Mac (12, 0), NoTV, NoWatch]
ProcessMute = 1634758765, // 'appm'
}
+ [MacCatalyst (13, 1)]
+ [NoTV, NoWatch]
+#if NET
+ [NoiOS]
+#endif
public enum AudioObjectPropertyScope : uint {
Global = 1735159650, // 'glob'
Input = 1768845428, // 'inpt'
@@ -233,6 +234,11 @@ namespace AudioUnit {
PlayThrough = 1886679669, // 'ptru'
}
+ [MacCatalyst (13, 1)]
+ [NoTV, NoWatch]
+#if NET
+ [NoiOS]
+#endif
public enum AudioObjectPropertyElement : uint {
#if !NET
[Obsolete ("Use the 'Main' element instead.")]
@@ -240,7 +246,6 @@ namespace AudioUnit {
#endif
Main = 0, // 0
}
-#endif // !XAMCORE_3_0 || MONOMAC
#if XAMCORE_3_0
[Internal]
@@ -565,8 +570,11 @@ namespace AudioUnit {
AULowShelfCutoffFrequency = 0,
AULowShelfGain = 1,
+#if !XAMCORE_5_0 // I can't find this value in the headers anymore
[Obsoleted (PlatformName.iOS, 7, 0)]
+ [Obsoleted (PlatformName.MacCatalyst, 13, 1)]
AUDCFilterDecayTime = 0,
+#endif
// AUParametricEQ
ParametricEQCenterFreq = 0,
diff --git a/src/AudioUnit/AudioComponent.cs b/src/AudioUnit/AudioComponent.cs
index 572e46fc8a..12d8128f9f 100644
--- a/src/AudioUnit/AudioComponent.cs
+++ b/src/AudioUnit/AudioComponent.cs
@@ -460,9 +460,9 @@ namespace AudioUnit {
// extern NSImage * __nullable AudioComponentGetIcon (AudioComponent __nonnull comp) __attribute__((availability(macosx, introduced=10.11)));
#if NET
[SupportedOSPlatform ("macos")]
- [SupportedOSPlatform ("ios")]
- [SupportedOSPlatform ("maccatalyst")]
- [SupportedOSPlatform ("tvos")]
+ [UnsupportedOSPlatform ("ios")]
+ [UnsupportedOSPlatform ("maccatalyst")]
+ [UnsupportedOSPlatform ("tvos")]
[ObsoletedOSPlatform ("macos11.0")]
#else
[Mac (10,11)]
@@ -473,10 +473,10 @@ namespace AudioUnit {
#if NET
[SupportedOSPlatform ("macos")]
- [SupportedOSPlatform ("ios")]
- [SupportedOSPlatform ("maccatalyst")]
- [SupportedOSPlatform ("tvos")]
- [ObsoletedOSPlatform ("macos11.0")]
+ [UnsupportedOSPlatform ("ios")]
+ [UnsupportedOSPlatform ("maccatalyst")]
+ [UnsupportedOSPlatform ("tvos")]
+ [UnsupportedOSPlatform ("macos")]
#else
[Mac (10,11)]
[Deprecated (PlatformName.MacOSX, 11, 0)]
diff --git a/src/BackgroundTasks/Enums.cs b/src/BackgroundTasks/Enums.cs
index ed9ac62cd1..16b8d49b90 100644
--- a/src/BackgroundTasks/Enums.cs
+++ b/src/BackgroundTasks/Enums.cs
@@ -10,6 +10,8 @@ using System;
using Foundation;
using ObjCRuntime;
+#nullable enable
+
namespace BackgroundTasks {
[TV (13, 0), NoWatch, NoMac, iOS (13, 0)]
diff --git a/src/BusinessChat/Enums.cs b/src/BusinessChat/Enums.cs
index 178df62ed1..69c0403d3b 100644
--- a/src/BusinessChat/Enums.cs
+++ b/src/BusinessChat/Enums.cs
@@ -1,6 +1,8 @@
using ObjCRuntime;
using Foundation;
+#nullable enable
+
namespace BusinessChat {
[Mac (10, 13, 4), iOS (11, 3)]
diff --git a/src/CFNetwork/CFHTTPMessage.cs b/src/CFNetwork/CFHTTPMessage.cs
index 4154932066..b0bf3a5326 100644
--- a/src/CFNetwork/CFHTTPMessage.cs
+++ b/src/CFNetwork/CFHTTPMessage.cs
@@ -257,7 +257,7 @@ namespace CoreServices {
/* CFHTTPAuthenticationRef */ IntPtr auth, /* CFString */ IntPtr username, /* CFString */ IntPtr password,
/* CFStreamError* */ out CFStreamError error);
- public void ApplyCredentials (CFHTTPAuthentication auth, NetworkCredential credential)
+ public void ApplyCredentials (CFHTTPAuthentication? auth, NetworkCredential credential)
{
if (auth is null)
ObjCRuntime.ThrowHelper.ThrowArgumentNullException (nameof (auth));
diff --git a/src/CFNetwork/Content.cs b/src/CFNetwork/Content.cs
index 1ad7798d65..8c98ef2108 100644
--- a/src/CFNetwork/Content.cs
+++ b/src/CFNetwork/Content.cs
@@ -37,6 +37,8 @@ using System.Net.Http.Headers;
using System.Threading.Tasks;
using Foundation;
+#nullable enable
+
namespace CFNetwork {
class Content : StreamContent {
@@ -61,9 +63,7 @@ namespace CFNetwork {
protected override void Dispose (bool disposing)
{
if (disposing) {
- if (responseStream != null)
- responseStream.Dispose ();
- responseStream = null;
+ responseStream.Dispose ();
}
}
diff --git a/src/CFNetwork/MessageHandler.cs b/src/CFNetwork/MessageHandler.cs
index 2e26aca665..afaebc9ae0 100644
--- a/src/CFNetwork/MessageHandler.cs
+++ b/src/CFNetwork/MessageHandler.cs
@@ -41,6 +41,8 @@ using CoreFoundation;
using CoreServices;
using Foundation;
+#nullable enable
+
namespace CFNetwork {
[Obsolete ("Use 'System.Net.Http.CFNetworkHandler' or the more recent 'Foundation.NSUrlSessionHandler' instead.")]
@@ -54,7 +56,7 @@ namespace CFNetwork {
WorkerThread = worker;
}
- public WorkerThread WorkerThread {
+ public WorkerThread? WorkerThread {
get;
private set;
}
@@ -77,7 +79,7 @@ namespace CFNetwork {
* request.
*
*/
- CFHTTPAuthentication auth;
+ CFHTTPAuthentication? auth;
#region implemented abstract members of HttpMessageHandler
#if MONOMAC && !NET
@@ -121,15 +123,15 @@ namespace CFNetwork {
void SetupRequest (HttpRequestMessage request, CFHTTPMessage message, bool isFirstRequest)
{
- string accept_encoding = null;
+ string? accept_encoding = null;
if ((AutomaticDecompression & DecompressionMethods.GZip) != 0)
accept_encoding = "gzip";
if ((AutomaticDecompression & DecompressionMethods.Deflate) != 0)
- accept_encoding = accept_encoding != null ? "gzip, deflate" : "deflate";
- if (accept_encoding != null)
+ accept_encoding = accept_encoding is not null ? "gzip, deflate" : "deflate";
+ if (accept_encoding is not null)
message.SetHeaderFieldValue ("Accept-Encoding", accept_encoding);
- if (request.Content != null) {
+ if (request.Content is not null) {
foreach (var header in request.Content.Headers) {
if (!isFirstRequest && header.Key == "Authorization")
continue;
@@ -139,23 +141,23 @@ namespace CFNetwork {
}
foreach (var header in request.Headers) {
- if ((accept_encoding != null) && header.Key.Equals ("Accept-Encoding"))
+ if ((accept_encoding is not null) && header.Key.Equals ("Accept-Encoding"))
continue;
var value = string.Join (",", header.Value);
message.SetHeaderFieldValue (header.Key, value);
}
- if (UseCookies && (CookieContainer != null)) {
+ if (UseCookies && (CookieContainer is not null)) {
string cookieHeader = CookieContainer.GetCookieHeader (request.RequestUri);
if (cookieHeader != "")
message.SetHeaderFieldValue ("Cookie", cookieHeader);
}
}
- async Task CreateBody (HttpRequestMessage request, CFHTTPMessage message,
+ async Task CreateBody (HttpRequestMessage request, CFHTTPMessage message,
CancellationToken cancellationToken)
{
- if (request.Content == null)
+ if (request.Content is null)
return null;
/*
@@ -174,7 +176,7 @@ namespace CFNetwork {
*
*/
var length = request.Content.Headers.ContentLength;
- if ((request.Content is StreamContent) || (length == null)) {
+ if ((request.Content is StreamContent) || (length is null)) {
var stream = await request.Content.ReadAsStreamAsync ().ConfigureAwait (false);
return new WebRequestStream (stream, cancellationToken);
}
@@ -210,31 +212,33 @@ namespace CFNetwork {
async Task ProcessRequest (HttpRequestMessage request,
CFHTTPMessage message,
- WebRequestStream body,
+ WebRequestStream? body,
bool retryWithCredentials,
CancellationToken cancellationToken, bool isFirstRequest)
{
cancellationToken.ThrowIfCancellationRequested ();
- WebResponseStream stream;
- if (body != null)
+ WebResponseStream? stream;
+ if (body is not null)
stream = WebResponseStream.Create (message, body);
else
stream = WebResponseStream.Create (message);
- if (stream == null)
+ if (stream is null)
throw new HttpRequestException (string.Format (
"Failed to create web request for '{0}'.",
request.RequestUri)
);
- if (!isFirstRequest)
- stream.Stream.ShouldAutoredirect = AllowAutoRedirect;
- stream.Stream.AttemptPersistentConnection = GetKeepAlive (request);
+ if (stream.Stream is not null) {
+ if (!isFirstRequest)
+ stream.Stream.ShouldAutoredirect = AllowAutoRedirect;
+ stream.Stream.AttemptPersistentConnection = GetKeepAlive (request);
+ }
var response = await stream.Open (
- WorkerThread, cancellationToken).ConfigureAwait (true); // with false, we will have a deadlock.
+ WorkerThread!, cancellationToken).ConfigureAwait (true); // with false, we will have a deadlock.
- var status = (HttpStatusCode) response.ResponseStatusCode;
+ var status = (HttpStatusCode) response!.ResponseStatusCode;
if (IsRedirect (status)) {
request.Headers.Authorization = null;
@@ -247,7 +251,7 @@ namespace CFNetwork {
}
}
- if (retryWithCredentials && (body == null) &&
+ if (retryWithCredentials && (body is null) &&
(status == HttpStatusCode.Unauthorized) ||
(status == HttpStatusCode.ProxyAuthenticationRequired)) {
if (HandleAuthentication (request.RequestUri, message, response)) {
@@ -274,7 +278,7 @@ namespace CFNetwork {
return retval;
}
- string GetReasonPhrase (CFHTTPMessage response)
+ string? GetReasonPhrase (CFHTTPMessage response)
{
var line = response.ResponseStatusLine;
var match = Regex.Match (line, "HTTP/1.(0|1) (\\d+) (.*)");
@@ -286,7 +290,7 @@ namespace CFNetwork {
bool HandleAuthentication (Uri uri, CFHTTPMessage request, CFHTTPMessage response)
{
- if (Credentials == null)
+ if (Credentials is null)
return false;
if (PreAuthenticate) {
@@ -298,10 +302,10 @@ namespace CFNetwork {
var digest = Credentials.GetCredential (uri, "Digest");
bool ok = false;
- if ((basic != null) && (digest == null))
+ if ((basic is not null) && (digest is null))
ok = HandleAuthentication (
request, response, CFHTTPMessage.AuthenticationScheme.Basic, basic);
- if ((digest != null) && (basic == null))
+ if ((digest is not null) && (basic is null))
ok = HandleAuthentication (
request, response, CFHTTPMessage.AuthenticationScheme.Digest, digest);
if (ok)
@@ -313,9 +317,9 @@ namespace CFNetwork {
bool HandlePreAuthentication (Uri uri, CFHTTPMessage message)
{
- var method = auth.GetMethod ();
+ var method = auth?.GetMethod ();
var credential = Credentials.GetCredential (uri, method);
- if (credential == null)
+ if (credential is null)
return false;
message.ApplyCredentials (auth, credential);
@@ -335,16 +339,16 @@ namespace CFNetwork {
void FindAuthenticationObject (CFHTTPMessage response)
{
- if (auth != null) {
+ if (auth is not null) {
if (auth.IsValid)
return;
auth.Dispose ();
auth = null;
}
- if (auth == null) {
+ if (auth is null) {
auth = CFHTTPAuthentication.CreateFromResponse (response);
- if (auth == null)
+ if (auth is null)
throw new HttpRequestException ("Failed to create CFHTTPAuthentication");
}
@@ -354,10 +358,11 @@ namespace CFNetwork {
void DecodeHeaders (CFHTTPMessage message, HttpResponseMessage response, Content content)
{
- using (var dict = message.GetAllHeaderFields ()) {
- foreach (var entry in dict) {
- DecodeHeader (response, content, entry);
- }
+ using var dict = message.GetAllHeaderFields ();
+ if (dict is null)
+ return;
+ foreach (var entry in dict) {
+ DecodeHeader (response, content, entry);
}
}
@@ -388,7 +393,7 @@ namespace CFNetwork {
protected override void Dispose (bool disposing)
{
if (disposing) {
- if (auth != null) {
+ if (auth is not null) {
auth.Dispose ();
auth = null;
}
diff --git a/src/CFNetwork/WebRequestStream.cs b/src/CFNetwork/WebRequestStream.cs
index 219f2247e2..8bc16ba0d2 100644
--- a/src/CFNetwork/WebRequestStream.cs
+++ b/src/CFNetwork/WebRequestStream.cs
@@ -37,13 +37,15 @@ using CoreFoundation;
using CoreServices;
using Foundation;
+#nullable enable
+
namespace CFNetwork {
class WebRequestStream {
Stream stream;
CFReadStream readStream;
CFWriteStream writeStream;
- TaskCompletionSource